我是小菜,不会传图片。首先找到,关键跳转,见
004011F3 ^\0F84 DEFEFFFF je chap203.004010D7
下面是程序
004011D9 ^\EB C1 jmp short chap203.0040119C ; 返回跳转位置继续比较
004011DB FF35 AF214000 push dword ptr ds:[4021AF]
004011E1 68 94214000 push chap203.00402194
004011E6 68 79214000 push chap203.00402179
004011EB E8 54000000 call chap203.00401244
004011F0 83F8 01 cmp eax,1 ; 比较EAX,(标志位)
004011F3 ^ 0F84 DEFEFFFF je chap203.004010D7 ; 如果相等就注册成功
004011F9 EB 1F jmp short chap203.0040121A ; 不相等就 失败,跳转
004011FB 837D 10 01 cmp dword ptr ss:[ebp+10],1
004011FF ^ 0F84 22FFFFFF je chap203.00401127
00401205 837D 10 02 cmp dword ptr ss:[ebp+10],2
00401209 75 2F jnz short chap203.0040123A
0040120B E8 B4000000 call <jmp.&KERNEL32.ExitProcess>
00401210 B8 01000000 mov eax,1
00401215 ^ E9 FFFEFFFF jmp chap203.00401119
。
突然发现前面,还有一段,是判断 数字的长度。 应该是 大于1小于等于80040112F FF75 08 push dword ptr ss:[ebp+8]
00401132 E8 41020000 call <jmp.&USER32.SendDlgItemMessageA>
00401137 A3 AF214000 mov dword ptr ds:[4021AF],eax
0040113C 83F8 00 cmp eax,0 ; 看数据长度是否大于0
0040113F 0F84 D5000000 je chap203.0040121A ; 数据长度小于0提示错误
00401145 83F8 08 cmp eax,8 ; 比较数据长度
00401148 0F8F CC000000 jg chap203.0040121A ; 数据长度大于8提示错误
0040114E 8BF0 mov esi,eax ; 存储数据长度1~8 位
00401150 6A 00 push 0
00401152 6A 00 push 0
00401154 6A 0E push 0E
00401156 6A 04 push 4
00401158 FF75 08 push dword ptr ss:[ebp+8]
0040115B E8 18020000 call <jmp.&USER32.SendDlgItemMessageA>
00401160 83F8 00 cmp eax,0
00401163 0F84 B1000000 je chap203.0040121A ; 如果数据长度等于0 提示错误
00401169 3BF0 cmp esi,eax ; 两个数据的长度要一致
0040116B 0F85 A9000000 jnz chap203.0040121A
00401171 68 60214000 push chap203.00402160
00401176 6A 08 push 8
00401178 6A 0D push 0D
关键的密码生成部分。也是找了半个小时,没办法,小菜一枚。
0040119C 41 inc ecx ; ecx 加1,当ECX=9,的时候 eax 返回的是0
0040119D 0FBE81 60214000 movsx eax,byte ptr ds:[ecx+402160] ; 402160+偏移0 给 EAX
004011A4 83F8 00 cmp eax,0
004011A7 74 32 je short chap203.004011DB
004011A9 BE FFFFFFFF mov esi,-1
004011AE 83F8 41 cmp eax,41 ; 和0x41比较 就是 ‘A’
004011B1 > 7C 67 jl short chap203.0040121A ; 小于‘A’,就失败
004011B3 83F8 7A cmp eax,7A ; 就是‘z’
004011B6 77 62 ja short chap203.0040121A ; 大于z,就失败
004011B8 83F8 5A cmp eax,5A ; 就是‘Z’
004011BB 7C 03 jl short chap203.004011C0 ; 小于‘Z’,就进去查表
004011BD 83E8 20 sub eax,20 ; eax减去32
004011C0 46 inc esi ; 查表中下一个数字
004011C1 0FBE96 17204000 movsx edx,byte ptr ds:[esi+402017] ; 隐含了“ASCII码大于Z直接查表,和小于Z的,减掉32,来查表”
004011C8 3BC2 cmp eax,edx ; 比较第二位
004011CA ^ 75 F4 jnz short chap203.004011C0 ; 不相等就向后比较
004011CC 0FBE86 3C204000 movsx eax,byte ptr ds:[esi+40203C] ; 查表
004011D3 8981 94214000 mov dword ptr ds:[ecx+402194],eax ; 生成加密后的数据
004011D9 ^ EB C1 jmp short chap203.0040119C ; 返回跳转位置,继续比较
004011DB FF35 AF214000 push dword ptr ds:[4021AF]
004011E1 68 94214000 push chap203.00402194
继续寻找,发现还有一个核对的部分。将序列号,和生成的 密码对比。
00401244 C8 000000 enter 0,0 ; 进入函数
00401248 B8 01000000 mov eax,1 ; EAX=1,作为标记使用
0040124D 8B7D 08 mov edi,dword ptr ss:[ebp+8] ; 存入CODE
00401250 8B75 0C mov esi,dword ptr ss:[ebp+C] ; 加密后的数据
00401253 8B4D 10 mov ecx,dword ptr ss:[ebp+10] ; 下一句 REPE的长度,8个数据
00401256 F3:A6 repe cmps byte ptr es:[edi],byte ptr ds:[>; 比较 加密后的数据 和user name 是否相等
00401258 67:E3 05 jcxz short chap203.00401260 ; 不等就离开
0040125B B8 00000000 mov eax,0 ; 给EAX =0
00401260 C9 leave
00401261 C2 0C00 retn 0C ; 对比成功时,EAX=1;
。如果想强力爆破,可以直接修改EAX的值,后面判断会用到。
这里就是最后了,比较EAX ,进行核对。
004011F0 83F8 01 cmp eax,1 ; 比较EAX,(标志位)
004011F3 ^ 0F84 DEFEFFFF je chap203.004010D7 ; 如果相等就注册成功
。到这里,这个Crakeme, 就结束了。本想写个注册机,如果写了,稍候传上。
附上里面的两个码表:
//402017
00402017 41 31 4C 53 4B 32 44 4A 46 34 48 47 50 33 51 57 A1LSK2DJF4HGP3QW
00402027 4F 35 45 49 52 36 55 54 59 5A 38 4D 58 4E 37 43 O5EIR6UTYZ8MXN7C
00402037 42 56 39 00 20 53 55 37 43 53 4A 4B 46 30 39 4E BV9. SU7CSJKF09N
00402047 43 53 44 4F 39 53 44 46 30 39 53 44 52 4C 56 4B CSDO9SDF09SDRLVK
00402057 37 38 30 39 53 34 4E 46 00 7809S4NF.
码表2:
//40203c
0040203C 53 55 37 43 53 4A 4B 46 30 39 4E 43 53 44 4F 39 SU7CSJKF09NCSDO9
0040204C 53 44 46 30 39 53 44 52 4C 56 4B 37 38 30 39 53 SDF09SDRLVK7809S
0040205C 34 4E 46 00 4NF.
CRAKEme 下载地址:
http://pan.baidu.com/share/link?shareid=481557&uk=4095171087