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]
在DeDe中,如果处理含有非英文字符串的程序,则选择“Option/Configuration”菜单,在References选项卡中可以设置DeDe反编译引擎查找字符串参考时使用的字符集。
CLasses Info:显示程序中使用的类信息;
Units Info:显示程序中使用的单元信息;
Forms:显示程序中的窗体信息,这部分可以用资源编辑工具修改;
Procedures:显示程序的过程信息;
Project:可将当前项目保存;
Exports:导出符号文件。
![DeDe反编译器_解密](http://www.sinoit.org.cn/NewsLetter/NO.2/images/20080201-1_clip_image005.jpg)
在此显示了Events(事件)和Controls(控件)两方面的内容(见图7.2)。Button1Click事件对应的是“确定”按钮,双击可打开代码窗口。该窗口显示当前事件对应的汇编代码,右边控制条显示全局变量和局变量。双击某个表达式,可以加注释。在跳转指令、CALL指令上双击可跳到相应代码上。
![DeDe反编译器_反编译_02](http://www.sinoit.org.cn/NewsLetter/NO.2/images/20080201-1_clip_image007.jpg)
设目标实例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的符号识别技术,使得上述代码可读性非常容易理解。
OFFS按钮:反汇编指定地址的代码。