mycsy 发表于 2008-6-13 15:29

tKC 系列 .Net CrackME 简单分析

今天瞎逛看到的 很棒 转来大家一起分享!



在论坛看见 tankaiha 版主发的 .NET CrackME,全部下载回来看了一下,下面是每个 CrackME 的算法分析。

1.CrackME #1
没有混淆,没有加密字符串,用 Reflector 打开,找到“Button1_Click”方法,里面就是注册算法。算法太简单,就不说了。

2.CrackME #2
名称被混淆,字符串被加密。
这个 CrackME 难度不高,用 Reflector 打开,把类全部逐个展开,找到窗体类(窗体类通常会包含“Label”、“Button”、“TextBox”等成员),然后再找到相应的按钮事件。(.Net 程序的事件处理函数一般为“Button1_Click(Object, EventArgs) : Void”这样的类型。)
这个 CrackME 的字符串加密对分析注册算法没有影响,注册算法也很简单,不细说了。

3.CrackME #3
名称被混淆,字符串被加密。
这个 CrackME 和 CrackME #2 难度差不多,只是算法有少许变化,只要你搞定 CrackME #2,这个应该不是问题。

4.CrackME #4
本地代码加密,名称被混淆,字符串被加密。
运行这个 crackme,先出现了一个 NAG 窗口,接着是注册对话框。
用 Reflector 打开这个 CrackME 你会发现 Reflector 提示没有 CLI 头,很明显这个 CrackME 已被本地代码加密。
目前对付本地代码加密一般都是在程序运行时进行 Dump,然后在修复。关于如何 Dump,可以使用目前现有的工具或者手工 Dump。(关于手工 Dunp 可以搜索 tankaiha 版主以前发过的帖子)
对于这个 CrackME,可以使用 .NET Generic Unpacker 直接 Dump。先运行 CrackME #4,然后再打开 .NET Generic Unpacker,在列表中找到 CrackME #4 的程序,然后点击“Unpack”按钮 Dump。
之后,在 Dump 出的文件中,找到包含刚才刚才运行时看见那个注册对话框的程序,用 Reflector 打开,嘿嘿,这下可以看见了。接着,还是按前面的办法找到窗体类中的按钮事件。
分析后得知这个 CrackME 的 Key 只有一个,Key 保存在"{31d5bf40-93d0-4aee-ad60-4ee2b67311e3}"资源文件中,并且使用 BASE64 加密。

5.CrackME #5
本地代码加密,名称混淆,字符串加密。
按 CrackME #4 的方法,先 Dump,用 Reflector 打开,找到窗体类中的按钮事件。
分析一下,这个CrackME的 LICENSE ID 是“C:\”盘的序列号,将这个序列号先用 SHA512 再用 BASE64 加密后就是 Key 了。

6.CrackME #6
本地代码加密。
先 Dump,之后 Reflector 打开,未混淆名称,字符串未加密。找到按钮事件就找到 Key 了。

7.CrackME2
名称混淆。
窗体的类名未被混淆,很容易用 Reflector 找到按钮事件,注册算法如下(其中“this.TextBox1.Text”代表输入的用户名):
SHA512Managed managed = new SHA512Managed();
managed.ComputeHash(Encoding.Unicode.GetBytes(this.TextBox1.Text));
StringBuilder builder = new StringBuilder();
builder.Append(Strings.Mid(Convert.ToBase64String(managed.Hash).ToUpper(), 1, 6));
builder.Append("-");
builder.Append(Strings.Mid(Convert.ToBase64String(managed.Hash).ToUpper(), 8, 5));
builder.Append("-");
builder.Append(Strings.Mid(Convert.ToBase64String(managed.Hash).ToUpper(), 14, 5));
builder.Append("-");
builder.Append(Strings.Mid(Convert.ToBase64String(managed.Hash).ToUpper(), 20, 5));
builder.Append("-");
builder.Append(Strings.Mid(Convert.ToBase64String(managed.Hash).ToUpper(), 0x1a, 5));
builder.Append("-");
builder.Append(Strings.Mid(Convert.ToBase64String(managed.Hash).ToUpper(), 0x20, 5));

8.CrackME3
名称混淆,字符串加密。
取得 C 盘序列号,用 SHA256、SHA256、SHA384、SHA512、BASE64 依次加密,加密后的数据即为 Key。

总结,这 8 个 CrackME 总的来说都不是很难。
通常情况下对付混淆可以使用 tankaiha 的“dobSpices”或者 dreamman 的“DeObfuscator”或者“DIS#”进行反混淆,对付本地代码加密可以 Dumper,对付加密字符串可以用 VS.NET 模拟写个解密程序或者反射加密函数进行解密。
另外,对于 IL 文件,可以用 #Develop 编写调试,只需要注意 MSIL 的堆栈平衡就 OK 了。

kissy 发表于 2008-6-13 22:15

tankaiha对.NET很有研究
牛人一个
CCL的作者
这个工具的影响不言而喻

apzp000 发表于 2008-6-14 13:42

好文章要保存起来

zsl01 发表于 2010-9-4 15:07

。NET程序支持一下。
页: [1]
查看完整版本: tKC 系列 .Net CrackME 简单分析