一个易语言程序的爆破:把注册窗口当NAG去除

用PEid查壳,显示为:RLPack V1.21 (aPlib 0.43) -> ap0x   * Sign.By.fly * 20080504 *
呵呵,一个简单的壳,好了,我们直接用OD载入脱壳:


00423FC2 >  60                 pushad   //载入后OD停在此处
00423FC3    E8 00000000        call 9无密码?00423FC8
00423FC8    8B2C24             mov ebp,dword ptr ss:[esp]

用ESP定律,一下子就来到了:


00424135    61                 popad
00424136  - E9 C5CEFDFF        jmp 9无密码?00401000
0042413B    90                 nop
0042413C    61                 popad
0042413D    C3                 retn

再F8单步一步就到了OEP:


00401000    E8 06000000        call 9无密码?0040100B
00401005    50                 push eax
00401006    E8 BB010000        call 9无密码?004011C6                         ; jmp to kernel32.ExitProcess
0040100B    55                 push ebp
0040100C    8BEC               mov ebp,esp
0040100E    81C4 F0FEFFFF      add esp,-110
00401014    E9 83000000        jmp 9无密码?0040109C

Dump下来然后就修复,此时查壳显示为:E Language -> WuTao   * Sign.By.fly *
运行一下,晕,直接退出了,看来有自校验。
好了,下步我们就是要先把这个自校验去掉。用OD载入脱壳修复后的程序,下好断点:bp ExitProcess
F9运行,中断了下来,不过是停在了系统空间,我们根据堆栈:


0013F74C   100296ED  /CALL 到 ExitProcess 来自 krnln.100296E7
0013F750   00000000  \ExitCode = 0
0013F754   0013F78C
0013F758   004107E9  Unpack_.004107E9

返回到:


004107D7  |> /41               /inc ecx
004107D8  |. |51               |push ecx
004107D9  |. |50               |push eax
004107DA  |. |3BC8             |cmp ecx,eax
004107DC  |. |0F8F 0E000000    |jg Unpack_.004107F0
004107E2  |. |6A 00            |push 0
004107E4  |. |E8 BB770000      |call Unpack_.00417FA4
  //就是此CALL调用退出
004107E9  |. |83C4 04          |add esp,4
004107EC  |. |58               |pop eax
004107ED  |. |59               |pop ecx
004107EE  |.^\EB E7            \jmp short Unpack_.004107D7

然后找到段着下断:


00410635  /.  55               push ebp
  //此处段着,F2下断
00410636  |.  8BEC             mov ebp,esp
00410638  |.  81EC 24000000    sub esp,24
0041063E  |.  6A FF            push -1
00410640  |.  6A 08            push 8

下好断后,我们来过,F9运行,直接中断了刚才下好断点的段首,我们F8单步跟踪:


00410727  |.  8945 F8          mov dword ptr ss:[ebp-8],eax
  //留意提示窗口:
  //eax=001945A0, (ASCII "Unpack_.exe")=====出现程序名
  //堆栈 ss:[0013F784]=00000024

0041072A  |.  FF75 F8          push dword ptr ss:[ebp-8]                  ; /Arg3
0041072D  |.  68 39354000      push Unpack_.00403539                      ; |Arg2 = 00403539
00410732  |.  FF75 FC          push dword ptr ss:[ebp-4]                  ; |Arg1
00410735  |.  B9 03000000      mov ecx,3                                  ; |
0041073A  |.  E8 1E84FFFF      call Unpack_.00408B5D                      ; \Unpack_.00408B5D

运行到下面的代码时,出现了一个比较,我们看一下堆栈里的值:


0041079E  |> \817D F0 70940000 cmp dword ptr ss:[ebp-10],9470
  //堆栈 ss:[0013F77C]=00026000
004107A5  |.  B8 00000000      mov eax,0
004107AA  |.  0F9FC0           setg al
004107AD  |.  68 02000080      push 80000002
004107B2  |.  6A 00            push 0
004107B4  |.  50               push eax

那个26000是什么值??我们查看一下脱壳后的程序unpack_.exe的属性:
大小:    152 KB (155,648 字节)=======转成16进制就是=====26000
呵呵,原来是校验程序大小是否改变。
好了,把9470改成26000,然后我们再搜索一下常数,看看还有没有在其他地方核验,如图,有多处,我们一一修改过来吧!

保存一份,运行起来了,呵呵!自检验处理完毕,开始爆破!
先大致的分析一下思路:
1、由于不能看到程序的主界面(不能试用),所以可以把出现的窗口当作NAG窗口对待
2、试注册,没有任何反应
3、由简到难,所以先试试去除NAG后的

采用F12堆栈暂停法来逆向返回,如图:

没有返回到程序的领空(这里大多数E语言的特征,多在krnln里转悠,呵呵!
看不明确,只好多下几个断点了:
断点一:


100530AF    83BF B4010000 0>cmp     dword ptr [edi+1B4], 1
100530B6    75 1F           jnz     short 100530D7
100530B8    8B5424 1C       mov     edx, dword ptr [esp+1C]
100530BC    8BB3 6C020000   mov     esi, dword ptr [ebx+26C]
100530C2    6A 01           push    1
100530C4    8BCB            mov     ecx, ebx
100530C6    8993 6C020000   mov     dword ptr [ebx+26C], edx
100530CC    E8 4F120000     call    10054320                         ; 1
100530D1    89B3 6C020000   mov     dword ptr [ebx+26C], esi

断点二:


10052662    8A4C38 04       mov     cl, byte ptr [eax+edi+4]
10052666    83C4 0C         add     esp, 0C
10052669    F6C1 01         test    cl, 1
1005266C    0F84 B3070000   je      10052E25
10052672    8B13            mov     edx, dword ptr [ebx]
10052674    6A 00           push    0
10052676    52              push    edx
10052677    8BCE            mov     ecx, esi
10052679    E8 A2080000     call    10052F20                         ; 2

断点三:


1005A35B    85C0            test    eax, eax
1005A35D    74 2C           je      short 1005A38B
1005A35F    8B0E            mov     ecx, dword ptr [esi]
1005A361    8B56 18         mov     edx, dword ptr [esi+18]
1005A364    894424 0C       mov     dword ptr [esp+C], eax
1005A368    8D4424 08       lea     eax, dword ptr [esp+8]
1005A36C    6A 00           push    0
1005A36E    50              push    eax
1005A36F    68 D5070000     push    7D5
1005A374    894C24 14       mov     dword ptr [esp+14], ecx
1005A378    895424 1C       mov     dword ptr [esp+1C], edx
1005A37C    E8 3FCCFFFF     call    10056FC0                         ; 3
1005A381    85C0            test    eax, eax
1005A383    75 06           jnz     short 1005A38B

下了这几个断点后,重新载入运行,中断在了第3个,我们单步改跳转,试着跳过调用。
幸运,主界面出现了,呵呵,有门!留意一下堆栈,有一个返回到程序领空的地址调用:


0013FC48   001986D8
0013FC4C   00189DC8
0013FC50   00000000
0013FC54   00198698
0013FC58   0013FC9C
0013FC5C   10028E79  返回到 krnln.10028E79
0013FC60   0013FC6C
0013FC64   00000003
0013FC68   0013FC80
0013FC6C   00000000
0013FC70   00000000
0013FC74   00000000
0013FC78   0040C978  返回到 Unpack_.0040C978 来自 Unpack_.00417FE0

我们返回到这里看看:


0040C935    51              push    ecx
0040C936    50              push    eax
0040C937    3BC8            cmp     ecx, eax
0040C939    0F8F 40000000   jg      0040C97F
0040C93F    68 02000080     push    80000002
0040C944    6A 00           push    0
0040C946    68 01000000     push    1
0040C94B    68 01000100     push    10001
0040C950    68 00000106     push    6010000
0040C955    68 01000152     push    52010001
0040C95A    68 01000100     push    10001
0040C95F    68 7B290106     push    601297B
0040C964    68 7A290152     push    5201297A
0040C969    68 03000000     push    3
0040C96E    BB 20030000     mov     ebx, 320
0040C973    E8 68B60000     call    00417FE0
0040C978    83C4 28         add     esp, 28
0040C97B    58              pop     eax
0040C97C    59              pop     ecx
0040C97D  ^ EB B5           jmp     short 0040C934
0040C97F    83C4 08         add     esp, 8
0040C982    8B5D F8         mov     ebx, dword ptr [ebp-8]

往上看,刚刚上面有一个比较和跳转!我们将


0040C939    0F8F 40000000   jg      0040C97F
更改为:
0040C939   /EB 44           jmp     short 0040C97F

保存一份,试运行,可爱的界面出现了,功能正常,OK!
幸运的我,就这样结束了,呵^#^…………

因一些原因,目标程序就不放上来了,呵!

发表评论