反编译Delphi软件DEDE的使用

elphi/C++ Builder采用控件拖放的方式来完成界面的设计,并和事件联系起来。而这些信息以资源(RCDATA)的方式存放于可执行文件中。DeDe便利用这个原理进行反编译,获取相关信息,将界面与事件联系关系还原,但事件的汇编代码不能还原。DeDe公开了源代码,感兴趣的读者可以研究一下。

1.主要功能 
用DeDe可以查看Delphi程序窗体的属性,可以查看按钮对应的事件,并将事件代码反汇编出来,其能识别出Delphi库函数,具有良好的可读性。另外,还可以把事件输出到map文件中供其他工具使用。

2.配置 
(1)DSF文件

①DSF文件的含义

DSF文件内容来自不同版本BPL库文件的输出符号表。DeDe反汇编引擎使用这些符号表对生成的ASM代码文件添加类成员方法调用的注释,这非常类似于IDA Pro的FLIRT技术。如果没有加载任何BPL符号表文件,对BPL类的调用就无法以注释的格式说明。

②加载DSF文件

经由“File/Load Symbol File”菜单,就可加载所需要的DSF文件。程序若能正确识别出相应版本的Delphi程序,会自动加载DSF文件。若希望每次启动DeDe的同时自动加载若干DSF文件,选中“Options/Configuration”菜单,在Symbols选项卡中就可完成本项工作。如果想查看包含在某个特定DSF文件中的输出符号表,选择“Options/Symbols”。

③为何需要创建DSF文件

处理使用自定义构件(即不是Delphi安装的构件)的程序时,如果有这些自定义构件的BPL,并且为它们创建了DSF文件,那么DeDe将会注释所有对这些自定义构件的调用。创建DSF的速度也是很快的。

(2)DOI文件

DOI意思是Delphi Class Offset Information(Delphi类偏移信息),该技术使用偏移信息识别类成员:方法和域(实例变量,属性)。DOI文件包含用于识别的必要数据。DeDe仿真指令的执行来查找使用这些偏移的引用所在。例如,在继承自TForm类的任何子类的偏移0xCC处,代表指向ShowModal方法的指针。当遇到类似call [reg + $00CC]的调用时,仿真器就知道寄存器包含的对象是引用TForm.ShowModal方法的TForm子类。DOI文件应该存放在DSF文件夹内。

下面是一个生成的带有DOI帮助信息的简单示例。

* Reference to control LogMemo : TMemo 
004E4E7C   8B80F4020000       mov  eax, [eax+$02F4]
* Reference to field TMemo.Lines : TStrings 
004E4E82   8B8004020000       mov  eax, [eax+$0204]
* Possible String Reference to: 'Loading Export Names ...' 
004E4E88   BA0C584E00          mov dx, $004E580C
004E4E8D   8B08                  mov ecx, [eax]
* Reference to method TStrings.Add(string) 
004E4E8F   FF5134                call    dword ptr [ecx+$34]

使用DOI文件,只需复制*.DOI文件到DSF文件夹即可。DOI数据会自动插入到生成的代码文件中。
(3)字符串参考的含义
在DeDe中,如果处理含有非英文字符串的程序,则选择“Option/Configuration”菜单,在References选项卡中可以设置DeDe反编译引擎查找字符串参考时使用的字符集。
  


注意:如果使用全部的字符集合#32~#255,则可能得到残缺的字符串参考。Delphi程序一般不用Unicode字符串,这也是该选项没有包括在字符串参考配置中的原因。 
3.基本操作  
DeDe安装很简单。安装好后直接执行主程序,出现如图7.1所示的主界面。单击  按钮打开光盘映像文件中的DE_Delphi文件,然后单击“Process”按钮进行反编译。DeDe先将被分析的文件装载到内存中,再进行反编译,因此对一些压缩加壳的程序也能反编译。
CLasses Info:显示程序中使用的类信息;
Units Info:显示程序中使用的单元信息;
Forms:显示程序中的窗体信息,这部分可以用资源编辑工具修改;
Procedures:显示程序的过程信息;
Project:可将当前项目保存;
Exports:导出符号文件。

 

图7.1  DeDe界面


在此显示了Events(事件)和Controls(控件)两方面的内容(见图7.2)。Button1Click事件对应的是“确定”按钮,双击可打开代码窗口。该窗口显示当前事件对应的汇编代码,右边控制条显示全局变量和局变量。双击某个表达式,可以加注释。在跳转指令、CALL指令上双击可跳到相应代码上。




图7.2  查看事件按钮


设目标实例DE_Delphi的用户名为Name[],具体代码如下:
* Reference to control TMainForm.Edit1 : TEdit  ;用户名框控件
004502C6        mov      eax, [esi+$02F8]
* Reference to: controls.TControl.GetText(TControl):System.String;
004502CC     call     0042F4F8
004502D1     cmp     dword ptr [ebp-$0C],+$00    ;判断是否输入字符
004502D5     jnz      004502F5
……
* Reference to: controls.TControl.GetText(TControl):System.String;
004502FE     call    0042F4F8
00450303     mov      eax, [ebp-$10]            ;指向用户名
* Reference to: system.@LStrLen:Integer;
00450306     call    004044C4
0045030B     cmp      eax, +$04                    ;判断是否输入了4个字符
0045030E     jnl     0045032E
……
* Reference to: controls.TControl.GetText(TControl):System.String;
00450345     call    0042F4F8
0045034A     mov     eax, [ebp-$14] 指向Name[]
* Reference to: system.@LStrLen:Integer;
0045034D     call    004044C4                     ;得到用户名长度
00450352     mov     ebx, eax                     ;将长度放到ebx中作为计数器
00450354     test    ebx, ebx
00450356     jle     00450381  
00450358     mov     edi, $00000001             ;edi=1
0045035D     /mov    eax, [ebp-$08]             ;指向Name[]
00450360    |movzx  eax, byte ptr[eax+edi-$01]   
00450365     |lea     ecx, [ebp-$18]
00450368    |mov    edx, $00000002
*Referenceto: sysutils.IntToHex(System.Integer;System.Integer)
0045036D     |call   00408310                   ;inttohex(ord(Name[i]),2)
00450372     |mov     edx, [ebp-$18]             ;[ebp-$18]指向Name[i]16进制
00450375     |lea     eax, [ebp-$04]             ;[ebp-$04]变量是指向Sn指针的指针
* Reference to: system.@LStrCat;
00450378     |call        004044CC                ;将两个串连起来,设为Sn
0045037D     |inc     edi                            ;i+1
0045037E     |dec     ebx                            ;计数器减1
0045037F     \jnz     0045035D                     ;循环
……
* Reference to: controls.TControl.GetText(TControl):System.String;
0045038A     call    0042F4F8                     ;取输入的序列号
0045038F     mov     eax, [ebp-$1C]             ;[ebp-$1C]是输入的序列号指针
00450392     mov     edx, [ebp-$04]             ;[ebp-$04]中存放的是正确的序列号
* Reference to: system.@LStrCmp;
00450395     call     00404608                ;比较两个临时变量
0045039A     jnz     004503B7
由于DeDe的符号识别技术,使得上述代码可读性非常容易理解。
在图7.2中有两个按钮值得注意:
DPR按钮:是反汇编项目文件.dpr,该文件控制或记录程序中的所有文件。
OFFS按钮:反汇编指定地址的代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件开发公司网站模板的设计应该具有简洁、现代化的外观和良好的用户体验。这个html5浅蓝白色模板适用于软件公司集团通用网站,可以提供一种清爽、专业的形象。 该模板的源码基于织梦dede模板开发,这是一个功能强大而灵活的内容管理系统(CMS)。它具有易于使用的界面和丰富的插件,可以轻松地创建和管理网站的内容,包括文章、图片、音频和视频等。这使得软件公司能够更好地展示他们的产品和服务。 模板的主题色是浅蓝和白色,这种颜色组合给人一种清新和专业的感觉。蓝色象征着技术和专业性,而白色则带给人们一个简洁和干净的印象。这种配色方案适合软件开发行业,既能满足专业人士的要求,又能展示出公司的创新和现代化。 该模板还应该具有响应式设计,能够自适应各种设备和屏幕尺寸的浏览。这对于提供优质的用户体验来说非常关键,因为越来越多的人使用手机和平板电脑浏览网页。模板应该能够在不同的设备上呈现出优美的排版和流畅的导航,以便用户能够轻松地找到他们需要的信息。 总的来说,软件开发公司网站模板的选择非常重要,它不仅可以提升用户体验,还能突出公司的品牌形象和专业性。这个html5浅蓝白色软件公司集团通用网站织梦dede模板源码提供了一种清新、现代化的设计风格,适合软件开发公司使用

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值