【文章标题】: 一个论坛大牛的crackme
【文章作者】: 就是我自己
【下载地址】: https://www.52pojie.cn/thread-642649-1-1.html
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
一路磕磕碰碰,总算出来了。
载入,输入注册码12345678,下易语言按钮事件:FF 55 FC 5F 5E,F9走起:
[Asm] 纯文本查看 复制代码 0041AC6D |> \FF55 FC call [local.1] ; CrackMe.0040105B
0041AC70 |. 5F pop edi ; 00A25518
0041AC71 |. 5E pop esi ; 00A25518
0041AC72 |. 895D F4 mov [local.3],ebx
1、第一处判断:
[Asm] 纯文本查看 复制代码 0040105B /. 55 push ebp
0040105C |. 8BEC mov ebp,esp
0040105E |. 81EC 40000000 sub esp,0x40
00401064 |. C745 FC 00000>mov [local.1],0x0
0040106B |. C745 F8 00000>mov [local.2],0x0
00401072 |. C745 F4 00000>mov [local.3],0x0
00401079 |. 6A FF push -0x1
0040107B |. 6A 08 push 0x8
0040107D |. 68 04000116 push 0x16010004
00401082 |. 68 01000152 push 0x52010001
00401087 |. E8 68080000 call CrackMe.004018F4 ; 得假码
0040108C |. 83C4 10 add esp,0x10
0040108F |. 8945 F0 mov [local.4],eax
00401092 |. 6A 00 push 0x0
00401094 |. 6A 00 push 0x0
00401096 |. 6A 00 push 0x0
00401098 |. 68 04000080 push 0x80000004
0040109D |. 6A 00 push 0x0
0040109F |. 68 5C3C4800 push CrackMe.00483C5C ; -
004010A4 |. 68 04000080 push 0x80000004
004010A9 |. 6A 00 push 0x0
004010AB |. 8B45 F0 mov eax,[local.4]
004010AE |. 85C0 test eax,eax
004010B0 |. 75 05 jnz short CrackMe.004010B7
004010B2 |. B8 5E3C4800 mov eax,CrackMe.00483C5E
004010B7 |> 50 push eax ; 注册码入栈
004010B8 |. 68 03000000 push 0x3
004010BD |. BB 101D4000 mov ebx,CrackMe.00401D10
004010C2 |. E8 1B080000 call CrackMe.004018E2 ; 计算第一个判断,由- 分段,不是5段死
0040113C |. 8B43 04 mov eax,dword ptr ds:[ebx+0x4]
0040113F |> 8945 EC mov [local.5],eax ; eax不等于5就死
00401142 |. 837D EC 05 cmp [local.5],0x5
00401146 |. 0F84 41000000 je CrackMe.0040118D
注册码改成123-123-123-123-123
2、第二处判断
[Asm] 纯文本查看 复制代码 004011C8 |. E8 15070000 call CrackMe.004018E2 ; 第二个
004011CD |. 83C4 10 add esp,0x10
004011D0 |. 8945 EC mov [local.5],eax
004011D3 |. 8D45 FC lea eax,[local.1]
004011D6 |. 50 push eax
004011D7 |. 68 40000000 push 0x40
004011DC |. 68 04000000 push 0x4
004011E1 |. FF75 EC push [local.5] ; CrackMe.00483CB5
004011E4 |. B8 00000000 mov eax,0x0
004011E9 |. E8 00070000 call CrackMe.004018EE
004011EE |. 8945 E4 mov [local.7],eax
004011F1 |. 837D E4 00 cmp [local.7],0x0
004011F5 |. 0F85 41000000 jnz CrackMe.0040123C ;如果强行改jmp,下面会出现内存不可读的错误
根据004011D0 和内存不可读的那里,可知道,注册码第一项的16进制应该是内存中的地址,所以我们假定一个:
4321123-123-123-123-123,这样就可以过了第二处验证,继续跟:
3、继续向下
[Asm] 纯文本查看 复制代码 0040125E |. 8B5D F0 mov ebx,[local.4] ; 第二段注册码送ebx
00401261 |. 8B03 mov eax,dword ptr ds:[ebx]
00401263 |. 85C0 test eax,eax
00401265 |. 75 05 jnz short CrackMe.0040126C
00401267 |. B8 5E3C4800 mov eax,CrackMe.00483C5E
0040126C |> 50 push eax
0040126D |. 68 01000000 push 0x1
00401272 |. BB E01A4000 mov ebx,CrackMe.00401AE0
00401277 |. E8 66060000 call CrackMe.004018E2 ; 第二段变16进制送al
004012BE |. 8B5D E4 mov ebx,[local.7]
004012C1 |. 8B03 mov eax,dword ptr ds:[ebx]
004012C3 |. 85C0 test eax,eax
004012C5 |. 75 05 jnz short CrackMe.004012CC
004012C7 |. B8 5E3C4800 mov eax,CrackMe.00483C5E
004012CC |> 50 push eax
004012CD |. 68 01000000 push 0x1
004012D2 |. BB E01A4000 mov ebx,CrackMe.00401AE0
004012D7 |. E8 06060000 call CrackMe.004018E2 ; 第三段
0040131E |. 8B5D D8 mov ebx,[local.10] ; CrackMe.004147F6
00401321 |. 8B03 mov eax,dword ptr ds:[ebx]
00401323 |. 85C0 test eax,eax
00401325 |. 75 05 jnz short CrackMe.0040132C
00401327 |. B8 5E3C4800 mov eax,CrackMe.00483C5E
0040132C |> 50 push eax
0040132D |. 68 01000000 push 0x1
00401332 |. BB E01A4000 mov ebx,CrackMe.00401AE0
00401337 |. E8 A6050000 call CrackMe.004018E2 ; 第四段
0040137E |. 8B5D CC mov ebx,[local.13]
00401381 |. 8B03 mov eax,dword ptr ds:[ebx]
00401383 |. 85C0 test eax,eax
00401385 |. 75 05 jnz short CrackMe.0040138C
00401387 |. B8 5E3C4800 mov eax,CrackMe.00483C5E
0040138C |> 50 push eax
0040138D |. 68 01000000 push 0x1
00401392 |. BB E01A4000 mov ebx,CrackMe.00401AE0
00401397 |. E8 46050000 call CrackMe.004018E2 ; 第五段
一直向下,来到这里
[Asm] 纯文本查看 复制代码 004014C2 |. 68 03000000 push 0x3
004014C7 |. BB F0234000 mov ebx,CrackMe.004023F0
004014CC |. E8 11040000 call CrackMe.004018E2 ; 跟进去看看
004014D1 |. 83C4 28 add esp,0x28
F7单步到这
[Asm] 纯文本查看 复制代码 004023F0 . 57 push edi
004023F1 . 8B7C24 10 mov edi,dword ptr ss:[esp+0x10]
004023F5 . 8B47 08 mov eax,dword ptr ds:[edi+0x8]
004023F8 . 8BC8 mov ecx,eax
004023FA . C1E8 1D shr eax,0x1D
F8向下走
********
[Asm] 纯文本查看 复制代码 00402466 . C1E9 02 shr ecx,0x2
00402469 . F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi] ;
0040246B . 8BCA mov ecx,edx
0040246D . 83E1 03 and ecx,0x3
00402470 . F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi]
********
这里注意00402469,这里是把ds:[esi]里面的数据copy到自己乱写的地址处,而ds:[esi]里的数据是什么呢?
看数据窗口
ds:[esi]=[00173BD0]=7B7B7B7B ,发现了吗就是我们后面四段的数据,改成10进制就是123123123123
es:[edi]=[0041EF63]=52FF6A14
暂时不知道这里什么用,我们F8接着向下走,来到
[Asm] 纯文本查看 复制代码 00401521 |. 68 04000000 push 0x4
00401526 |. FF75 EC push [local.5] ; CrackMe.0041EF63
00401529 |. B8 00000000 mov eax,0x0
0040152E |. E8 BB030000 call CrackMe.004018EE
00401533 |. E8 57020000 call CrackMe.0040178F ; 跟进去看看
0040178F /$ 55 push ebp
00401790 |. 8BEC mov ebp,esp
00401792 |. 81EC 20000000 sub esp,0x20
00401798 |. 8B1D C08E4A00 mov ebx,dword ptr ds:[0x4A8EC0]
0040179E |. 8B0B mov ecx,dword ptr ds:[ebx]
004017A0 |. 41 inc ecx
一直来到
[Asm] 纯文本查看 复制代码 00401807 |. DD45 E8 fld qword ptr ss:[ebp-0x18] ; 把ss:[ebp-0x18]浮点数弹到ST0
0040180A |. DC05 B13C4800 fadd qword ptr ds:[0x483CB1] ; ST0里的浮点数加上ds:[0x483CB1]里的浮点数
00401810 |. DD5D E0 fstp qword ptr ss:[ebp-0x20]
00401813 |. DD45 E0 fld qword ptr ss:[ebp-0x20]
00401816 |. E8 4DFFFFFF call CrackMe.00401768 ; 跟进去看看
00401768 /$ 55 push ebp
00401769 |. 8BEC mov ebp,esp
0040176B |. 83C4 F4 add esp,-0xC
0040176E |. D97D FE fstcw word ptr ss:[ebp-0x2]
00401771 |. 66:8B45 FE mov ax,word ptr ss:[ebp-0x2]
00401775 |. 80CC 0C or ah,0xC
00401778 |. 66:8945 FC mov word ptr ss:[ebp-0x4],ax
0040177C |. D96D FC fldcw word ptr ss:[ebp-0x4]
0040177F |. DF7D F4 fistp qword ptr ss:[ebp-0xC] ; 把ST0弹到ss:[ebp-0xC]
00401782 |. D96D FE fldcw word ptr ss:[ebp-0x2]
00401785 |. 8B45 F4 mov eax,[local.3] ; 把ss:[ebp-0xC]的值给eax
00401788 |. 8B55 F8 mov edx,[local.2] ; CrackMe.0041EF63
0040178B |. 8BE5 mov esp,ebp
0040178D |. 5D pop ebp
0040178E \. C3 retn
向下走
[Asm] 纯文本查看 复制代码 00401538 |. 8945 EC mov [local.5],eax ; CrackMe.0041EF65
0040153B |. 837D EC 01 cmp [local.5],0x1
0040153F |. 0F84 41000000 je CrackMe.00401586 ; eax与1比较,不为1就死
还记得eax现在是什么值吗?对了,就是00401785处给他赋的值,也就是st0的值,那怎么办呢?
还记得*****段的copy语句吗?是的,我们只要把我们注册码第一段的地址改成483CB1+4(双精度高8位)处,不就可以改ds:[0x483CB1]里面的数值了吗?
那数值改成多少呢?
现在我们第一位注册码为483CB5,十进制是4734133,他要加上那个数值第于1,就可以通过,那么我们就改那个数值为-4734132,换成浮点数是:C1520F2D00000000
他的高8位在内存中的写应该是 2D 0F 52 C1 这与就是代表了我们后面四段的注册码,
所以注册码连起来就是4734133-45-15-82-193
------------------------------------------------------------------------------
2018年02月24日 16:54:40 |