[PCC]2001年的Key-Crackme2算法分析~~~
【破文标题】野猫III破解手记(算法分析2)【破文作者】野猫III
【破解工具】PEiD,W32DASM,UC32,OD
【破解平台】Windows 2K&XP
【软件名称】2001年的Key-Crackme2
【软件大小】63K
【原版下载】老古董咯。。。去那找下载地址呢?
【保护方式】加壳,注册码
【软件简介】
一、软件加了个UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo典型壳.
用OD载入,Ctrl+F,输入popad,确定之后来到:
00438C8E 61 POPAD //F2断点,运行到这里
00438C8F- E9 6C83FCFF JMP Key-Crac.00401000 //F8到这里Jmp到达程序OEP。
00401000 6A 00 PUSH 0
00401002 E8 23040000 CALL Key-Crac.0040142A ; JMP 到 kernel32.GetModuleHandleA
00401007 A3 F0344000 MOV DWORD PTR DS:,EAX
0040100C 50 PUSH EAX
0040100D E8 13000000 CALL Key-Crac.00401025
脱壳之。。。
二、软件注册有错误提示,脱壳后用W32DASM查找参串以下:
" Please Fill in 1 more Char!!"
" +=================================+
"
" Good Job, I Wish You the Very "
" Key/CrackmMe - #2"
" You Have Enter A Wrong Serial, " //双击这个错误提示
++++++++++来到下面。。。+++++++++++++++++++++++
:0040133A 3BC6 cmp eax, esi
:0040133C 7515 jne 00401353 //就是它,关键Jump
:0040133E 6A00 push 00000000
* Possible StringData Ref from Data Obj ->"Key/CrackMe #2 "
|
:00401340 6862344000 push 00403462
* Possible StringData Ref from Data Obj ->" Good Job, I Wish You the Very "
->"Best"
|
:00401345 68B8344000 push 004034B8 //上面提示注册成功
:0040134A 6A00 push 00000000
:0040134C E89D000000 call 004013EE
:00401351 EB13 jmp 00401366
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040133C(C) 。。。。。。。。。。导致出错的地址,跳去那里看下。。。
|
:00401353 6A00 push 00000000
* Possible StringData Ref from Data Obj ->"Key/CrackMe #2 "
|
:00401355 6862344000 push 00403462
* Possible StringData Ref from Data Obj ->" You Have Enter A Wrong Serial, "
->"Please Try Again "
|
:0040135A 6886344000 push 00403486 //这里提示注册错误
:0040135F 6A00 push 00000000
:00401361 E888000000 call 004013EE
++++++++++++++++++++++++++++++++++++++++++++++++
三、找到关键跳转后我们OD载入这个脱壳后的文件。
------------------------------------------------------------------------
0040129C C1E8 10 SHR EAX,10
0040129F 0BC0 OR EAX,EAX
004012A1 0F85 BF000000 JNZ Key-Crac.00401366
004012A7 58 POP EAX
004012A8 83F8 6C CMP EAX,6C
004012AB 0F85 B5000000 JNZ Key-Crac.00401366
004012B1 6A 40 PUSH 40
004012B3 68 38304000 PUSH Key-Crac.00403038 ; ASCII "WildCatIII"
004012B8 6A 6A PUSH 6A
004012BA FF75 08 PUSH DWORD PTR SS:
004012BD E8 08010000 CALL <JMP.&USER32.GetDlgItemTextA>
004012C2 >83F8 00 CMP EAX,0 ; 是否输入用户名?
004012C5 74 18 JE SHORT Key-Crac.004012DF ; 没有就跳错
004012C7 6A 40 PUSH 40
004012C9 68 38314000 PUSH Key-Crac.00403138 ; ASCII "9876543210"
004012CE 6A 6B PUSH 6B
004012D0 FF75 08 PUSH DWORD PTR SS:
004012D3 E8 F2000000 CALL <JMP.&USER32.GetDlgItemTextA>
004012D8 >83F8 00 CMP EAX,0 ; 试练码输入了吗?
004012DB 74 02 JE SHORT Key-Crac.004012DF ; 没有就跳
004012DD EB 17 JMP SHORT Key-Crac.004012F6 ; 有输在这里跳
004012DF 6A 00 PUSH 0
004012E1 68 62344000 PUSH Key-Crac.00403462 ; ASCII "Key/CrackMe #2 "
004012E6 68 00304000 PUSH Key-Crac.00403000 ; ASCII " Please Fill in
1 more Char!!"
004012EB 6A 00 PUSH 0
004012ED E8 FC000000 CALL <JMP.&USER32.MessageBoxA>
004012F2 C9 LEAVE
004012F3 C2 1000 RETN 10
004012F6 68 38304000 PUSH Key-Crac.00403038 ; ASCII "WildCatIII"
004012FB E8 30010000 CALL <JMP.&kernel32.lstrlen>
00401300 33F6 XOR ESI,ESI
00401302 8BC8 MOV ECX,EAX ; 用户名位数进ECX
00401304 B8 01000000 MOV EAX,1 ; EAX=1
接下来进行用户名家逐个取值循环运算
00401309 >8B15 38304000 MOV EDX,DWORD PTR DS:
; 取用户名
0040130F 8A90 37304000 MOV DL,BYTE PTR DS: ; 逐位取用户名的值
00401315 81E2 FF000000 AND EDX,0FF ; 取其16进制放进EDX
0040131B 8BDA MOV EBX,EDX ; 同时也放进EBX
0040131D 0FAFDA IMUL EBX,EDX ; EDX与EBX相乘
00401320 03F3 ADD ESI,EBX ; 积放进EBX
00401322 8BDA MOV EBX,EDX ; 用户名逐位的16进制放进EBX
00401324 D1FB SAR EBX,1 ; 算术右移1位
00401326 03F3 ADD ESI,EBX ; ESI+EBX
00401328 2BF2 SUB ESI,EDX ; 得到的和减去EDX
0040132A 40 INC EAX ; EAX+1
0040132B 49 DEC ECX ; ECX-1
0040132C >^ 75 DB JNZ SHORT 00401309
; 上面的ECX与EAX相等就不跳,不等就跳
0040132E 56 PUSH ESI ; 上面的循环之后,最终结果保存在ESI中
0040132F 68 38314000 PUSH Key-Crac.00403138 ; ASCII "9876543210"
00401334 E8 4A000000 CALL Key-Crac.00401383
00401339 5E POP ESI
0040133A >3BC6 CMP EAX,ESI ; 结果与试练码比较 {内存注册机}
0040133C 75 15 JNZ SHORT Key-Crac.00401353 ; 不等就跳走
0040133E 6A 00 PUSH 0
00401340 68 62344000 PUSH Key-Crac.00403462 ; ASCII "Key/CrackMe #2 "
00401345 68 B8344000 PUSH Key-Crac.004034B8 ; ASCII " Good Job, I Wish
You the Very Best"
0040134A 6A 00 PUSH 0
0040134C E8 9D000000 CALL <JMP.&USER32.MessageBoxA>
00401351 EB 13 JMP SHORT Key-Crac.00401366
00401353 6A 00 PUSH 0
00401355 68 62344000 PUSH Key-Crac.00403462 ; ASCII "Key/CrackMe #2 "
0040135A 68 86344000 PUSH Key-Crac.00403486 ; ASCII " You Have Enter A
Wrong Serial, Please Try Again "
0040135F 6A 00 PUSH 0
00401361 E8 88000000 CALL <JMP.&USER32.MessageBoxA> ; Call出错误提示,OVER!
------------------------------------------------------------------------
【算法小结】
我的用户名:W i l d C a t I I I
用户名分别:57696C64436174494949
第一次W 得到的16进制结果57*57+2b-57=1d65
第二次i 得到的16进制结果69*69+34-69=2ADC
第二次l 得到的16进制结果6c*6c+36-6c=2D94
第二次d 得到的16进制结果64*64+32-64=26DE
第二次C 得到的16进制结果43*43+21-43=1167
第二次a 得到的16进制结果61*61+30-61=2490
第二次t 得到的16进制结果74*74+3A-74=3456
第二次I 得到的16进制结果49*49+24-49=14AC
第二次I 得到的16进制结果49*49+24-49=14AC
第二次I 得到的16进制结果49*49+24-49=14AC
上面注册名经逐个运算所得的值,
累加得144CA,然后转成10进制------》83146就是注册码。
++++++++++++++++++++++++++++++++++
算法小结:
逐位取用户名的16进制值的2次方
加上
用户名16进制算术右移1位取值(可以理解为它除以2的商的整数)
减去
逐位取用户名的16进制值
最后累加的16进制值转换成10进制就是注册码.
------------------------------------------------------------------------
【版权声明】本破文纯属个人独自分析, 之前没有参考过它的任何破解信息。特此说明。
[ 本帖最后由 野猫III 于 2006-6-26 00:52 编辑 ]
我写的《加密与解密实战攻略》书中也放过这个crackme
原帖由 风飘雪 于 2006-6-26 11:08 发表呵呵!期待郭大侠的新作。 猫兄算法越来越厉害了,恭喜,恭喜!!! 原帖由 风飘雪 于 2006-6-26 11:08 发表
已收藏郭大侠的大作,;P
也恭喜猫兄算法越来越厉害,更上一层楼!!! :victory:
[ 本帖最后由 菜儿 于 2006-6-26 20:37 编辑 ] 原帖由 lhl8730 于 2006-6-26 20:03 发表
猫兄算法越来越厉害了,恭喜,恭喜!!!
菜鸟学习的东东,歪夸,呵呵~~~
原帖由 风飘雪 于 2006-6-26 11:08 发表
呵呵。。。谢谢郭大侠加精!
这个CrackMe分析应该是猫分析算法的处女作吧。
简单实用,正是菜鸟学飞好方向~~~
++++++++++++++
请教大家一个问题!
为什么咱在易语言里做出的算法注册机,不支持中文?
附件有源码,帮忙看下。呵呵~~~有可能将一个中文字拆开来算的。
[ 本帖最后由 野猫III 于 2006-6-27 23:59 编辑 ] 已回复:
https://www.chinapyg.com/viewthread.php?tid=5801&page=1&extra=#pid34510 原帖由 风飘雪 于 2006-6-26 11:08 发表
我写的《加密与解密实战攻略》书中也放过这个crackme
我们这里没卖这本书,网上的PDF版本太不清楚了 我只是来学习的 期待中。。。。。。。。。。
页:
[1]