枫笑九洲 发表于 2018-2-24 16:56

一个论坛大牛的crackme

【文章标题】: 一个论坛大牛的crackme
【文章作者】: 就是我自己
【下载地址】: https://www.52pojie.cn/thread-642649-1-1.html
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
一路磕磕碰碰,总算出来了。

载入,输入注册码12345678,下易语言按钮事件:FF 55 FC 5F 5E,F9走起:
0041AC6D|> \FF55 FC       call                                           ;CrackMe.0040105B
0041AC70|.5F            pop edi                                                 ;00A25518
0041AC71|.5E            pop esi                                                 ;00A25518
0041AC72|.895D F4       mov ,ebx

1、第一处判断:

0040105B/.55            push ebp
0040105C|.8BEC          mov ebp,esp
0040105E|.81EC 40000000 sub esp,0x40
00401064|.C745 FC 00000>mov ,0x0
0040106B|.C745 F8 00000>mov ,0x0
00401072|.C745 F4 00000>mov ,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 ,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,
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:
0040113F|>8945 EC       mov ,eax                                       ;eax不等于5就死
00401142|.837D EC 05    cmp ,0x5
00401146|.0F84 41000000 je CrackMe.0040118D

注册码改成123-123-123-123-123

2、第二处判断
004011C8|.E8 15070000   call CrackMe.004018E2                                 ;第二个
004011CD|.83C4 10       add esp,0x10
004011D0|.8945 EC       mov ,eax
004011D3|.8D45 FC       lea eax,
004011D6|.50            push eax
004011D7|.68 40000000   push 0x40
004011DC|.68 04000000   push 0x4
004011E1|.FF75 EC       push                                           ;CrackMe.00483CB5
004011E4|.B8 00000000   mov eax,0x0
004011E9|.E8 00070000   call CrackMe.004018EE
004011EE|.8945 E4       mov ,eax
004011F1|.837D E4 00    cmp ,0x0
004011F5|.0F85 41000000 jnz CrackMe.0040123C                                    ;如果强行改jmp,下面会出现内存不可读的错误

根据004011D0 和内存不可读的那里,可知道,注册码第一项的16进制应该是内存中的地址,所以我们假定一个:

4321123-123-123-123-123,这样就可以过了第二处验证,继续跟:

3、继续向下

0040125E|.8B5D F0       mov ebx,                                       ;第二段注册码送ebx
00401261|.8B03          mov eax,dword ptr ds:
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,
004012C1|.8B03          mov eax,dword ptr ds:
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,                                    ;CrackMe.004147F6
00401321|.8B03          mov eax,dword ptr ds:
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,
00401381|.8B03          mov eax,dword ptr ds:
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                                 ;第五段

一直向下,来到这里

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单步到这
004023F0   .57            push edi
004023F1   .8B7C24 10   mov edi,dword ptr ss:
004023F5   .8B47 08       mov eax,dword ptr ds:
004023F8   .8BC8          mov ecx,eax
004023FA   .C1E8 1D       shr eax,0x1D

F8向下走

********

00402466   .C1E9 02       shr ecx,0x2
00402469   .F3:A5         rep movs dword ptr es:,dword ptr ds:          ;
0040246B   .8BCA          mov ecx,edx
0040246D   .83E1 03       and ecx,0x3
00402470   .F3:A4         rep movs byte ptr es:,byte ptr ds:

********

这里注意00402469,这里是把ds:里面的数据copy到自己乱写的地址处,而ds:里的数据是什么呢?
看数据窗口
ds:==7B7B7B7B    ,发现了吗就是我们后面四段的数据,改成10进制就是123123123123
es:==52FF6A14

暂时不知道这里什么用,我们F8接着向下走,来到

00401521|.68 04000000   push 0x4
00401526|.FF75 EC       push                                           ;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:
0040179E|.8B0B          mov ecx,dword ptr ds:
004017A0|.41            inc ecx

一直来到

00401807|.DD45 E8       fld qword ptr ss:                           ;把ss:浮点数弹到ST0
0040180A|.DC05 B13C4800 fadd qword ptr ds:                            ;ST0里的浮点数加上ds:里的浮点数
00401810|.DD5D E0       fstp qword ptr ss:
00401813|.DD45 E0       fld qword ptr ss:
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:
00401771|.66:8B45 FE    mov ax,word ptr ss:
00401775|.80CC 0C       or ah,0xC
00401778|.66:8945 FC    mov word ptr ss:,ax
0040177C|.D96D FC       fldcw word ptr ss:
0040177F|.DF7D F4       fistp qword ptr ss:                            ;把ST0弹到ss:
00401782|.D96D FE       fldcw word ptr ss:
00401785|.8B45 F4       mov eax,                                       ;把ss:的值给eax
00401788|.8B55 F8       mov edx,                                       ;CrackMe.0041EF63
0040178B|.8BE5          mov esp,ebp
0040178D|.5D            pop ebp
0040178E\.C3            retn

向下走

00401538|.8945 EC       mov ,eax                                       ;CrackMe.0041EF65
0040153B|.837D EC 01    cmp ,0x1
0040153F|.0F84 41000000 je CrackMe.00401586                                     ;eax与1比较,不为1就死

还记得eax现在是什么值吗?对了,就是00401785处给他赋的值,也就是st0的值,那怎么办呢?

还记得*****段的copy语句吗?是的,我们只要把我们注册码第一段的地址改成483CB1+4(双精度高8位)处,不就可以改ds:里面的数值了吗?

那数值改成多少呢?

现在我们第一位注册码为483CB5,十进制是4734133,他要加上那个数值第于1,就可以通过,那么我们就改那个数值为-4734132,换成浮点数是:C1520F2D00000000

他的高8位在内存中的写应该是 2D 0F 52 C1 这与就是代表了我们后面四段的注册码,

所以注册码连起来就是4734133-45-15-82-193

------------------------------------------------------------------------------

                                                       2018年02月24日 16:54:40

就是随便看看 发表于 2018-3-11 00:01

枫笑九洲 发表于 2018-2-24 17:00
注册码不止一个
4734133-45-271-82-449也行,后面四段只要低2位符合规律都成


根据004011D0 和内存不可读的那里,可知道,注册码第一项的16进制应该是内存中的地址,
这段话不理解

就是随便看看 发表于 2018-2-26 10:58

枫笑九洲 发表于 2018-2-24 17:00
注册码不止一个
4734133-45-271-82-449也行,后面四段只要低2位符合规律都成

大佬,第二个验证不太明白是怎么来的

枫笑九洲 发表于 2018-2-24 17:00

注册码不止一个
4734133-45-271-82-449也行,后面四段只要低2位符合规律都成

Hmily 发表于 2018-2-24 17:27

代码可以用代码框处理一下,会好看很多。

小火龙 发表于 2018-2-24 18:23

谢谢分享,学习一下!

雪.|有妳、 发表于 2018-2-24 18:47

谢谢分享 学习

vanapple1 发表于 2018-2-24 20:35

云里雾里,好牛掰的

zbnysjwsnd8 发表于 2018-2-24 22:15

厉害 支持一下。

onlyjim 发表于 2018-2-25 11:59

山塘街 发表于 2018-2-25 12:25

谢谢分享,学习一下

linuxprobe 发表于 2018-2-25 13:28

你太谦虚了,像你这种一发帖子就自称大牛的人,我们和你都不是一个档次的。
页: [1] 2
查看完整版本: 一个论坛大牛的crackme