程序底层查看工具之dumpbin

说惯了面向硬件的操作系统,也应该说说操作系统的主要使用对象–用户程序。要深入理解程序的运作过程,则需要了解编译原理、链接、装载和运行库等知识。一般都是IDE封装了这些过程,一个简单的Shift+F5指令封装了“预编译+编译+汇编+链接+装载”全过程,而要想分割独立地控制或挖掘这些子过程,则不得不借助一些工具,如预编译编译程序cl、汇编器as、链接器link、查看工具dumpbin(针对Windows PE文件结构)、binutils工具套件(配合gcc针对ELF文件结构)等。

对于dumpbin,其主要功能是查看.lib.dll.exe等文件或库中包含了那些函数或其他相关的符号信息
这里写图片描述

Fig.1 dumpbin参数选项

C:> dumpbin
usage: DUMPBIN [options] [files] dumpbin使用方式:dumpbin 选项参数 文件名。

dumpbin选项指令详解 
选项备注
/ALL 显示出代码反汇编外的所有信息,配合/DISASM可显示反汇编,配合/RAWDATA:NONE可以省略文件中的二进制详细信息(推荐)
/ARCHIVEMEMBERS 显示有关库成员对象的最少信息(Summary)
/CLRHEADER CLRHEADER 显示有关在任何托管程序中使用的 .NET 头的信息。输出显示 .NET 头及其中各节的位置和大小(以字节计)
/DEPENDENTS 显示该模块依赖的DLL名称
/DIRECTIVES 显示.obj文件中编译器为后续链接产生DLL准备的.directive段导出符号信息,用于后续产生导出表
/DISASM 显示代码段的反汇编结果
/EXPORTS 显示该模块导出的符号信息,一般通过_declspec(dllexport)修饰函数或者编写.def模块脚本统一地控制DLL导出符号**【1】**
/IMPORTS 显示该模块依赖的DLL列表以及各DLL导入的函数符号集合 (序号ordinal+函数符号名)**【2】**
/HEADERS 显示模块的文件头(FILE HEADER和OPTIONAL HEADER)和各段的属性(name\size\address\flags等)
/FPO 显示模块框架指针优化FPO记录
/LINENUMBERS 显示COFF行号,如果对象文件是用程序数据库 (/Zi)、C7 兼容 (/Z7) 或仅限行号 (/Zd) 编译的,则它包含行号。如果可执行文件或 DLL 是与生成调试信息 (/DEBUG) 链接的,则它包含 COFF 行号。
/LINKERMEMBER[:{1|2}] 显示库中定义的公共符号。指定参数 1 将按对象顺序显示符号及其偏移量。指定参数 2 将显示对象的偏移量和索引号,然后按字母顺序列出这些符号及每个符号的对象索引。若要两个输出都获得,指定不带数字参数的 /LINKERMEMBER。
/LOADCONFIG 显示模块的 IMAGE_LOAD_CONFIG_DIRECTORY结构
/OUT:filename 显示本次dumpbin命令的结果输出文件名**【3】**,默认情况下,信息将显示到stdout
/PDBPATH[:VERBOSE]filename filename为要为其查找匹配.pdb文件的.dll或.exe文件名。VERBOSE(可选)为报告曾尝试在其中定位.pdb文件的所有目录。/PDBPATH将沿调试器搜索.pdb文件的同一路径搜索计算机,并将报告那些.pdb文件(若有)和filename中指定的文件相对应
/RAWDATA[:{1|2|4|8|NONE}[,number]] 此选项显示文件中每节的原始内容。参数说明:1,默认值,内容以十六进制单字节显示,如果内容具有打印的表示形式,则还显示为ASCII字符;2,内容显示为十六进制的2字节值;4,内容显示为十六进制的恶4字节值;8,内容显示为十六进制的8字节值;NONE,取消显示原始数据,此参数对控制/ALL输出很有用;number,显示的行被设置为每行具有number个值的宽度。
/RELOCATIONS 显示本模块中所有的RVA重定位信息
/SECTION:section 显示指定section的所有相关信息,单独列举选项/HEADERS的字段信息
/SYMBOLS 显示COFF PE文件结构的符号表信息(包括段符号)**【4】**
/UNWINDINFO 显示该模块(exe和dll)中转储结构化异常处理(SHE)表的展开描述符

脚注
[1]:一般推荐使用.def模块定义脚本,这是因为考虑到编译器函数修饰的存在,DLL用C语言编写,默认__cdecl调用规范(此时不进行函数修饰),但Windows下系统API基本都是__stdcall(WINAPI的宏定义)调用规范,故而可以在.def脚本中再次定义函数导出符号的命名方式,从而可以无视编译器带来的函数符号修饰后的古怪命名方式。除了定义导出符号的范围、命名方式、序号外,还可以在.def脚本中定义DLL的堆大小、输出文件名、各个段的属性、堆栈大小、版本号等。
[2]:COFF PE文件结构体系下符号导入导出关系

Fig.2 COFF PE文件结构下的符号导入导出表对应关系

[3]:采用dumpbin /ALL a.dll > outfile.txt更简单直接

[4]:C:>dumpbin /SYMBOLS TestMath.obj

File Type: COFF OBJECT

COFF SYMBOL TABLE
000 00000000 DEBUG notype Filename | .file
main.cpp
002 000B1FDB ABS notype Static | @comp.id
003 00000000 SECT1 notype Static | .drectve
Section length 26, #relocs 0, #linenums 0, checksum 722C964F
005 00000000 SECT2 notype Static | .text
Section length 23, #relocs 1, #linenums 0, checksum 459FF65F, selection 1 (pick no duplicates)
007 00000000 SECT2 notype () External | _main
008 00000000 UNDEF notype () External | ?MyDump@@YAXXZ (void __cdecl MyDump(void))

String Table Size = 0x10 bytes
开头的 3 位数字是符号索引/号码。
如果第三列包含 SECTx,则符号在对象文件的那一节中定义。但如果出现 UNDEF,则它不在那个对象中定义并且必须在其他地方被解析。
第五列 (Static, External) 说明符号是否只在那个对象的内部可见,或者是否是公共的(外部可见)。
编号行中的最后一列是符号名(修饰名和未修饰名)。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DLL函数查看器是一款DLL函数查看工具,直接把DLL文件拖入列表查看即可。 1.将本程序快捷方式放入系统 "SendTo" 目录后,就可以右键文件"发送到"实现文件快速查看 2.按粘帖键(Ctrl+V)将剪辑板中字符串在列表中匹配查找 3.关于参数量的问题,由于猜解方法过于简单对于部分函数未从当前函数返回,而是"JMP"到别的函数 所以猜解可能会有错误,需要结合已知函数库或反汇编查看,另此方法对于cdecl调用函数无效 4.关于反汇编视图的"到首返回"如果勾选即表示仅反汇编到头一个RETN为止,否者将按照"DisAsm_MaxLine" 所指定的行数.生效方法参见说明细则12~13. 5.将PEID userdb.txt 放置到程序目录下可以实现查壳 6.如果将易语言API伴侣DATA下文件复制到本目录,可获得已知函数信息.这首先要感谢API伴侣的作者 7.在目录下建立 "ViewApi.cfg" ,设置信息将写入配置文件可方便放入优盘等移动存储器中使用 程序启动时会优先读取配置文件,如果文件不纯在则会访问注册表 8.如果你觉得这个美化窗口很浪费资源,可以打开注册表修改如下项值即可关闭 [HKEY_CURRENT_USER\Software\ViewApiList] "UI"=dword:00000000 9.如果你觉得反汇编影响了效率,可以打开注册表修改如下项值即可关闭 [HKEY_CURRENT_USER\Software\ViewApiList] "DisAsm"=dword:00000000 10.如果想关闭查壳功能可以删除userdb.txt或注册表如下设置 [HKEY_CURRENT_USER\Software\ViewApiList] "CheckShell"=dword:00000000 11.在线查询接口可在注册表如下位置修改,{searchTerms}为保留关键字被作为替换函数名 [HKEY_CURRENT_USER\Software\ViewApiList] "WebSearch"="http://www.baidu.com/s?wd={searchTerms}&ie=utf-8" 12.是否仅反汇编到头一个返回,1.表示是,0表示否 [HKEY_CURRENT_USER\Software\ViewApiList] "DisAsm_Retn"=dword:00000001 13.反汇编最大行数,即表示当前地址向后的长度,与函数实际长度无关.是否生效需要根据"DisAsm_Retn"设置 [HKEY_CURRENT_USER\Software\ViewApiList] "DisAsm_MaxLine"=dword:000003e8 键盘快捷键说明: TAB(SHIFT+TAB) -- 视图焦点切换 CTRL+S -- 视图切换 CTRL+F -- 文字搜索 F3 -- 搜索下一个 CTRL+A -- 项目全选 CTRL+C -- 复制选中项目函数名称/汇编代码 CTRL+V -- 将剪辑板中的字符在视图中匹配搜索 ALT+← -- 反汇编视图上一次跳转的后退 ALT+→ -- ... 前进 Application -- 弹出右键菜单(右WIN键和右CTRL键中间的那个键)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值