重新发一贴,一开始的答案不符合规则
首先我的第一想法是搜索ASCII码,第一感觉发现没有什么提示。 然后想到对MessageBox下断点,然后运行程序,输入用户名和假码,点击注册,发现并没有断下来。 查了下,此程序是VC的,想下按钮事件,sub eax,0a,也没有找到
然后返回去去看搜索的ASCII码,找找看。
将error处上面临近的跳转下断。 每个error处都下上断点。运行的时候再去掉无用的断点。 点击运行程序,输入用户名和假码,点击register,发现断下来了,单步跟踪一下
找到这里 [Asm] 纯文本查看 复制代码 0040285F 8D4C24 6C lea ecx,dword ptr ss:[esp+0x6C]
00402863 51 push ecx ; 假码
00402864 8B4C24 18 mov ecx,dword ptr ss:[esp+0x18]
00402868 8D5424 3C lea edx,dword ptr ss:[esp+0x3C] ; 用户名
0040286C 52 push edx
0040286D 51 push ecx
0040286E FFD0 call eax ; 这里进去应该就是判断+算法 跟入call eax
继续单步,发现到了这里,单步完后,程序跑起来了,提示注册失败 [Asm] 纯文本查看 复制代码 10001E9D 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
10001EA0 52 push edx
10001EA1 E8 9AFEFFFF call 10001D40 发现此时的ebx为刚才输入的假码
接着跟入这个CALL,发现了惊喜: [Asm] 纯文本查看 复制代码 10001DF3 837D FC 08 cmp dword ptr ss:[ebp-0x4],0x8
10001DF7 75 1C jnz short 10001E15
10001DF9 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
10001DFC 6A 40 push 0x40
10001DFE 68 1C880010 push 0x1000881C ; ASCII "吾爱破解2014CrackMe大赛"
10001E03 68 38880010 push 0x10008838 ; ASCII "恭喜你,注册成功,请提交答案到答题区吧!"
10001E08 50 push eax
10001E09 FF15 E0700010 call dword ptr ds:[0x100070E0] ; user32.MessageBoxA
10001E0F 5F pop edi
下断点运行到此处 [Asm] 纯文本查看 复制代码 10001DF7 /75 1C jnz short 10001E15;将这里nop掉 运行程序,发现成功~ 发现这里的跳转修改掉之后,不能在此保存文件,故想到将在主线程中的代码copy出来,放到CrackMe模块的没有用的地方
复制是将该CALL的整个段都复制。
首先跟入这个段 [Asm] 纯文本查看 复制代码 0040286E FFD0 call eax 将整段代码二进制复制 找到一处空白处选择二进制粘贴,为了解释方便现起名为段1 然后跟入 [Asm] 纯文本查看 复制代码 10001EA1 E8 9AFEFFFF call 10001D40 同上复制到一处空白处,起名段2 好了,现在弄一下修复一下段1和段2这两个段之间的逻辑关系 段1中的源代码call 10001D40本是跳转到段2的 ,现在段2的段首地址改变,故改成 [Asm] 纯文本查看 复制代码 call 段2首地址 然后更改程序让程序进入段1, 源程序是call eax, eax为段1的原来的首地址,现在首地址改变,故应该更改eax,所以找到call eax上的最近的call, [Asm] 纯文本查看 复制代码 00402838 56 push esi
00402839 8D4424 20 lea eax,dword ptr ss:[esp+0x20]
0040283D E8 7EEAFFFF call CrackMe1.004012C0
00402842 85C0 test eax,eax
00402844 75 19 jnz short CrackMe1.0040285F
00402846 8B4424 14 mov eax,dword ptr ss:[esp+0x14]
0040284A 6A 10 push 0x10
0040284C 68 98B44000 push CrackMe1.0040B498 ; 吾爱破解2014CrackMe大赛 跟随进0040283D E8 7EEAFFFF call CrackMe1.004012C0 将该段改为: [Asm] 纯文本查看 复制代码 Mov eax,段1首地址
Retn 0x4 保存一下文件, 复制出来的两个段 [Asm] 纯文本查看 复制代码 00408E18 00 db 00
00408E19 55 push ebp
00408E1A 8BEC mov ebp,esp
00408E1C 8B4D 0C mov ecx,dword ptr ss:[ebp+0xC]
00408E1F E8 DC81BF0F call 10001000
00408E24 85C0 test eax,eax
00408E26 75 1A jnz XCrackMe.00408E42
00408E28 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
00408E2B 6A 10 push 0x10
00408E2D 68 1C880010 push 0x1000881C
00408E32 68 80880010 push 0x10008880
00408E37 50 push eax
00408E38 FF15 E0700010 call dword ptr ds:[0x100070E0] ; USER32.MessageBoxA
00408E3E 5D pop ebp
00408E3F C2 0C00 retn 0xC
00408E42 53 push ebx
00408E43 E8 1888BF0F call 10001660
00408E48 8B5D 10 mov ebx,dword ptr ss:[ebp+0x10]
00408E4B 8BC3 mov eax,ebx
00408E4D 8D50 01 lea edx,dword ptr ds:[eax+0x1]
00408E50 8A08 mov cl,byte ptr ds:[eax]
00408E52 40 inc eax
00408E53 84C9 test cl,cl
00408E55 ^ 75 F9 jnz XCrackMe.00408E50
00408E57 2BC2 sub eax,edx
00408E59 75 1B jnz XCrackMe.00408E76
00408E5B 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8]
00408E5E 6A 10 push 0x10
00408E60 68 1C880010 push 0x1000881C
00408E65 68 9C880010 push 0x1000889C
00408E6A 51 push ecx
00408E6B FF15 E0700010 call dword ptr ds:[0x100070E0] ; USER32.MessageBoxA
00408E71 5B pop ebx
00408E72 5D pop ebp
00408E73 C2 0C00 retn 0xC
00408E76 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
00408E79 52 push edx
00408E7A E8 11000000 call CrackMe.00408E90
00408E7F 83C4 04 add esp,0x4
00408E82 5B pop ebx
00408E83 5D pop ebp
00408E84 C2 0C00 retn 0xC
00408E87 00 db 00
00408E88 00 db 00
00408E89 00 db 00
00408E8A 00 db 00
00408E8B 00 db 00
00408E8C 00 db 00
00408E8D 00 db 00
00408E8E 00 db 00
00408E8F 00 db 00
00408E90 55 push ebp
00408E91 8BEC mov ebp,esp
00408E93 83EC 08 sub esp,0x8
00408E96 56 push esi
00408E97 33F6 xor esi,esi
00408E99 57 push edi
00408E9A 33C9 xor ecx,ecx
00408E9C 8D6424 00 lea esp,dword ptr ss:[esp]
00408EA0 B8 4FECC44E mov eax,0x4EC4EC4F
00408EA5 F7E1 mul ecx
00408EA7 C1EA 02 shr edx,0x2
00408EAA 6BD2 0D imul edx,edx,0xD
00408EAD 8BC1 mov eax,ecx
00408EAF 2BC2 sub eax,edx
00408EB1 40 inc eax
00408EB2 C704CD 50E800>mov dword ptr ds:[ecx*8+0x1000E850],0x1
00408EBD 8904CD 54E800>mov dword ptr ds:[ecx*8+0x1000E854],eax
00408EC4 41 inc ecx
00408EC5 83F9 68 cmp ecx,0x68
00408EC8 ^ 72 D6 jb XCrackMe.00408EA0
00408ECA E8 F187BF0F call 100016C0
00408ECF E8 0C89BF0F call 100017E0
00408ED4 8BC3 mov eax,ebx
00408ED6 8D50 01 lea edx,dword ptr ds:[eax+0x1]
00408ED9 8DA424 000000>lea esp,dword ptr ss:[esp]
00408EE0 8A08 mov cl,byte ptr ds:[eax]
00408EE2 40 inc eax
00408EE3 84C9 test cl,cl
00408EE5 ^ 75 F9 jnz XCrackMe.00408EE0
00408EE7 2BC2 sub eax,edx
00408EE9 A8 01 test al,0x1
00408EEB 74 21 je XCrackMe.00408F0E
00408EED 68 34880010 push 0x10008834
00408EF2 68 24100000 push 0x1024
00408EF7 53 push ebx
00408EF8 E8 CA8FBF0F call 10001EC7
00408EFD 8BC3 mov eax,ebx
00408EFF 83C4 0C add esp,0xC
00408F02 8D50 01 lea edx,dword ptr ds:[eax+0x1]
00408F05 8A08 mov cl,byte ptr ds:[eax]
00408F07 40 inc eax
00408F08 84C9 test cl,cl
00408F0A ^ 75 F9 jnz XCrackMe.00408F05
00408F0C 2BC2 sub eax,edx
00408F0E D1E8 shr eax,1
00408F10 C745 F8 05000>mov dword ptr ss:[ebp-0x8],0x5
00408F17 8975 FC mov dword ptr ss:[ebp-0x4],esi
00408F1A 8BF8 mov edi,eax
00408F1C 74 47 je XCrackMe.00408F65
00408F1E 8BFF mov edi,edi
00408F20 0FBE0473 movsx eax,byte ptr ds:[ebx+esi*2]
00408F24 8D4D F8 lea ecx,dword ptr ss:[ebp-0x8]
00408F27 51 push ecx
00408F28 0FBE4C73 01 movsx ecx,byte ptr ds:[ebx+esi*2+0x1]
00408F2D E8 7E8CBF0F call 10001BB0
00408F32 8D55 FC lea edx,dword ptr ss:[ebp-0x4]
00408F35 52 push edx
00408F36 E8 258DBF0F call 10001C60
00408F3B 46 inc esi
00408F3C 83C4 08 add esp,0x8
00408F3F 3BF7 cmp esi,edi
00408F41 ^ 72 DD jb XCrackMe.00408F20
00408F43 837D FC 08 cmp dword ptr ss:[ebp-0x4],0x8
00408F47 90 nop
00408F48 90 nop
00408F49 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
00408F4C 6A 40 push 0x40
00408F4E 68 1C880010 push 0x1000881C
00408F53 68 38880010 push 0x10008838
00408F58 50 push eax
00408F59 FF15 E0700010 call dword ptr ds:[0x100070E0] ; USER32.MessageBoxA
00408F5F 5F pop edi
00408F60 5E pop esi
00408F61 8BE5 mov esp,ebp
00408F63 5D pop ebp
00408F64 C3 retn
00408F65 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8]
00408F68 6A 10 push 0x10
00408F6A 68 1C880010 push 0x1000881C
00408F6F 68 60880010 push 0x10008860
00408F74 51 push ecx
00408F75 FF15 E0700010 call dword ptr ds:[0x100070E0] ; USER32.MessageBoxA
00408F7B 5F pop edi
00408F7C 5E pop esi
00408F7D 8BE5 mov esp,ebp
00408F7F 5D pop ebp
00408F80 C3 retn 按照上面的原理找到 [Asm] 纯文本查看 复制代码 00408F3F 3BF7 cmp esi,edi
00408F41 ^ 72 DD jb XCrackMe.00408F20
00408F43 837D FC 08 cmp dword ptr ss:[ebp-0x4],0x8
00408F47 90 nop
00408F48 90 nop
00408F49 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
00408F4C 6A 40 push 0x40 这几句代码 将原来的那个jnz跳转nop掉即可,保存爆破文件。 附上爆破文件 第一次玩这个,如果有错误,请不吝赐教{:1_931:}
|