如何用nm工具从编译后的EXE中提取函数名(含NtRaiseHardError)
能否用nm工具从EXE中提取NtRaiseHardError函数名?
结论是取决于EXE的编译链接配置和符号表保留情况:
- 如果编译时未剥离符号(比如Debug编译,或Release编译未启用符号剔除选项),且nm支持PE格式(Windows EXE的格式),就能提取到该函数名;
- 如果是Release编译且已剥离符号,或者函数是动态链接的外部符号且符号表被优化掉,就无法通过nm获取。
具体操作方法
准备支持PE格式的nm工具:Windows原生没有nm,需要使用GNU binutils套件中的nm(比如MinGW、WSL中的binutils,或Git Bash自带的版本)。
基础提取命令:
- 针对32位EXE:
nm --target=pe-i386 your_program.exe - 针对64位EXE:
nm --target=pe-x86-64 your_program.exe
若nm能自动识别PE格式,可简化为:nm your_program.exe
- 针对32位EXE:
精准过滤目标函数:
直接过滤NtRaiseHardError,避免输出大量无关符号:nm your_program.exe | grep NtRaiseHardError
不同场景的输出说明
- 若函数为静态链接且符号保留,输出会类似:
00000000 T NtRaiseHardError(T表示该函数位于代码段,是已定义的符号)。 - 若函数为动态链接(从ntdll.dll导入),输出会类似:
U NtRaiseHardError(U表示该符号未在当前EXE中定义,是外部引用的导入函数)。 - 若符号已被剥离,上述grep命令将无输出,此时nm整体输出也会几乎没有可识别的函数符号。
内容的提问来源于stack exchange,提问作者user19815545
相关产品推荐
相关产品推荐

