首页
社区
课程
招聘
[旧帖] [原创]delphi简单逆向工程之一(简单IF语句) 0.00雪花
发表于: 2008-2-10 12:56 4221

[旧帖] [原创]delphi简单逆向工程之一(简单IF语句) 0.00雪花

2008-2-10 12:56
4221
小狐用delphi编程后用自己写的软件的明码进行逆向(符合kanxue的无版权问题),向大家显示delphi的加解密和逆向工程技术,只要有朋友感兴趣,顶起来,我会逐渐增加难度,直至形成一个系统工程

我新建一个窗体,添加一个输入框,加一个按钮,按钮输入如下代码
begin
   if form1.Edit1.text='loveyou' then
      MessageBox(0,'你输入正确','成功',MB_OK);
end;

用OD加载新建的exe文件,跟踪结果如下:

以下是程序关建CALL附近的调用
0044F047  |.  8B80 FC020000  mov     eax, dword ptr [eax+2FC]
0044F04D  |.  E8 EAF3FDFF      call       0042E43C
0044F052  |.  8B45 FC              mov     eax, dword ptr [ebp-4]
0044F055  |.  BA 9CF04400      mov     edx, 0044F09C                    ;  loveyou
0044F05A  |.  E8 BD51FBFF      call       0040421C
0044F05F  |.  75 13                  jnz     short 0044F074
0044F061  |.  6A 00                  push    0                                ; /Style = MB_OK|MB_APPLMODAL
0044F063  |.  68 A4F04400   push    0044F0A4                         ; |成功
0044F068  |.  68 ACF04400   push    0044F0AC                         ; |你输入正确
0044F06D  |.  6A 00         push    0                                ; |hOwner = NULL
0044F06F  |.  E8 2474FBFF   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
0044F074  |>  33C0          xor     eax, eax

根据以上可以得出结论:
1、如果是明码字符串比较,则明码字符串的你输入的字串开始地址为ebp-4,而程序设计时那个固定的内存变量被编译系统编译成一个固定的内存地址,在开始比较前放入eax
2、这也进一步证实了高手所说的在调用CALL时的入栈规则,在dephi调用时第一个参数最先入栈

这是按钮的 click事件
0040421C  /$  53            push    ebx
0040421D  |.  56            push    esi
0040421E  |.  57            push    edi
0040421F  |.  89C6          mov     esi, eax
00404221  |.  89D7          mov     edi, edx
00404223  |.  39D0          cmp     eax, edx
00404225  |.  0F84 8F000000 je      004042BA
0040422B  |.  85F6          test    esi, esi
0040422D  |.  74 68         je      short 00404297
0040422F  |.  85FF          test    edi, edi
00404231  |.  74 6B         je      short 0040429E
00404233  |.  8B46 FC       mov     eax, dword ptr [esi-4]
00404236  |.  8B57 FC       mov     edx, dword ptr [edi-4]
00404239  |.  29D0          sub     eax, edx
0040423B  |.  77 02         ja      short 0040423F
delphi的编译系统很有意思,它没有按我们想象的那样进行循环逐次比较的方式形成7次循环,而是一个EAX和EDX进行比较后再来一个,可能对于CPU来说,这样的32位一次比较四个字节的快式来得更快吧,这样给我们一个结论:
   我们在跟踪一些简单程序时,不应该把软件算法想的很复杂,其实有很多时间是编译系统为了提高执行效率把算法弄复杂了,这么长的汇编就是一个if语句.

0040423D  |.  01C2          add     edx, eax
0040423F  |>  52            push    edx
00404240  |.  C1EA 02       shr     edx, 2
00404243  |.  74 26         je      short 0040426B
00404245  |>  8B0E          /mov     ecx, dword ptr [esi]
00404247  |.  8B1F          |mov     ebx, dword ptr [edi]
00404249  |.  39D9          |cmp     ecx, ebx
0040424B  |.  75 58         |jnz     short 004042A5
0040424D  |.  4A            |dec     edx
0040424E  |.  74 15         |je      short 00404265
00404250  |.  8B4E 04       |mov     ecx, dword ptr [esi+4]
00404253  |.  8B5F 04       |mov     ebx, dword ptr [edi+4]
00404256  |.  39D9          |cmp     ecx, ebx
00404258  |.  75 4B         |jnz     short 004042A5
0040425A  |.  83C6 08       |add     esi, 8
0040425D  |.  83C7 08       |add     edi, 8
00404260  |.  4A            |dec     edx
00404261  |.^ 75 E2         \jnz     short 00404245
00404263  |.  EB 06         jmp     short 0040426B
00404265  |>  83C6 04       add     esi, 4
00404268  |.  83C7 04       add     edi, 4
0040426B  |>  5A            pop     edx
0040426C  |.  83E2 03       and     edx, 3
0040426F  |.  74 22         je      short 00404293
00404271  |.  8B0E          mov     ecx, dword ptr [esi]
00404273  |.  8B1F          mov     ebx, dword ptr [edi]
00404275  |.  38D9          cmp     cl, bl
00404277  |.  75 41         jnz     short 004042BA
00404279  |.  4A            dec     edx
0040427A  |.  74 17         je      short 00404293
0040427C  |.  38FD          cmp     ch, bh
0040427E  |.  75 3A         jnz     short 004042BA
00404280  |.  4A            dec     edx
00404281  |.  74 10         je      short 00404293
00404283  |.  81E3 0000FF00 and     ebx, 0FF0000
00404289  |.  81E1 0000FF00 and     ecx, 0FF0000
0040428F  |.  39D9          cmp     ecx, ebx
00404291  |.  75 27         jnz     short 004042BA
00404293  |>  01C0          add     eax, eax
00404295  |.  EB 23         jmp     short 004042BA
00404297  |>  8B57 FC       mov     edx, dword ptr [edi-4]
0040429A  |.  29D0          sub     eax, edx
0040429C  |.  EB 1C         jmp     short 004042BA
0040429E  |>  8B46 FC       mov     eax, dword ptr [esi-4]
004042A1  |.  29D0          sub     eax, edx
004042A3  |.  EB 15         jmp     short 004042BA
004042A5  |>  5A            pop     edx
004042A6  |.  38D9          cmp     cl, bl
004042A8  |.  75 10         jnz     short 004042BA
004042AA  |.  38FD          cmp     ch, bh
004042AC  |.  75 0C         jnz     short 004042BA
004042AE  |.  C1E9 10       shr     ecx, 10
004042B1  |.  C1EB 10       shr     ebx, 10
004042B4  |.  38D9          cmp     cl, bl
004042B6  |.  75 02         jnz     short 004042BA
004042B8  |.  38FD          cmp     ch, bh
004042BA  |>  5F            pop     edi
004042BB  |.  5E            pop     esi
004042BC  |.  5B            pop     ebx
004042BD  \.  C3            retn

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 146
活跃值: (33)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
支持继续逆向,....要能将dede进一步完善就好了..
2008-2-10 13:03
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
3
支持一下,很基础,很扎实。
2008-2-10 13:04
0
雪    币: 134
活跃值: (84)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
纯学习了,谢谢。
2008-2-10 15:03
0
雪    币: 208
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
好久没发贴了,支持下楼主
2008-2-10 15:53
0
雪    币: 224
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
关注你的整个系统工程
把你的程序用rescope填加Edit2,使得点击确定后Edit2.text=Edit1.text,od中怎样增代码?
2008-2-10 16:02
0
游客
登录 | 注册 方可回帖
返回
//