首页
社区
课程
招聘
一个CRACKME的算法详细跟踪(其关键处不明)
发表于: 2011-5-10 01:44 7499

一个CRACKME的算法详细跟踪(其关键处不明)

2011-5-10 01:44
7499
大家好,我这里有一个CM,按作者的要求是需要写出KEGEN的,所以必须先把其中的算法搞清楚,我想这个算法应该不是很难,不过作为新手的我,由于学习时日尚浅功力欠缺,对于其算法的关键之处还是看不明白,不过我还是凭自己的毅力分析出一些东西,呵呵,应该没问题的(如有不对之处希望能看到这篇帖子的高手能够不吝指教)。
   根据我的调试分析,这个CM对用户名的要求是16个字节,注册码呢要求是17个字节,于是我按照这个要求,用OD载入程序,成功下断,程序断在以下代码处:

004010B5  |.  E8 0F020000   CALL <JMP.&USER32.GetDlgItemTextA>       ; \GetDlgItemTextA
004010BA  |.  0BC0          OR EAX,EAX
004010BC  |.  74 61         JE SHORT cycle.0040111F
004010BE  |.  6A 11         PUSH 11                                  ; /Count = 11 (17.)
004010C0  |.  68 60214000   PUSH cycle.00402160                      ; |Buffer = cycle.00402160
004010C5  |.  68 E8030000   PUSH 3E8                                 ; |ControlID = 3E8 (1000.)
004010CA  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
004010CD  |.  E8 F7010000   CALL <JMP.&USER32.GetDlgItemTextA>       ; \GetDlgItemTextA
004010D2  |.  0BC0          OR EAX,EAX
004010D4  |.  74 49         JE SHORT cycle.0040111F
004010D6  |.  B9 10000000   MOV ECX,10
004010DB  |.  2BC8          SUB ECX,EAX
004010DD  |.  BE 60214000   MOV ESI,cycle.00402160                   ;  ASCII "jjjjjjjjjjjjjjjj"
004010E2  |.  8BFE          MOV EDI,ESI
004010E4  |.  03F8          ADD EDI,EAX
004010E6  |.  FC            CLD
004010E7  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
004010E9  |.  33C9          XOR ECX,ECX
004010EB  |.  BE 71214000   MOV ESI,cycle.00402171                   ;  ASCII "llllllllllllllll"
004010F0  |>  41            /INC ECX
004010F1  |.  AC            |LODS BYTE PTR DS:[ESI]
004010F2  |.  0AC0          |OR AL,AL
004010F4  |.  74 0A         |JE SHORT cycle.00401100
004010F6  |.  3C 7E         |CMP AL,7E
004010F8  |.  7F 06         |JG SHORT cycle.00401100
004010FA  |.  3C 30         |CMP AL,30
004010FC  |.  72 02         |JB SHORT cycle.00401100
004010FE  |.^ EB F0         \JMP SHORT cycle.004010F0
00401100  |>  83F9 11       CMP ECX,11
00401103  |.  75 1A         JNZ SHORT cycle.0040111F
00401105  |.  E8 E7000000   CALL cycle.004011F1
0040110A  |.  B9 01FF0000   MOV ECX,0FF01
0040110F  |.  51            PUSH ECX
00401110  |.  E8 7B000000   CALL cycle.00401190
00401115  |.  83F9 01       CMP ECX,1
00401118  |.  74 06         JE SHORT cycle.00401120
0040111A  |>  E8 47000000   CALL cycle.00401166
0040111F  |>  C3            RET

很明显,程序是断在地址为004010B5这个CALL处的,因为我是对GetDlgItemTextA这个函数下的断点,这些代码的大概意思我只能判断是对用户名和注册码的位数在做检测,具体的意思我就不是特别明白了,希望哪位前辈能详细的帮我分析一下,不胜感激!

还有地址00401105处得CALL我断定他肯定就是关键CALL,在这个CALL之前程序对用户名和注册码的前期检测已经完毕,我想这个CALL里面肯定是放着关于注册码的关键算法,于是我F7跟进去,可是里面的代码让我心乱如麻,一点也是看不明白,所以恳请好心前辈忙里偷闲帮我详细分析一下,我把这个CALL里的代码贴在下方:

004011F1  /$  A1 60214000   MOV EAX,DWORD PTR DS:[402160]
004011F6  |.  8B1D 64214000 MOV EBX,DWORD PTR DS:[402164]
004011FC  |.  3305 71214000 XOR EAX,DWORD PTR DS:[402171]
00401202  |.  331D 75214000 XOR EBX,DWORD PTR DS:[402175]
00401208  |.  25 0F1F3F7F   AND EAX,7F3F1F0F
0040120D  |.  81E3 00010307 AND EBX,7030100
00401213  |.  33C9          XOR ECX,ECX
00401215  |>  8BF0          /MOV ESI,EAX
00401217  |.  8BFB          |MOV EDI,EBX
00401219  |.  D3E6          |SHL ESI,CL
0040121B  |.  D3E7          |SHL EDI,CL
0040121D  |.  81E6 80808080 |AND ESI,80808080
00401223  |.  81E7 80808080 |AND EDI,80808080
00401229  |.  8BD6          |MOV EDX,ESI
0040122B  |.  C0EE 07       |SHR DH,7
0040122E  |.  66:C1E2 07    |SHL DX,7
00401232  |.  C1EA 08       |SHR EDX,8
00401235  |.  C0EE 07       |SHR DH,7
00401238  |.  66:C1E2 07    |SHL DX,7
0040123C  |.  C1EA 08       |SHR EDX,8
0040123F  |.  C0EE 07       |SHR DH,7
00401242  |.  66:D1EA       |SHR DX,1
00401245  |.  8BF2          |MOV ESI,EDX
00401247  |.  8BD7          |MOV EDX,EDI
00401249  |.  C0EE 07       |SHR DH,7
0040124C  |.  66:C1E2 07    |SHL DX,7
00401250  |.  C1EA 08       |SHR EDX,8
00401253  |.  C0EE 07       |SHR DH,7
00401256  |.  66:C1E2 07    |SHL DX,7
0040125A  |.  C1EA 08       |SHR EDX,8
0040125D  |.  C0EE 07       |SHR DH,7
00401260  |.  66:C1EA 05    |SHR DX,5
00401264  |.  8BFA          |MOV EDI,EDX
00401266  |.  33FE          |XOR EDI,ESI
00401268  |.  8BD7          |MOV EDX,EDI
0040126A  |.  81E2 FF000000 |AND EDX,0FF
00401270  |.  51            |PUSH ECX
00401271  |.  52            |PUSH EDX
00401272  |.  BA 08000000   |MOV EDX,8
00401277  |.  91            |XCHG EAX,ECX
00401278  |.  83F8 03       |CMP EAX,3
0040127B  |.  7F 0F         |JG SHORT cycle.0040128C
0040127D  |.  F6E2          |MUL DL
0040127F  |.  5A            |POP EDX
00401280  |.  83C0 08       |ADD EAX,8
00401283  |.  91            |XCHG EAX,ECX
00401284  |.  D3C0          |ROL EAX,CL
00401286  |.  33C2          |XOR EAX,EDX
00401288  |.  D3C8          |ROR EAX,CL
0040128A  |.  EB 0D         |JMP SHORT cycle.00401299
0040128C  |>  83E8 03       |SUB EAX,3
0040128F  |.  F6E2          |MUL DL
00401291  |.  5A            |POP EDX
00401292  |.  91            |XCHG EAX,ECX
00401293  |.  D3C3          |ROL EBX,CL
00401295  |.  33DA          |XOR EBX,EDX
00401297  |.  D3CB          |ROR EBX,CL
00401299  |>  59            |POP ECX
0040129A  |.  41            |INC ECX
0040129B  |.  83F9 08       |CMP ECX,8
0040129E  |.^ 0F85 71FFFFFF \JNZ cycle.00401215
004012A4  \.  C3            RET

这里应该就是注册码的关键算法,可惜我一点也不明白,这是我最关键的时候我想如果我突破了这一关,以后我的提高就应该会很快了,最后拜托能看到此帖的好心前辈或者看雪的版主牛人们,抽点时间帮帮我这个新人,再次致谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
站了沙发了,虽然不懂,还是学习
2011-5-10 05:46
0
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
顶起来,为了前辈能看到!
2011-5-10 12:31
0
雪    币: 697
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
帮顶一下,哈哈
注册名不需16位,注册码要16位
算了一大堆,然后再比较注册码的后4位。
2011-5-10 14:29
0
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
再次顶起来,希望找到合适的答案!~
2011-5-10 22:42
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
6
像素遮罩旋转
透明属性
2011-5-11 01:27
0
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
6楼说的什么,请明示!
2011-5-11 01:47
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
8
再加70元讲给你听
(以突破而言算很值得的)
2011-5-11 02:03
0
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
9
6楼指的是看雪的KX吗?
2011-5-11 02:05
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
对 的
2011-5-11 02:17
0
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
11
没问题 请您给出详细解释 谢谢
2011-5-11 02:19
0
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
12
请问怎么增加KX
2011-5-11 02:24
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
13
前面 4 行 xor 不用看, 你停在 :
00401208  |.  25 0F1F3F7F   AND EAX,7F3F1F0F

我举个例子, 请你设定 eax = 0E133336 , ebx = 3E303038
像不像字型 6
00111000	ebx (BL)
00110000	    (BH)
00110000
00111110_______________
00110110	eax (AL)
00110011	    (AH)
00010011
00001110

经过下列这个遮罩板 :
(and     eax, 7F3F1F0F
and     ebx, 07030100
)
00000000	ebx (BL)  00
00000001	    (BH)  01
00000011		  03
00000111_______________   07
00001111	eax (AL)  0F
00011111	    (AH)  1F
00111111		  3F
01111111		  7F

变成了这样 :
00000000	ebx (BL)   00
00000000	    (BH)   00
00000000                   00
00000110_______________    06
00000110	eax (AL)   06
00010011	    (AH)   13
00010011		   13
00001110		   0E

所以此时 eax = 0E131306 , ebx = 06000000

旋转 (同上图, 但 eax ' ebx 改由下往上看) , 如下 :

00000000
00000000
00000000
00000110
00000110
00010011
00010011
00001110
  AA  BB   ↑
  HL  HL


eax 的值变成了 00000060
ebx 的值变成了 8098F860

分别与旋转前的值做 or  (亦即函数最后结果值了) :

eax = 00000060 or 0E131306 = 0E131366
ebx = 8098F860 or 06000000 = 8698F860

画出来看看 :
01100000	ebx (BL)   60
11111000	    (BH)   F8
10011000                   98
10000110_______________    86
01100110	eax (AL)   66
00010011	    (AH)   13
00010011		   13
00001110		   0E


喔...原来是斜切一半做镜像啊.

恭喜你突破了!
2011-5-11 02:48
0
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
14
虽然帖子还没看,但是看到密密麻麻的,呵呵,知道你是真诚的,所以特别表示感谢!
2011-5-11 02:56
0
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
15
你的回帖我看了好几遍,可还是云里雾里的,因为我学习时日尚浅,汇编也是一知半解的,如果你有时间能否给代码加个详细的解释,还有我想知道我的判断对错与否,他的算法具体的是什么,也许我表达的不清楚,我的意思是他的用户名与注册码之间的关系,真的非常感谢你了!
2011-5-11 03:06
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
还是看不懂
2011-5-11 16:58
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
17
我6楼写的算法其实就是图像对角线镜射
这东西怎能一行一行指令解释?
我认为你应该可以看下一个CM了,或许日后回来看这帖就懂了.
2011-5-11 19:18
0
雪    币: 544
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
S牛技术强大,人也耐心。听说多顶一顶,我也可以成大牛。
2011-5-11 19:22
0
雪    币: 210
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
具体算法还不明白
有个关键位置不知道怎么算的
大概是这个意思,某个方法得到一个关键参数,在内存0x402182处,是一个DWORD类型
然后到关键地方,
00401120  |> \A1 68214000   mov eax,dword ptr ds:[402168]
00401125  |.  8B1D 6C214000 mov ebx,dword ptr ds:[40216C]
0040112B  |.  33C3          xor eax,ebx
0040112D  |.  3305 82214000 xor eax,dword ptr ds:[402182]
00401133  |.  0D 40404040   or eax,40404040
00401138  |.  25 77777777   and eax,77777777
0040113D  |.  3305 79214000 xor eax,dword ptr ds:[402179]
00401143  |.  3305 7D214000 xor eax,dword ptr ds:[40217D]
估计这一段都能看明白
那个算法是本人是看不明白了,可是有个巧办法搞定
读取它内存的数据嘛,这个在技术上应该不难,不管它怎么运算的,读取处来在参与运算,应该是可以的
没编程能力,只能瞎想
下面是我手算的:lijianhyan
                        123456789012LE`C
注册码就和后八位有关
2011-5-11 21:55
0
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
20
你的教诲谨记在心,还是感谢你,我想我以后会明白的,呵呵,今天中午做梦时都梦到了这个问题,这个可不是玩笑,我现在都真有点明白了!
2011-5-11 22:07
0
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
21
原来这个CM早都有高人讲过了,是CCdebuger大侠在讲OD的使用中就用到的小程序,最好参看以下《第一卷 OllyDBG 入门系列 第五篇 消息断点及 RUN 跟踪》,呵呵,原来早都拜读过了,只是忘记了用的也是这个CM,根据这篇文章说明我的判断基本上是对的,用户名16位,注册码17位,呵呵,大侠在文章讲到这个小程序的算法还是挺复杂的,作为新手的我也就不深究了,留待以后吧!
2011-5-12 23:31
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
受益匪浅啊!谢谢了.
2011-7-5 15:57
0
游客
登录 | 注册 方可回帖
返回
//