-
-
[原创]keheng crackme 2.0算法分析
-
发表于:
2009-6-28 08:37
4754
-
[原创]keheng crackme 2.0算法分析
【破文标题】ke_heng crackme 2.0算法分析
【破文作者】ZeroKee
【作者邮箱】
【作者主页】
【破解工具】PEID OD SmartCheck
【破解平台】Windows XP
【软件名称】
【软件大小】
【原版下载】
【保护方式】
【软件简介】
【破解声明】只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
------------------------------------------------------------------------
【破解过程】前不久在论坛看到了keheng的crackme 2.0,尝试着用OD跟踪了下,跟着跟着发现就云里雾里了。换了SmartCheck看了下,还真让我误打误撞“猜”出了算法。。。
首先PEID查壳,显示为Microsoft Visual Basic 5.0 / 6.0,为VB编写的。打开SmartCheck,载入crackme,F5运行程序,输入Name:zerokee,code:12345678。点击注册,SmartCheck右边出现了Command1_Click事件,我们点开“+”号来看一下。由于SmartCheck不能像OD那么直观地贴代码,所以我就尽量用文字给大家说明了,希望大家见谅。
Len(String:"zerokee") returns LONG:7
Arguments
--------------------
String string1 = 0015386C
= "zerokee"
这里很明显先获取了name的长度
Len(String:"12345678") returns LONG:8
Arguments
--------------------
String string1 = 0015386C
= "12345678"
这里同样获取了注册码的长度
Mid(VARIANT:String:"zerokeez...", long:1, VARIANT:Integer:8)
Arguments
--------------------
string (variant)
String .bstrVal = 00153BEC
= "zerokeezerokeezerokeezerokeezerokeezerokeezerokee"
Long length = 1 0x00000001
start (variant)
Integer .iVal = 8 0x0008
这里将注册名重复了7遍
Mid(VARIANT:String:"zerokeez", long:1, VARIANT:Integer:1)
Arguments
--------------------
string (variant)
String .bstrVal = 0015386C
= "zerokeez"
Long length = 1 0x00000001
start (variant)
Integer .iVal = 1 0x0001
紧接着在上面这个字符串中取了前面8位,作为后面计算的基础。
Asc(String:"z") returns Integer:122
Arguments
--------------------
String string = 00153A6C
= "z"
获取字符串第一位的ASCII码值,后面也是同样的,这里就不一一贴出来了。
Len(VARIANT:String:"13010912...") returns LONG:1242136
Arguments
--------------------
string (variant)
String .bstrVal = 00153AE4
= "130109122119115109109130"
依次获取完所有字符的ASCII码值以后,产生了一个新的字符串。我们仔细观察一下,其实就是name每位的ASCII码值加上8以后,连接形成的。随后就是许多的“Mid”和“Hex”,我们再接着往下看。
Len(VARIANT:String:"82826D7A...") returns LONG:1242136
Arguments
--------------------
string (variant)
String .bstrVal = 0014B61C
= "82826D7A77736D6D82826D7A77736D6D"
又产生了一个新的字符串,仔细观察发现这个字符串其实是“82826D7A77736D6D”重复了两遍。根据上面的Hex来看,crackme是将前面的字符串中的数字转换成十六进制,然后连接成新的字符串。要注意的是,第一次转换从最后一位开始的。之后crackme又做了什么呢?咱们接着往下“猜”。。。
Integer (16) --> Long (16)
Integer 16
Long 16
Mid(VARIANT:String:"", long:16, VARIANT:Integer:1)
Arguments
--------------------
string (variant)
String .bstrVal = 0014B61C
= ""
Long length = 16 0x00000010
start (variant)
Integer .iVal = 1 0x0001
Mid是从字符串中获取字符,那么从哪里开始取呢?前面的16告诉了我们,从第16位开始取。那么取到哪里结束呢?
Integer (31) --> Long (31)
Integer 31
Long 31
Mid(VARIANT:String:"82826D7A...", long:31, VARIANT:Integer:1)
Arguments
--------------------
string (variant)
String .bstrVal = 0014B61C
= "82826D7A77736D6D82826D7A77736D6D"
Long length = 31 0x0000001F
start (variant)
Integer .iVal = 1 0x0001
看到这里就很清楚了吧,一共是15位。到了这里,我们又有了一个新的字符串“D 8 2 8 2 6 D 7 A 7 7 7 3 6 D”。(这里空格是我自己加的,为了后面看的清楚一点。。。)
Mid(VARIANT:String:"12345678...", long:1, VARIANT:Integer:1)
Arguments
--------------------
string (variant)
String .bstrVal = 00153C64
= "12345678 "
Long length = 1 0x00000001
start (variant)
Integer .iVal = 1 0x0001
Mid(VARIANT:String:"DD862D86...", long:1, VARIANT:Integer:1)
Arguments
--------------------
string (variant)
String .bstrVal = 00153B84
= "DD862D862367D777AA777D763268D268"
Long length = 1 0x00000001
start (variant)
Integer .iVal = 1 0x0001
到这里真码已经出现了,crackme逐位进行比较。"DD862D862367D777AA777D763268D268",这里就需要花点脑筋来猜了。我们分两个部分来看“DD862D862367D777AA”和“777D763268D268”,后面的字符串很明显是前面那串去头去尾,然后倒过来写的,那么我们就把重点放在前面那串上面了。刚刚crackme截取的字符串是这样的“D 8 2 8 2 6 D 7 A 7 7 7 3 6 D”。仔细观察,发现规律是这样的:
第一位重复一次,第二位同第十四位连接,第三位同第十五位连接,第四位同第十四位连接,第五位同第三位连接,第六位同第十二位连接,第七位同第十一位连接,第八位同第十位连接,第九位重复一次。这样就产生了前面的字符串。(什么,什么,你问我为什么不是第一位同最后一位或者第七位连接?咱们多弄几个name,多猜几次不就把规律给找出来了么。。。)
最后我用name:zerokee,code:DD862D862367D777AA777D763268D268,注册成功了。破文写到这里,这个crackme的算法咱们也算搞得挺清楚了。注册机我还在努力编写之中。。。
其实有时候在一个工具分析起来比较困难的时候,换一个工具或许会得到意想不到的结果。附件中是SmartCheck生成的报告。最后感谢keheng提供这个crackme给我们来练手,谢谢~~
------------------------------------------------------------------------
【破解总结】
------------------------------------------------------------------------
【版权声明】本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!