野猫III 发表于 2006-6-26 00:51:06

[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 编辑 ]

风飘雪 发表于 2006-6-26 11:08:35

我写的《加密与解密实战攻略》书中也放过这个crackme

lq 发表于 2006-6-26 13:38:59

原帖由 风飘雪 于 2006-6-26 11:08 发表


呵呵!期待郭大侠的新作。

lhl8730 发表于 2006-6-26 20:03:03

猫兄算法越来越厉害了,恭喜,恭喜!!!

菜儿 发表于 2006-6-26 20:34:16

原帖由 风飘雪 于 2006-6-26 11:08 发表


已收藏郭大侠的大作,;P


也恭喜猫兄算法越来越厉害,更上一层楼!!! :victory:

[ 本帖最后由 菜儿 于 2006-6-26 20:37 编辑 ]

野猫III 发表于 2006-6-27 23:39:30

原帖由 lhl8730 于 2006-6-26 20:03 发表
猫兄算法越来越厉害了,恭喜,恭喜!!!
菜鸟学习的东东,歪夸,呵呵~~~

原帖由 风飘雪 于 2006-6-26 11:08 发表


呵呵。。。谢谢郭大侠加精!

这个CrackMe分析应该是猫分析算法的处女作吧。

简单实用,正是菜鸟学飞好方向~~~

++++++++++++++

请教大家一个问题!

为什么咱在易语言里做出的算法注册机,不支持中文?

附件有源码,帮忙看下。呵呵~~~有可能将一个中文字拆开来算的。

[ 本帖最后由 野猫III 于 2006-6-27 23:59 编辑 ]

快雪时晴 发表于 2006-7-1 10:30:13

已回复:
https://www.chinapyg.com/viewthread.php?tid=5801&page=1&extra=#pid34510

寒湖鹤影 发表于 2006-7-1 16:43:31

原帖由 风飘雪 于 2006-6-26 11:08 发表
我写的《加密与解密实战攻略》书中也放过这个crackme



我们这里没卖这本书,网上的PDF版本太不清楚了

yangyucun 发表于 2010-5-27 13:44:41

我只是来学习的

曹无咎 发表于 2010-5-27 19:24:41

期待中。。。。。。。。。。
页: [1]
查看完整版本: [PCC]2001年的Key-Crackme2算法分析~~~