abao991 发表于 2014-11-9 13:24

好名字取名软件破解过程

本帖最后由 abao991 于 2014-11-9 13:46 编辑

一、脱壳
查壳:ASPack 2.12 -> Alexey Solodovnikov

但是使用脱壳机脱壳后无法运行,用OD载入看下00A25001 >60            pushad
00A25002    E8 03000000   call 好名字取.00A2500A                     ; 此处使用ESP定律
00A25007- E9 EB045D45   jmp 45FF54F7
00A2500C    55            push ebp
00A2500D    C3            retn
00A2500E    E8 01000000   call 好名字取.00A25014
00A25013    EB 5D         jmp short 好名字取.00A25072
00A25015    BB EDFFFFFF   mov ebx,-0x13
00A2501A    03DD            add ebx,ebp
00A2501C    81EB 00506200   sub ebx,好名字取.00625000
00A25022    83BD 88040000 0>cmp dword ptr ss:,0x0
00A25029    899D 88040000   mov dword ptr ss:,ebx

具体下断过程就省略了,下硬件断点后F9运行,来到这里:
00A25416   /75 08         jnz short 好名字取.00A25420
00A25418   |B8 01000000   mov eax,0x1
00A2541D   |C2 0C00         retn 0xC
00A25420   \68 A00B4F00   push 好名字取.004F0BA0
00A25425    C3            retn

单步过RETN后代码,明显这里不是我们的OEP
004F0BA0    F8            clc
004F0BA1    EB 23         jmp short 好名字取.004F0BC6
004F0BA3    101C7C          adc byte ptr ss:,bl
004F0BA6    40            inc eax
004F0BA7    FB            sti
004F0BA8    A9 2B70F657   test eax,0x57F6702B
004F0BAD    8577 DF         test dword ptr ds:,esi
004F0BB0    DC79 5A         fdivr qword ptr ds:
004F0BB3    3BF9            cmp edi,ecx
004F0BB5    CD 94         int 0x94
004F0BB7    28A5 B65B9267   sub byte ptr ss:,ah
004F0BBD    A6            cmps byte ptr ds:,byte ptr es:
004F0BBE    24 AA         and al,0xAA
004F0BC0    04 65         add al,0x65

那么我们继续单步,来到
004F0BC6    60            pushad
004F0BC7    73 1E         jnb short 好名字取.004F0BE7
004F0BC9    4D            dec ebp
004F0BCA    B2 3C         mov dl,0x3C
004F0BCC    5F            pop edi
004F0BCD    DE1B            ficomp word ptr ds:

看到PUSHAD,可以继续使用ESP定律,之后来到
004F0E35    F8            clc
004F0E36    73 0D         jnb short 好名字取.004F0E45
004F0E38    A3 A1D2AFF8   mov dword ptr ds:,eax
004F0E3D    F1            int1
004F0E3E    38BE 49C5A5FA   cmp byte ptr ds:,bh
004F0E44    4D            dec ebp
004F0E45^ E9 E289FDFF   jmp 好名字取.004C982C
单步过004F0E46,就跳到了程序的OEP。
004C982C    55            push ebp
004C982D    8BEC            mov ebp,esp
004C982F    6A FF         push -0x1
004C9831    68 38F29700   push 好名字取.0097F238
004C9836    68 A4C14C00   push 好名字取.004CC1A4
004C983B    64:A1 00000000mov eax,dword ptr fs:
004C9841    50            push eax
004C9842    64:8925 0000000>mov dword ptr fs:,esp
004C9849    83EC 58         sub esp,0x58
004C984C    53            push ebx
004C984D    56            push esi
004C984E    57            push edi
004C984F    8965 E8         mov dword ptr ss:,esp

之后脱壳+修复就可以了。
二、逆向
1、逆向提示
首先打开注册界面,输入假码,弹出信息框“注册失败,请与作者联系,获得正确注册码!”
查找字符串,提示没有发现。
既然有信息框,可以使用F12暂停法。
F12暂停-Alt+F9-点击信息框上的确定,到达0042F3E6
0042F3D8   .8D0470      lea eax,dword ptr ds:
0042F3DB   .50            push eax                                 ; /Style
0042F3DC   .52            push edx                                 ; |Title
0042F3DD   .51            push ecx                                 ; |Text
0042F3DE   .6A 00         push 0x0                                 ; |hOwner = NULL
0042F3E0   .FF15 B4164F00 call dword ptr ds:[<&user32.MessageBoxA>>; \MessageBoxA
0042F3E6   .5F            pop edi                                  ;0932FA29
0042F3E7   .83F8 03       cmp eax,0x3                              ;Switch (cases 2..7)
0042F3EA   .5E            pop esi
很明显,42F3E0就是弹出信息框的位置,向上找,没有发现能跳过调用信息框的跳转。
那么我们继续单步。
过了RETN之后,来到这里004582F6 . 894424 10 mov dword ptr ss:,eax
004582FA . 8D5424 08 lea edx,dword ptr ss:
004582FE . 52 push edx
004582FF . FFD3 call ebx
00458301 . 8B4424 0C mov eax,dword ptr ss:
00458305 . 8B5424 10 mov edx,dword ptr ss:
00458309 . 8B4C24 14 mov ecx,dword ptr ss:
0045830D . 83C4 18 add esp,0x18

复制代码
程序运行到了00458301,说明上面004582FF就是调用注册失败的call。
可能有和我一样的新手不明白,简单解释下。
我们从上面的代码开始看起。
程序首先从004582F6开始,执行到004582FF,遇到了一个CALL。如果我们用OD F7跟进这个CALL,当我们F8步过这个CALL的断尾RETN时,程序会返回到调用它的下一行继续执行,也就是00458301。同样,刚才我提到,程序运行到了00458301,就说明是从004582FF这个CALL出来的。
向上看,没有发现能跳过004582FF的跳转。那么我们继续单步到达这里。
004222F3   > \E8 DAEEFDFF   call 好名字取.004011D2
004222F8   .85C0          test eax,eax
004222FA   .0F84 3F000000 je 好名字取.0042233F                         ;这个跳转能够跳过00422332,即跳过注册失败</b></font>
00422300   .F9            stc
00422301   .72 01         jb short 好名字取.00422304
00422303      B3            db B3
00422304   .68 04000080   push 0x80000004
00422309   .6A 00         push 0x0
0042230B   .68 9ED88100   push 好名字取.0081D89E
00422310   .68 01030080   push 0x80000301
00422315   .6A 00         push 0x0
00422317   .68 40000000   push 0x40
0042231C   .68 04000080   push 0x80000004
00422321   .6A 00         push 0x0
00422323   .68 A9D88100   push 好名字取.0081D8A9
00422328   .68 03000000   push 0x3
0042232D   .BB 40F34200   mov ebx,好名字取.0042F340
<font color="#ff0000"><b>00422332   .E8 599C0000   call 好名字取.0042BF90                     ;调用注册失败</b></font>
00422337   .83C4 28       add esp,0x28


看上面的注释,
je 好名字取.0042233F如果不跳,就调用了注册失败。所以我们改为JMP。
static/image/hrline/1.gif

2、逆向功能
重新运行程序,可以发现同样提示未注册,说明有重启验证。字符串搜索“注册”
004010A5      C0            db C0
004010A6      0F845B00      dd 好名字取.005B840F
004010AA      00            db 00
004010AB      00            db 00
004010AC      F9            db F9
004010AD      72            db 72                                    ;CHAR 'r'
004010AE      01            db 01
004010AF      B3            db B3
004010B0   .68 04000080   push 0x80000004
004010B5   .6A 00         push 0x0
004010B7   .68 C9644F00   push 好名字取.004F64C9
004010BC   .68 01030080   push 0x80000301
004010C1   .6A 00         push 0x0
004010C3   .68 30000000   push 0x30
004010C8   .68 04000080   push 0x80000004
004010CD   .6A 00         push 0x0
004010CF   .68 D2644F00   push 好名字取.004F64D2                     ;未注册版本,不可以选择高分名字!
004010D4   .68 03000000   push 0x3
004010D9   .BB 40F34200   mov ebx,好名字取.0042F340
004010DE   .E8 ADAE0200   call 好名字取.0042BF90
004010E3   .83C4 28       add esp,0x28

可以看到前面的 db 00。右键-分析-从模块中删除分析
00401085   /0F85 7C000000   jnz 好名字取.00401107
0040108B   |F8            clc
0040108C   |73 01         jnb short 好名字取.0040108F
0040108E   |0FE83E          psubsb mm7,qword ptr ds:
00401091   |0100            add dword ptr ds:,eax
00401093   |0089 45FCF873   add byte ptr ds:,cl
00401099   |0181 8B45FC83   add dword ptr ds:,eax
0040109F   |E0 01         loopdne short 好名字取.004010A2
004010A1   |83F0 01         xor eax,0x1
004010A4   |85C0            test eax,eax
004010A6   |0F84 5B000000   je 好名字取.00401107
004010AC   |F9            stc
004010AD   |72 01         jb short 好名字取.004010B0
004010AF   |B3 68         mov bl,0x68
004010B1   |04 00         add al,0x0
004010B3   |0080 6A0068C9   add byte ptr ds:,al
004010B9   |64:4F         dec edi
004010BB   |0068 01         add byte ptr ds:,ch
004010BE   |0300            add eax,dword ptr ds:
004010C0   |806A 00 68      sub byte ptr ds:,0x68
004010C4   |3000            xor byte ptr ds:,al
004010C6   |0000            add byte ptr ds:,al
004010C8   |68 04000080   push 0x80000004
004010CD   |6A 00         push 0x0
004010CF   |68 D2644F00   push 好名字取.004F64D2                     ; 未注册版本,不可以选择高分名字!
004010D4   |68 03000000   push 0x3
004010D9   |BB 40F34200   mov ebx,好名字取.0042F340
004010DE   |E8 ADAE0200   call 好名字取.0042BF90
004010E3   |83C4 28         add esp,0x28
004010E6   |F9            stc
004010E7   |72 01         jb short 好名字取.004010EA
004010E9   |7C 6A         jl short 好名字取.00401155
004010EB   |0068 F3         add byte ptr ds:,ch
004010EE   |64:4F         dec edi
004010F0   |006A FF         add byte ptr ds:,ch
004010F3   |6A 09         push 0x9
004010F5   |68 C00B0116   push 0x16010BC0
004010FA   |68 01000152   push 0x52010001
004010FF   |E8 98AE0200   call 好名字取.0042BF9C
00401104   |83C4 18         add esp,0x18
00401107   \8BE5            mov esp,ebp

把00401085中JE改为JMP以跳过注册失败,继续查找。
004128F4   > \833D E8029E00>cmp dword ptr ds:,0x0
004128FB   .0F84 0A000000 je 好名字取.0041290B
00412901   .B8 A25A7D00   mov eax,好名字取.007D5AA2                  ;已经注册版本!感谢您对我们的支持!
00412906   .E9 05000000   jmp 好名字取.00412910
0041290B   >B8 C55A7D00   mov eax,好名字取.007D5AC5                  ;未注册版本!请与作者联系注册事宜!

可以看到,程序将9E02E8的值与0进行比较,所以9E02E8是关键常量,右键-查找所有常量-9E02E8
参考位于 好名字取:.text 到常量 9E02E8
地址       反汇编                                    注释
004053CD   cmp dword ptr ds:,0x0         ds:=00000000
0040C738   mov dword ptr ds:,eax
004128F4   cmp dword ptr ds:,0x0         (初始 CPU 选择)
00422186   dd 好名字取.009E02E8
004236C9   mov eax,dword ptr ds:         =00000000

0040C738就是给常量赋值的地方,可以从这里入手,也可以到其他位置逐个修改。
还有个别需要修改的地方,比如标题的未注册,都可以通过字符串查找找到。

附上软件下载地址:
http://www.duote.com/soft/30410.html
吾爱汇编论坛原创,转载请注明出处。



bigeorry 发表于 2014-11-9 13:29

我来坐个沙发。楼主为何不把练手软件也放上来啊

柠檬狗丶 发表于 2014-11-9 13:38

上软件看看呀

虚竹 发表于 2014-11-9 14:06

。。。。看上去好像好厉害的样子!

Shark恒 发表于 2014-11-9 15:42

楼主讲的这么详细,咋不加个分啊。我加了{:6_209:}

活在当下 发表于 2014-11-9 21:18

支持楼主哦~

彩虹 发表于 2014-11-9 21:48

讲的很详细,学习了,话说回来,是不是把eax的值修改为1就成功了呢?

abao991 发表于 2014-11-11 22:31

彩虹 发表于 2014-11-9 21:48
讲的很详细,学习了,话说回来,是不是把eax的值修改为1就成功了呢?

是{:5_188:}

王婆卖瓜 发表于 2014-11-15 23:08

楼主讲得很好,很容易懂。加分了。继续发其他的

虚竹 发表于 2014-11-15 23:27

....能不能出视频教程啊!

页: [1] 2 3
查看完整版本: 好名字取名软件逆向过程