好名字取名软件破解过程
本帖最后由 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
吾爱汇编论坛原创,转载请注明出处。
我来坐个沙发。楼主为何不把练手软件也放上来啊
上软件看看呀
。。。。看上去好像好厉害的样子!
楼主讲的这么详细,咋不加个分啊。我加了{:6_209:}
支持楼主哦~
讲的很详细,学习了,话说回来,是不是把eax的值修改为1就成功了呢?
彩虹 发表于 2014-11-9 21:48
讲的很详细,学习了,话说回来,是不是把eax的值修改为1就成功了呢?
是{:5_188:}
楼主讲得很好,很容易懂。加分了。继续发其他的
....能不能出视频教程啊!