第 9 章 dcc
dcc 是用 C 语言编写的一个适用于 DOS 操作系统的原型反编译器(样机)。dcc 最初在一台运行 Ultrix 的 DecStation 3000 上开发,后来被移植到运行 DOS 的 PC 机体系结构上。dcc 把 Intel i80286 体系结构的.exe 文件和.com 文件作为输入,并且产生目标 C 语言和汇编语言程序。这个反编译器使用在这篇论文中 (第 4,5,6,7 章和第 8 章) 所描述的技术,它是由图 9-1 显示的几个部分组成。从图中可知,该反编译器有一个内建的装载器和反汇编器,而没有后期处理阶段。以下几节详细描述关于 dcc 的几个方面,而且在第 9.7 节给出一系列反编译的程序。
图 9-1: dcc 反编译器的构成
反编译器主程序见图 9-2 所示,它有五个相互联系的主要模块:initArgs() 从命令行 argv[]读入用户选择项并且把它们放在一个全局的程序选项变量中;Loader() 读入二进制程序并把它装入内存;FrontEnd() 解析该程序建立一个调用图;udm() 分析该程序的控制流和数据流;和 BackEnd() 为在调用图中的各个不同例程生成 C 代码。
Int main(int argc, char *argv[]) { char *filename; /* Binary file name */ CALL_GRAPH *callGraph; /* Pointer to the program's call graph */ filename = initArgs(argc, argv); /* Read a .exe or .com file and load it into memory */ Loader (filename); /* Parse the program, generate Icode while building the call graph */ FrontEnd (filename, &callGraph); /* Universal Decompiling Machine: process the Icode and call graph */ udm (callGraph); /* Generates C for each subroutine in the call graph */ BackEnd(filename, callGraph); } |
图 9-2: 反编译器主程序
DOS 操作系统使用一个分段的机器表示法。为这个体系结构编写的编译器使用 6 个不同的存储器模型:极小的、小的、中等的、紧凑的、大的、和极大的。存储器模型来自于代码和数据是 16 位指针或是 32 位指针。附录 A 提供关于 i80286 体系结构的信息,附录 B 提供关于 PSP 的信息。这一章假定读者已经熟悉这个结构了。
反编译器选择项
dcc 是通过指定要反编译的二进制文件从命令行运行的。例如,若要反编译文件 test.exe 则使用下列命令:
dcc test .exe |
这个命令产生 test.b 文件,这是目标 C 语言文件。使用者可以使用一些选择项以获得关于程序的更多信息。这些选择项是:
l a1: 在语法分析后产生一个汇编程序文件 (即,在图的最优化之前)。
l a2: 在图的最佳化之后产生一个汇编程序文件。
l o <fileName>: 指定输出的汇编程序文件名字。
l m: 产生该程序的一个内存映像图。
l s: 统计在为每个子程序的控制流向图做最优化之前和之后的基本块数目。
l v: 冗长模式选择项,显示关于被装入的程序 (缺省的寄存器值、映像大小等等),每个子程序图的基本块,每个指令、liveIn、liveOut、liveUse 的已定义的寄存器和被使用的寄存器,以及每个基本块的已定义的寄存器集合,等信息。
l V: 极冗长模式选择项,除了显示冗长模式选项所显示的信息,还加上关于该程序重定位表(如果有的话),在图最优化之前每个子程序的控制流向图的基本块,和每个子程序的派生序列图,等信息。
l i: dcc 的文本用户界面。这个界面是 Michael Van Emmerik 使用 curses 库编写的。它允许用户单步(浏览) 程序,包括子程序调用。右光标键被用来跟随跳转和子程序调用,左光标键被用来回到在你使用右光标键之前的地方,上下光标键被用来上/下移动光标一次一行,向上翻页键在向下翻页键被用来上卷一页或下卷一页,而 ctrl-X 被用来退出交互式界面。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论