用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!
幸运的我,就这样结束了,呵^#^…………
因一些原因,目标程序就不放上来了,呵!