【破解作者】大菜一号
【破解对象】一个加了壳的CrackMe
【破解目的】1、新手稍微接确一下手动脱壳;
2、算法的分析
【破解声明】
声声声声明呀``~~这个CrackMe早就有人破过了``偶也是从附件上下下来的`不过可没看一句答案`````是一句也没看呀!不相信滴下面部分就别看了`早点跳出循环吧!~汗~~~`
这个CrackMe呢加了一个很垃圾的UPX壳`所以这里我们就不用工具`就稍微加强一些手脱脱壳的技术(也到时候该勤快些哩呀``不然以后吃啥?)
参考了二哥的脱壳教程(感谢二哥~)
手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈(也就是知道一个跳转要往回跳了,就在它下一条码处点一下,F4执行到下一句,不要让它往回跳)。不要用Peid查入口,单步跟踪,提高手动找入口能力。程序加壳段地址 应该都会有跨段跳跃,一般都是在内存中脱壳完毕,准备运行程序,手动脱壳就是要在入口将程序Dump出来。转到入口时一般都有Popad语句和开始的PUSHAD对应。我们再这里用Od的Dump插件直接脱壳。好,手动脱壳说明就到这~
下面是手动脱壳的文本过程`不懂有个动画,不过很粗糙,要了解就将就着看吧``动画在这里也声明一下:动画过程只简短加注释,详细的下面会讲到`结合一下就行了!~
程序用OD载入后提示有壳,选否不再继续分析,我们停在这里:
00406CC0 > $ 60 pushad //这个pushad,前面说了`后面会有个popad和它对应,那就要密切关注一下这个popad了
00406CC1 . BE 00604000 mov esi, 00406000
00406CC6 . 8DBE 00B0FFFF lea edi, dword ptr [esi+FFFFB000]
00406CCC . 57 push edi
00406CCD . 83CD FF or ebp, FFFFFFFF
00406CD0 . EB 10 jmp short 00406CE2
00406CD2 90 nop
00406CD3 90 nop
00406CD4 90 nop
00406CD5 90 nop
00406CD6 90 nop
00406CD7 90 nop
00406CD8 > 8A06 mov al, byte ptr [esi]
00406CDA > 46 inc esi
00406CDB . 8807 mov byte ptr [edi], al
00406CDD . 47 inc edi
00406CDE > 01DB add ebx, ebx
00406CE0 . 75 07 jnz short 00406CE9
00406CE2 > 8B1E mov ebx, dword ptr [esi]
00406CE4 . 83EE FC sub esi, -4
00406CE7 . 11DB adc ebx, ebx
00406CE9 >^ 72 ED jb short 00406CD8 //这个要往回跳了``我们就在下面点一下,F4到下一代码
00406CEB . B8 01000000 mov eax, 1
00406CF0 > 01DB add ebx, ebx
00406CF2 . 75 07 jnz short 00406CFB
00406CF4 . 8B1E mov ebx, dword ptr [esi]
00406CF6 . 83EE FC sub esi, -4
00406CF9 . 11DB adc ebx, ebx
00406CFB > 11C0 adc eax, eax
00406CFD . 01DB add ebx, ebx
00406CFF .^ 73 EF jnb short 00406CF0
00406D01 . 75 09 jnz short 00406D0C
00406D03 . 8B1E mov ebx, dword ptr [esi]
00406D05 . 83EE FC sub esi, -4
00406D08 . 11DB adc ebx, ebx
00406D0A .^ 73 E4 jnb short 00406CF0
00406D0C > 31C9 xor ecx, ecx
00406D0E . 83E8 03 sub eax, 3
00406D11 . 72 0D jb short 00406D20
00406D13 . C1E0 08 shl eax, 8
00406D16 . 8A06 mov al, byte ptr [esi]
00406D18 . 46 inc esi
00406D19 . 83F0 FF xor eax, FFFFFFFF
00406D1C . 74 74 je short 00406D92
00406D1E . 89C5 mov ebp, eax
00406D20 > 01DB add ebx, ebx
00406D22 . 75 07 jnz short 00406D2B
00406D24 . 8B1E mov ebx, dword ptr [esi]
00406D26 . 83EE FC sub esi, -4
00406D29 . 11DB adc ebx, ebx
00406D2B > 11C9 adc ecx, ecx
00406D2D . 01DB add ebx, ebx
00406D2F . 75 07 jnz short 00406D38
00406D31 . 8B1E mov ebx, dword ptr [esi]
00406D33 . 83EE FC sub esi, -4
00406D36 . 11DB adc ebx, ebx
00406D38 > 11C9 adc ecx, ecx
00406D3A . 75 20 jnz short 00406D5C
00406D3C . 41 inc ecx
00406D3D > 01DB add ebx, ebx
00406D3F . 75 07 jnz short 00406D48
00406D41 . 8B1E mov ebx, dword ptr [esi]
00406D43 . 83EE FC sub esi, -4
00406D46 . 11DB adc ebx, ebx
00406D48 > 11C9 adc ecx, ecx
00406D4A . 01DB add ebx, ebx
00406D4C .^ 73 EF jnb short 00406D3D //这个要跳了`F4到下面
00406D4E . 75 09 jnz short 00406D59
00406D50 . 8B1E mov ebx, dword ptr [esi]
00406D52 . 83EE FC sub esi, -4
00406D55 . 11DB adc ebx, ebx
00406D57 .^ 73 E4 jnb short 00406D3D
00406D59 > 83C1 02 add ecx, 2
00406D5C > 81FD 00F3FFFF cmp ebp, -0D00
00406D62 . 83D1 01 adc ecx, 1
00406D65 . 8D142F lea edx, dword ptr [edi+ebp]
00406D68 . 83FD FC cmp ebp, -4
00406D6B . 76 0F jbe short 00406D7C
00406D6D > 8A02 mov al, byte ptr [edx]
00406D6F . 42 inc edx
00406D70 . 8807 mov byte ptr [edi], al
00406D72 . 47 inc edi
00406D73 . 49 dec ecx
00406D74 .^ 75 F7 jnz short 00406D6D //看这`有两个跳转呢!没办法了`只好让它往回跳了`为啥?有人会说我们可以F4到下面,要往回跳再F4再到下面`这样行么`?你们试试看就知道`程序马上就运行起来了~不过可以发现00406d6b那个跳转可以跳过这里`所以就让它往回跳吧`待某一时刻就可以跳过这里了,F4到下面那个无条件跳转,让它跳
00406D76 .^ E9 63FFFFFF jmp 00406CDE //这个
00406D7B 90 nop
00406D7C > 8B02 mov eax, dword ptr [edx] //跳过之后会在这
00406D7E . 83C2 04 add edx, 4
00406D81 . 8907 mov dword ptr [edi], eax
00406D83 . 83C7 04 add edi, 4
00406D86 . 83E9 04 sub ecx, 4
00406D89 .^ 77 F1 ja short 00406D7C //这个要跳,F4到下面
00406D8B . 01CF add edi, ecx
00406D8D .^ E9 4CFFFFFF jmp 00406CDE //这个也要跳`F4再到下面
00406D92 > 5E pop esi
00406D93 . 89F7 mov edi, esi
00406D95 . B9 64000000 mov ecx, 64
00406D9A > 8A07 mov al, byte ptr [edi]
00406D9C . 47 inc edi
00406D9D . 2C E8 sub al, 0E8
00406D9F > 3C 01 cmp al, 1
00406DA1 .^ 77 F7 ja short 00406D9A //要跳了`再F4
00406DA3 . 803F 01 cmp byte ptr [edi], 1
00406DA6 .^ 75 F2 jnz short 00406D9A
00406DA8 . 8B07 mov eax, dword ptr [edi]
00406DAA . 8A5F 04 mov bl, byte ptr [edi+4]
00406DAD . 66:C1E8 08 shr ax, 8
00406DB1 . C1C0 10 rol eax, 10
00406DB4 . 86C4 xchg ah, al
00406DB6 . 29F8 sub eax, edi
00406DB8 . 80EB E8 sub bl, 0E8
00406DBB . 01F0 add eax, esi
00406DBD . 8907 mov dword ptr [edi], eax
00406DBF . 83C7 05 add edi, 5
00406DC2 . 89D8 mov eax, ebx
00406DC4 .^ E2 D9 loopd short 00406D9F //这是个循环`F4跳到下面去
00406DC6 . 8DBE 00400000 lea edi, dword ptr [esi+4000]
00406DCC > 8B07 mov eax, dword ptr [edi]
00406DCE . 09C0 or eax, eax
00406DD0 . 74 45 je short 00406E17
00406DD2 . 8B5F 04 mov ebx, dword ptr [edi+4]
00406DD5 . 8D8430 086900>lea eax, dword ptr [eax+esi+6908]
00406DDC . 01F3 add ebx, esi
00406DDE . 50 push eax
00406DDF . 83C7 08 add edi, 8
00406DE2 . FF96 6C690000 call dword ptr [esi+696C]
00406DE8 . 95 xchg eax, ebp
00406DE9 > 8A07 mov al, byte ptr [edi]
00406DEB . 47 inc edi
00406DEC . 08C0 or al, al
00406DEE .^ 74 DC je short 00406DCC
00406DF0 . 89F9 mov ecx, edi
00406DF2 . 79 07 jns short 00406DFB
00406DF4 . 0FB707 movzx eax, word ptr [edi]
00406DF7 . 47 inc edi
00406DF8 . 50 push eax
00406DF9 . 47 inc edi
00406DFA B9 db B9
00406DFB . 57 push edi
00406DFC . 48 dec eax
00406DFD . F2:AE repne scas byte ptr es:[edi]
00406DFF . 55 push ebp
00406E00 . FF96 70690000 call dword ptr [esi+6970]
00406E06 . 09C0 or eax, eax
00406E08 . 74 07 je short 00406E11
00406E0A . 8903 mov dword ptr [ebx], eax
00406E0C . 83C3 04 add ebx, 4
00406E0F .^ EB D8 jmp short 00406DE9 //这里,看到没`那个下面的popad,我们F4直接到popad那去
00406E11 > FF96 74690000 call dword ptr [esi+6974]
00406E17 > 61 popad //这个,够熟悉了吧~~
00406E18 .- E9 D3ABFFFF jmp 004019F0 //`夸段了`让它跳
004019F0 55 push ebp //上面就会跳到这`好了`我们已经执行过pushad和popad了,就在这里用OD的Dump插件就可以了!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
壳脱完了`不懂?我也不懂`西西`~不懂看下动画吧!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
算法分析:
虽然在程序点注册得不到任何错误信息`,不过正确信息总一定有吧`所以我们就
Ultra String Reference->Find ASCII->找到一个Vrey good~字眼~这分明就是成功信息嘛`呵,
往上看就整体的断在这里吧:
004015E0 6A FF push -1
004015E2 68 C81C4000 push 00401CC8
004015E7 64:A1 00000000 mov eax, dword ptr fs:[0]
004015ED 50 push eax
004015EE 64:8925 0000000>mov dword ptr fs:[0], esp
004015F5 51 push ecx
004015F6 53 push ebx
004015F7 56 push esi
004015F8 57 push edi
004015F9 8BF9 mov edi, ecx
004015FB 6A 01 push 1
004015FD E8 74030000 call ---->这个地方取name了
00401602 8D4C24 0C lea ecx, dword ptr [esp+C]
00401606 E8 5F030000 call
0040160B 8B47 68 mov eax, dword ptr [edi+68]--------->把name传给eax
0040160E C74424 18 00000>mov dword ptr [esp+18], 0
00401616 8B48 F8 mov ecx, dword ptr [eax-8]---------->name长度传给ecx了
00401619 85C9 test ecx, ecx
0040161B 7F 12 jg short 0040162F
0040161D 68 18314000 push 00403118
00401622 8D4F 60 lea ecx, dword ptr [edi+60]
00401625 E8 3A030000 call
0040162A E9 0C010000 jmp 0040173B
0040162F 8B57 64 mov edx, dword ptr [edi+64]-------->假码传给edx
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!