PE(x86)构建中stdio.h等头文件对应函数的DLL查询
关于x86 PE中C标准库函数对应DLL的解答
你猜的完全没错!大部分你提到的函数和printf一样,都位于msvcrt.dll(Microsoft C Runtime Library)中,这是Windows系统里承载C标准库实现的核心DLL之一。下面逐个确认你关心的函数:
- scanf: 绝对和
printf同属msvcrt.dll,作为标准C输入函数,它是MSVC运行时库的核心组件,和printf属于同一套输入输出模块。 - strtok: 字符串分割函数,属于标准字符串处理函数集,同样在
msvcrt.dll中导出。 - strcmp: 字符串比较函数,也是
msvcrt.dll的标准成员,和其他字符串操作函数放在一起。 - strcat: 字符串拼接函数,毫无意外也在
msvcrt.dll里,属于C标准库的字符串操作家族。 - itoa: 这里要特别提一下——它不是C标准定义的函数(标准里推荐用
sprintf/snprintf实现整数转字符串),但在Windows x86环境中,它通常也由msvcrt.dll提供。如果极端情况下找不到,可以检查kernel32.dll,不过绝大多数场景下msvcrt.dll就有它的导出。
验证小技巧
如果你想自己确认这些函数的导出情况,可以用Windows自带的dumpbin工具(属于Visual Studio工具链),针对x86版本的msvcrt.dll执行命令:
dumpbin /exports C:\Windows\SysWOW64\msvcrt.dll | findstr /i "scanf strtok strcmp itoa strcat"
(注:x86的系统DLL在64位Windows里存放在SysWOW64目录,32位系统直接用System32即可)
对你的汇编代码的小提示
既然你已经拿到了msvcrt.dll的模块句柄(存在ebx里),后续调用这些函数的逻辑和你处理printf完全一致:只需要把函数名的ASCII字符串按小端序拆成32位双字压栈(注意末尾补null),然后调用GetProcAddress就行。比如以strcat为例,你可以这样压栈:
push 0x00007461 ; 对应 '\0\0ta'(逆序后是 'at\0\0') push 0x63727473 ; 对应 'crts'(逆序后是 'strc') push esp ; 指向拼接后的 "strcat\0\0" 字符串 push ebx ; msvcrt.dll 的模块句柄 call eax ; 调用 GetProcAddress 获取 strcat 的地址
内容的提问来源于stack exchange,提问作者user9542033
相关产品推荐
相关产品推荐

