首页
社区
课程
招聘
[七夕]一枚好玩的KeygenMe
发表于: 2013-8-13 18:35 17848

[七夕]一枚好玩的KeygenMe

2013-8-13 18:35
17848

首先祝大家七夕节快乐!
为什么说这个KeygenMe好玩呢?不是因为它的代码好玩,汇编代码在大部分眼里都比较枯燥。
说它好玩的原因,是因为完成它的全部过程很有意思。
话说今天闲得无聊,没情人的情人节就像一条汇编指令NOP,根本用不着je还是jne来判断,于是又来到了看雪上。总想在今天做点什么,顺手就打开了crackmes.de网站,本来是不打算破解的,但是找了一下,居然发现有一个已经发布快半个月了,还没有人提交作品,于是激情又来了。

http://www.crackmes.de/users/dark_puzzle/dark_puzzle_keygenme_1/
废话就不多说了,直接 上正题吧。


00401000 >/$  6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL
00401002  |.  68 00304000   push    00403000                         ; |Title = "ItSecurity.ma KeygenMe (RESTRICTED PATCHING)"
00401007  |.  68 2D304000   push    0040302D                         ; |Text = "Itsecurity.ma KeygenME Coded by Souhail Hammou ..."
0040100C  |.  6A 00         push    0                                ; |hOwner = NULL
0040100E  |.  E8 19020000   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
00401013  |.  68 60304000   push    00403060                         ;  ASCII "Please type your e-mail: "
00401018  |.  E8 17020000   call    00401234
0040101D  |.  68 C8000000   push    0C8
00401022  |.  68 60314000   push    00403160                         ;  ASCII "123456@"
00401027  |.  E8 40020000   call    0040126C
0040102C  |.  8D05 60314000 lea     eax, dword ptr [403160]
00401032  |.  33D2          xor     edx, edx
00401034  |.  33C9          xor     ecx, ecx
00401036  |>  8A18          /mov     bl, byte ptr [eax]
00401038  |.  80FB 40       |cmp     bl, 40
0040103B  |.  74 0C         |je      short 00401049                  ;  比较是否为邮箱的特殊符号‘@’
0040103D  |.  38D3          |cmp     bl, dl
0040103F  |.  0F84 A6010000 |je      004011EB                        ;  判断字符串是否结束
00401045  |.  41            |inc     ecx
00401046  |.  40            |inc     eax
00401047  |.^ EB ED         \jmp     short 00401036
00401049  |>  80F9 03       cmp     cl, 3                            ;  判断长度是否小于3,小于三则退出
0040104C  |.  0F8E B9010000 jle     0040120B
00401052  |.  68 7A304000   push    0040307A                         ;  ASCII "Please Enter a valid serial: "
00401057  |.  E8 D8010000   call    00401234
0040105C  |.  68 C8000000   push    0C8
00401061  |.  68 84414000   push    00404184                         ;  ASCII "ITS-9124-O790-8523-8523"
00401066  |.  E8 01020000   call    0040126C                         ;  输入Serial
0040106B  |.  68 84414000   push    00404184                         ; /String = "ITS-9124-O790-8523-8523"
00401070  |.  E8 C3020000   call    <jmp.&kernel32.lstrlenA>         ; \lstrlenA
00401075  |.  83F8 17       cmp     eax, 17                          ;  比较Serial的长度是否等于0x17,不等于则退出
00401078  |.  0F85 4D010000 jnz     004011CB
0040107E  |.  8D05 84414000 lea     eax, dword ptr [404184]
00401084  |.  33DB          xor     ebx, ebx
00401086  |.  8B18          mov     ebx, dword ptr [eax]
00401088  |.  81FB 4954532D cmp     ebx, 2D535449                    ;  字符串前面4个为固定字串—"ITS-"
0040108E  |.  0F85 37010000 jnz     004011CB
00401094  |.  83C0 08       add     eax, 8
00401097  |.  8038 2D       cmp     byte ptr [eax], 2D               ;  判断第8位是否为分隔符“-”
0040109A  |.  0F85 2B010000 jnz     004011CB
004010A0  |.  33C9          xor     ecx, ecx
004010A2  |.  33D2          xor     edx, edx
004010A4  |.  B1 03         mov     cl, 3
004010A6  |.  B2 05         mov     dl, 5                            ;  隔5个判断一次
004010A8  |>  03C2          /add     eax, edx
004010AA  |.  FEC9          |dec     cl
004010AC  |.  8038 2D       |cmp     byte ptr [eax], 2D              ;  判断当前指针所指向值是否为“-”
004010AF  |.^ 74 F7         \je      short 004010A8
004010B1  |.  80F9 00       cmp     cl, 0                            ;  如果出现次数不等于3-1=2次,说明不合规则,退出
004010B4  |.  0F85 11010000 jnz     004011CB
004010BA  |.  8D05 84414000 lea     eax, dword ptr [404184]
004010C0  |.  83C0 04       add     eax, 4                           ;  跳过前面4个字符
004010C3  |.  8B18          mov     ebx, dword ptr [eax]             ;  取第一个分隔符后面4字节数据,放入变量num1中
004010C5  |.  8D0D A8514000 lea     ecx, dword ptr [4051A8]
004010CB  |.  8919          mov     dword ptr [ecx], ebx
004010CD  |.  83C0 05       add     eax, 5
004010D0  |.  8B18          mov     ebx, dword ptr [eax]             ;  取第二个分隔符后面4个字节的数据,放入变量num2中
004010D2  |.  8D0D CC614000 lea     ecx, dword ptr [4061CC]
004010D8  |.  8919          mov     dword ptr [ecx], ebx
004010DA  |.  83C0 05       add     eax, 5
004010DD  |.  8B18          mov     ebx, dword ptr [eax]             ;  取第三个分隔符后面4字节数据,放入变量num3中
004010DF  |.  8D0D F0714000 lea     ecx, dword ptr [4071F0]
004010E5  |.  8919          mov     dword ptr [ecx], ebx
004010E7  |.  83C0 05       add     eax, 5
004010EA  |.  8B18          mov     ebx, dword ptr [eax]             ;  取第四个分隔符后面4字节数据,放入变量num4中
004010EC  |.  8D0D 14824000 lea     ecx, dword ptr [408214]
004010F2  |.  8919          mov     dword ptr [ecx], ebx
004010F4  |.  33C0          xor     eax, eax                         ;  清零寄存器,为后面运算做准备
004010F6  |.  33DB          xor     ebx, ebx
004010F8  |.  33D2          xor     edx, edx
004010FA  |.  33C9          xor     ecx, ecx
004010FC  |.  8D05 A8514000 lea     eax, dword ptr [4051A8]          ;  取num1字符串
00401102  |.  8B00          mov     eax, dword ptr [eax]
00401104  |.  2D 30303030   sub     eax, 30303030                    ;  num1=num1-0x30303030,即以数字0为基础
00401109  |.  8D15 A8514000 lea     edx, dword ptr [4051A8]
0040110F  |.  8902          mov     dword ptr [edx], eax
00401111  |.  8A1A          mov     bl, byte ptr [edx]               ;  取num1中的低8位数值,记为变量a
00401113  |.  8A4A 01       mov     cl, byte ptr [edx+1]             ;  取num1中的9-16位的数值,记为变量b
00401116  |.  02D9          add     bl, cl                           ;  a=a+b
00401118  |.  8A4A 02       mov     cl, byte ptr [edx+2]             ;  取num1中的17-24位的数值,记为变量c
0040111B  |.  02D9          add     bl, cl                           ;  a=a+c
0040111D  |.  8A4A 03       mov     cl, byte ptr [edx+3]             ;  取num1中的25-32位的数值,记为变量d
00401120  |.  02D9          add     bl, cl                           ;  a=a+d
00401122  |.  80FB 10       cmp     bl, 10                           ;  判断各位相加后是否等于0x10
00401125  |.  0F85 A0000000 jnz     004011CB
0040112B  |.  8D15 CC614000 lea     edx, dword ptr [4061CC]          ;  取num2字符串
00401131  |.  8A1A          mov     bl, byte ptr [edx]               ;  取num2的第一个字符,记为a
00401133  |.  80FB 4F       cmp     bl, 4F                           ;  判断是否等于字母 “O”
00401136  |.  0F85 8F000000 jnz     004011CB
0040113C  |.  8A4A 01       mov     cl, byte ptr [edx+1]             ;  取num2的第二个字符,记为b
0040113F  |.  02D9          add     bl, cl                           ;  a=a+b
00401141  |.  8A4A 02       mov     cl, byte ptr [edx+2]             ;  取num2的第三个字符,记为c
00401144  |.  02D9          add     bl, cl                           ;  a=a+c
00401146  |.  8A4A 03       mov     cl, byte ptr [edx+3]             ;  取num2的第四个字符,记为d
00401149  |.  2AD9          sub     bl, cl                           ;  a=a-d
0040114B  |.  80FB 8F       cmp     bl, 8F                           ;  判断a的值是否等于0x8F
0040114E  |.  75 7B         jnz     short 004011CB
00401150  |.  8D05 F0714000 lea     eax, dword ptr [4071F0]          ;  取num3字符串
00401156  |.  8B00          mov     eax, dword ptr [eax]
00401158  |.  2D 30303030   sub     eax, 30303030                    ;  num3=num3-0x30303030
0040115D  |.  8D15 F0714000 lea     edx, dword ptr [4071F0]
00401163  |.  8902          mov     dword ptr [edx], eax
00401165  |.  8A1A          mov     bl, byte ptr [edx]               ;  取num3中的低8位数值,记为变量a
00401167  |.  8A4A 01       mov     cl, byte ptr [edx+1]             ;  取num3中的9-16位的数值,记为变量b
0040116A  |.  02D9          add     bl, cl                           ;  a=a+b
0040116C  |.  8A4A 02       mov     cl, byte ptr [edx+2]             ;  取num3中的17-24位的数值,记为变量c
0040116F  |.  02D9          add     bl, cl                           ;  a=a+c
00401171  |.  8A4A 03       mov     cl, byte ptr [edx+3]             ;  取num3中的25-32位的数值,记为变量d
00401174  |.  80E9 02       sub     cl, 2                            ;  d=d-2
00401177  |.  02D9          add     bl, cl                           ;  a=a+d
00401179  |.  80FB 10       cmp     bl, 10                           ;  判断所得的结果是否等于0x10
0040117C  |.  75 4D         jnz     short 004011CB
0040117E  |.  8D05 14824000 lea     eax, dword ptr [408214]          ;  取num4字符串
00401184  |.  8B00          mov     eax, dword ptr [eax]
00401186  |.  2D 30303030   sub     eax, 30303030                    ;  num4=num4-0x30303030
0040118B  |.  8D15 14824000 lea     edx, dword ptr [408214]
00401191  |.  8902          mov     dword ptr [edx], eax
00401193  |.  8A1A          mov     bl, byte ptr [edx]               ;  取num4中的低8位数值,记为变量a
00401195  |.  8A4A 01       mov     cl, byte ptr [edx+1]             ;  取num4中的9-16位的数值,记为变量b
00401198  |.  02D9          add     bl, cl                           ;  a=a+b
0040119A  |.  8A4A 02       mov     cl, byte ptr [edx+2]             ;  取num4中的17-24位的数值,记为变量c
0040119D  |.  02D9          add     bl, cl                           ;  a=a+c
0040119F  |.  8A4A 03       mov     cl, byte ptr [edx+3]             ;  取num4中的25-32位的数值,记为变量d
004011A2  |.  02D9          add     bl, cl                           ;  a=a+d
004011A4  |.  80FB 12       cmp     bl, 12                           ;  判断运算结果是否等于0x12
004011A7  |.  75 22         jnz     short 004011CB                   ;  等于则注册成功,否则注册失败

[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (18)
雪    币: 219
活跃值: (753)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
2
虽然我不知道 crame不过顶~
2013-8-13 19:47
0
雪    币: 45
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
没看明白哪个地方要用到随机数了。。自己试试。
2013-8-13 20:01
0
雪    币: 406
活跃值: (164)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
4
感谢分享。
2013-8-13 20:05
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
5
因为注册码有“无限个”,所以要用随机数来生成才能完全破解。
2013-8-13 21:03
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
6
很菜的技术 ,大神莫笑。
2013-8-13 21:05
0
雪    币: 219
活跃值: (753)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
7
我怎么会是大神呢~
   离的还很远,不过看你们玩这个感觉蛮刺激的,过些日子也看看书~
2013-8-13 21:07
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
8
我看过你的文章 ,驱动方面你是大神。向大神学习。
2013-8-13 21:20
0
雪    币: 219
活跃值: (753)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
9
都是为了互相交流,互相学习~
2013-8-13 21:29
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
10
大牛见笑了。
2013-8-13 21:48
0
雪    币: 290
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
特殊的日子   过来学习下..
2013-8-13 22:10
0
雪    币: 35
活跃值: (139)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
楼主厉害!!   没情人call 基友
2013-8-13 23:16
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
13
哈哈。。call这个指令 用得好。
2013-8-13 23:57
0
雪    币: 95880
活跃值: (200544)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
14
+1
2013-8-14 07:06
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
15
lin版主起得真早。
2013-8-14 09:52
0
雪    币: 341
活跃值: (85)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
16
找时间看看。
2013-8-14 13:51
0
雪    币: 116
活跃值: (290)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
感谢涛哥的教育。
2013-8-14 17:09
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
18
鹏哥说笑了,相互学习而已。
2013-8-15 11:54
0
雪    币: 341
活跃值: (85)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
19
看了下,是穷举。随便凑几个数就OK了。keygen的话,rand方法比较合适,for穷举有点坑。
2013-8-16 22:32
0
游客
登录 | 注册 方可回帖
返回
//