首页
社区
课程
招聘
[求助]一个crackme遇到的问题,请大家来指点一下。
发表于: 2014-5-26 04:16 5581

[求助]一个crackme遇到的问题,请大家来指点一下。

2014-5-26 04:16
5581
程序会在输入序列号时创建新线程计算序列号是否正确,结果保存在一个全局变量中,点击按钮里根据全局变量结果从资源中加载字符串提示。
下面是算法部分
.text:00401000 ; DWORD __stdcall StartAddress(LPVOID)
.text:00401000 StartAddress    proc near               ; DATA XREF: DialogFunc+CBo
.text:00401000
.text:00401000 var_1           = byte ptr -1
.text:00401000
.text:00401000                 push    ebp
.text:00401001                 mov     ebp, esp
.text:00401003                 add     esp, 0FFFFFFFCh
.text:00401006                 push    ebx
.text:00401007                 push    esi
.text:00401008                 push    edi
.text:00401009                 pusha
.text:0040100A                 mov     ebx, offset szSerial
.text:0040100F                 mov     ebp, offset szSerial
.text:00401014                 movzx   eax, len
.text:0040101B                 movzx   edx, len
.text:00401022                 cmp     eax, 6                      ;序列号长度不得小于6
.text:00401025                 jb      loc_4010BD
.text:0040102B                 mov     esi, edx                    ;序列号个数是否是双数,不是双
.text:0040102D                 mov     ecx, 2                       ;数取序列号第2个字母补到最后
.text:00401032                 div     cl
.text:00401034                 or      ah, ah
.text:00401036                 jz      short loc_401048
.text:00401038                 add     al, 1
.text:0040103A                 movzx   ecx, al
.text:0040103D                 mov     [ebp+var_1], al
.text:00401040                 mov     al, [ebx+1]
.text:00401043                 mov     [edx+ebp], al
.text:00401046                 jmp     short loc_401051
.text:00401048 ; ---------------------------------------------------------------------------
.text:00401048
.text:00401048 loc_401048:                             ; CODE XREF: StartAddress+36j
.text:00401048                 movzx   ecx, al
.text:0040104B                 mov     [ebp+var_1], al
.text:0040104E                 sub     esi, 1
.text:00401051
.text:00401051 loc_401051:                             ; CODE XREF: StartAddress+46j
.text:00401051                 xor     eax, eax                             ;清零,保存计算结果
.text:00401053                 push    ebp
.text:00401054                 jmp     short loc_401067
.text:00401056 ; ---------------------------------------------------------------------------
.text:00401056
.text:00401056 loc_401056:                             ; CODE XREF: StartAddress+6Aj
.text:00401056                 movzx   edx, byte ptr [ebx]
.text:00401059                 movzx   edi, byte ptr [esi+ebp]    ;序列号第1位与倒数第1位
.text:0040105D                 xor     edx, edi                              ;异或,并累加到eax中
.text:0040105F                 add     eax, edx                             ;eax *= ecx;
.text:00401061                 imul    eax, ecx                              ;ecx=序列号长度/2
.text:00401064                 inc     ebx                                       ;下一位序列号
.text:00401065                 dec     ebp                                      ;前一位序列号
.text:00401066                 dec     ecx                                      ;递减ecx
.text:00401067
.text:00401067 loc_401067:                             ; CODE XREF: StartAddress+54j
.text:00401067                 cmp     ecx, 1
.text:0040106A                 jnb     short loc_401056
.text:0040106C                 cmp     eax, 66h                      ;计算结果为66h,159h,0e8h
.text:0040106F                 jz      short loc_40107F            ;时,序列号正确
.text:00401071                 cmp     eax, 159h
.text:00401076                 jz      short loc_40107F
.text:00401078                 cmp     eax, 0EBh
.text:0040107D                 jnz     short loc_401088
.text:0040107F
.text:0040107F loc_40107F:                             ; CODE XREF: StartAddress+6Fj
.text:0040107F                                         ; StartAddress+76j
.text:0040107F                 mov     byte_4030D5, 1           ;设置正确标志
.text:00401086                 jmp     short loc_40108F
.text:00401088 ; ---------------------------------------------------------------------------
.text:00401088
.text:00401088 loc_401088:                             ; CODE XREF: StartAddress+7Dj
.text:00401088                 mov     byte_4030D5, 0
.text:0040108F
.text:0040108F loc_40108F:                             ; CODE XREF: StartAddress+86j
.text:0040108F                 pop     ebp
.text:00401090                 mov     cl, [ebp+var_1]
.text:00401093                 mov     ebx, offset szSerial
.text:00401098                 mov     ebp, offset szSerial
.text:0040109D                 jmp     short loc_4010B6
.text:0040109F ; ---------------------------------------------------------------------------
.text:0040109F
.text:0040109F loc_40109F:                             ; CODE XREF: StartAddress+B9j
.text:0040109F                 movzx   edx, byte ptr [ebx]          ;序列号第1位与倒数第1位
.text:004010A2                 movzx   edi, byte ptr [esi+ebp]    ;第2位与倒数第2位.......
.text:004010A6                 cmp     edx, edi                             ;不能相同
.text:004010A8                 jnz     short loc_4010B3
.text:004010AA                 mov     byte_4030D5, 0
.text:004010B1                 jmp     short loc_4010C4
.text:004010B3 ; ---------------------------------------------------------------------------
.text:004010B3
.text:004010B3 loc_4010B3:                             ; CODE XREF: StartAddress+A8j
.text:004010B3                 inc     ebx
.text:004010B4                 dec     ebp
.text:004010B5                 dec     ecx
.text:004010B6
.text:004010B6 loc_4010B6:                             ; CODE XREF: StartAddress+9Dj
.text:004010B6                 cmp     ecx, 1
.text:004010B9                 jnb     short loc_40109F
.text:004010BB                 jmp     short loc_4010C4
.text:004010BD ; ---------------------------------------------------------------------------
.text:004010BD
.text:004010BD loc_4010BD:                             ; CODE XREF: StartAddress+25j
.text:004010BD                 mov     byte_4030D5, 0
.text:004010C4
.text:004010C4 loc_4010C4:                             ; CODE XREF: StartAddress+B1j
.text:004010C4                                         ; StartAddress+BBj
.text:004010C4                 popa
.text:004010C5                 pop     edi
.text:004010C6                 pop     esi
.text:004010C7                 pop     ebx
.text:004010C8                 leave
.text:004010C9                 retn    4
.text:004010C9 StartAddress    endp

基本算法就这样了,暴破改全局变量就行了,可是不知道要怎样找出正确的序列号,请大家指点一下。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 435
活跃值: (1282)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
2
AAABdCCC
AAACeCCC
AAADbCCC
AAAEcCCC
AAAHnCCC
AAAIoCCC
AAAJlCCC
AAAKmCCC
AAALjCCC
AAAMkCCC
AAANhCCC
AAAOiCCC
AAAPvCCC
AAAQwCCC
AAARtCCC
AAASuCCC
AAATrCCC
AAAUsCCC
AAAVpCCC
AAAWqCCC
AAAbDCCC
AAAcECCC
AAAdBCCC
AAAeCCCC
AAAhNCCC
AAAiOCCC
AAAjLCCC
AAAkMCCC
AAAlJCCC
AAAmKCCC
AAAnHCCC
AAAoICCC
AAApVCCC
AAAqWCCC
AAArTCCC
AAAsUCCC
AAAtRCCC
AAAuSCCC
AAAvPCCC
AAAwQCCC
2014-5-26 10:32
0
雪    币: 508
活跃值: (202)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
3
00401056  |> /0FB613        /movzx edx,byte ptr ds:[ebx]             ;  从头取一个字节
00401059  |. |0FB63C2E      |movzx edi,byte ptr ds:[esi+ebp]         ;  从尾部取字节
0040105D  |. |33D7          |xor edx,edi                             ;  把取出的字符异或
0040105F  |. |03C2          |add eax,edx                             ;  把异或结果累加
00401061  |. |0FAFC1        |imul eax,ecx                            ;  ECX存放的注册码长度一半
00401064  |. |43            |inc ebx                                 ;  CrackMe.0040300C
00401065  |. |4D            |dec ebp                                 ;  CrackMe.0040300C
00401066  |. |49            |dec ecx
00401067  |> |83F9 01        cmp ecx,0x1
0040106A  |.^\73 EA         \jnb short CrackMe.00401056
0040106C  |.  83F8 66       cmp eax,0x66                             ;  --------------------->
0040106F  |.  74 0E         je short CrackMe.0040107F
00401071  |.  3D 59010000   cmp eax,0x159                            ;  比铰EAX的算法值是不是0x66 0x159  

0xEB是就注册成
00401076  |.  74 07         je short CrackMe.0040107F
00401078  |.  3D EB000000   cmp eax,0xEB                             ;  <-----------------------------
0040107D  |.  75 09         jnz short CrackMe.00401088
0040107F  |>  C605 D5304000>mov byte ptr ds:[0x4030D5],0x1
00401086  |.  EB 07         jmp short CrackMe.0040108F
00401088  |>  C605 D5304000>mov byte ptr ds:[0x4030D5],0x0
0040108F  |>  5D            pop ebp                                  ;  0012FB74
00401090  |.  8A4D FF       mov cl,byte ptr ss:[ebp-0x1]
00401093  |.  BB 0C304000   mov ebx,CrackMe.0040300C                 ;  ASCII "4440V444"
00401098  |.  BD 0C304000   mov ebp,CrackMe.0040300C                 ;  ASCII "4440V444"
0040109D  |.  EB 17         jmp short CrackMe.004010B6
0040109F  |>  0FB613        /movzx edx,byte ptr ds:[ebx]             ;  --------------->
004010A2  |.  0FB63C2E      |movzx edi,byte ptr ds:[esi+ebp]         ;  防止人为构构间单注册码
004010A6  |.  3BD7          |cmp edx,edi
004010A8  |.  75 09         |jnz short CrackMe.004010B3
004010AA  |.  C605 D5304000>|mov byte ptr ds:[0x4030D5],0x0
004010B1  |.  EB 11         |jmp short CrackMe.004010C4
004010B3  |>  43            |inc ebx                                 ;  CrackMe.0040300C
004010B4  |.  4D            |dec ebp                                 ;  CrackMe.0040300C
004010B5  |.  49            |dec ecx
004010B6  |>  83F9 01        cmp ecx,0x1
004010B9  |.^ 73 E4         \jnb short CrackMe.0040109F              ;  <-----------------------------
004010BB  |.  EB 07         jmp short CrackMe.004010C4
从分析代码来看注册码是个8位数的字串
以EAX=0x66  //  十进制为102
cmp eax,0x66
从上位算法来看头尾的字符不可以相同,也算法来我们可构造注册码前面首尾异或结果为1,那么按算法来算最后一次导或

结果为0x46 (70) .
0x66-(((0x1+0)*4+1)*3+1)*2 = 0x46
那我就用一个随机的数3吧
1. 首先搞定前面三对吧!我是把0x30(就是十进制0)异或 0x31 (就是十进制1)
2. 这样经过前面三次运算就得到最后一次异或结果是0x46就可以了
3.只你随用一个字符与0x46异或就可得到注册码最后一位如:
我用的是0x33(3) XOR 0x46 = 0x75(u)那么0003u111这个注码是可用的.
当然用0x34(4)  XOR 0x46 = 0x72(r) 那注册码就是0004r111了
上传的附件:
2014-5-26 13:48
0
雪    币: 435
活跃值: (1282)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=wangweilll;1287652]00401056  |> /0FB613        /movzx edx,byte ptr ds:[ebx]             ;  从头取一个字节
00401059  |. |0FB63C2E      |movzx edi,byte ptr ds:[esi+ebp]         ...[/QUOTE]

看来你跟我一样懒,连构造方法都一样哈哈哈
2014-5-26 14:04
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
分析明白了,就是不会写出来
2014-5-26 15:01
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
应该是对称的字符串不可以相同
2014-5-26 15:02
0
雪    币: 435
活跃值: (1282)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
7
1,长度为6以上的偶数
2,从n=1开始依次求第n位和倒数第n位异或结果,并累加,同时会自乘n
3,第n位和倒数第n位不能相同,这是为了防止构造特例

按照这规则,就可以构造些比较简单的情况了
比如0^1=1,就比较好算,或者我的A^C=2,也好算
算到最后一位,离0x66还差多少
找两个可见字符异或结果符合上述差值的就行了

这是一种方法了,其他方法也行
2014-5-26 15:17
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
8
学习了~~
2014-5-26 15:51
0
雪    币: 508
活跃值: (202)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
9
2014-5-26 18:43
0
雪    币: 443
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=wangweilll;1287652]00401056  |> /0FB613        /movzx edx,byte ptr ds:[ebx]             ;  从头取一个字节
00401059  |. |0FB63C2E      |movzx edi,byte ptr ds:[esi+ebp]         ...[/QUOTE]

感谢wangweilll的详细解说,根据wangweilll的方法成功找到序列号。
序列号:00o111

发现一篇算法的CrackMe帖子,里面很多crackme都没人破,大家一起去研究,把破文发上来一起学习吧。
http://bbs.pediy.com/showthread.php?t=47488
2014-5-27 01:59
0
雪    币: 508
活跃值: (202)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
11
按你给的链接下了一下,发现算法很间单.可以直接从他程序扣代码做成注冊机.....
我的方法最间单,利用程序本身注册机制.让它自已显示出来.如图........
随机输入一串字符:

提示框中就是注码了:
上传的附件:
2014-5-27 07:49
0
雪    币: 443
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这个已经有人发详细破文出来了,链接下面还有很多算法crackme,层主有空的话去看看下面那些,再发些破文给大家学习。
2014-5-28 17:14
0
游客
登录 | 注册 方可回帖
返回
//