|
![]() | 作者: yongmin [yongmin]
![]() |
登录 |
作者:tracky 转贴自:一蓑烟雨 在论坛看见 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”代表输入的用户名): [Copy to clipboard] [ - ]CODE: 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 了。 本文中所有 CrackME 原程序以及我用 C# 写的 Keygen 下载。 QUOTE: http://www.live-share.com/files/212115/CrackME.rar.html |
地主 发表时间: 07-05-07 10:56 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号