探索黑客技术攻防,实战研究与安全创新

导航菜单

我与DotNet的初夜

朋友给我发过来一个软件(Pimero),让我帮他看看能不能给破解掉,程序安装完后我顺手使用PEID检查了一下,显示为“Microsoft Visual C#/Basic.NET”,这个结果立马让我头大了许多,因为之前从来没有做过DotNet程序的逆向分析,所队也就无从下手了,既不知道使用什么工具来进行分析,也不知道使用什么工具来进行修改。幸好有搜索引擎和各大逆向论坛的帮助,才让我在阅读了几篇相关文章后有了一点眉目,并最终顺利的完成了对这个程序的逆向分析,下面我就将整个分析过程整理出来和大家分享,希望对初学者们能够有所帮助。

对于逆向分析DotNet程序,我们需要用到一款名叫“Reflector”的工具,它可是DotNet逆向分析不可或缺的工具之一,具有强大的反编译功能,支持查找和分析,同时还提供了插件机制,我们可以获得众多的插件来增强它的功能,最重要的是它能将IL转换成高级语言以提高代码的可读性。

QQ截图20170312144815.png

我们运行“Reflector”,并载入目标程序集,这说明目标程序已经被“Reflector”识别出来了,如果识别不出来程序集,它就会在程序集的名称前面显示一个红色的感叹号。

依次选择打开“Pimero”——“Pimero.exe”——“{}Pimro”——“Prgram”,观察左边展开的节点下面的子项目,就会看到“EnterRegistationCode():boolean”这一子项,双击打开后就可以在右边看到如下的

代码:

分析上面的这段代码,可以看到“License licnse= new Licnse(dialog.EnterdCode);”这句,点击“new Liense(diaig.EnteredCode);”处的“License”,就会打开它的实现代码,我们从中找到了如下的关键代码:

分析这段代码,我们就会看到程序调用了EncrypUonUtils.DccodeRegistrationKey()函数来解密被加密过的注册码,然后使用String类的Split方法分隔解密后的字符串并保存在数组中,通过继续分析这段代码,可以发现如下所示的处理代码,以下代码将分割后的解密串分别赋值给了不同的变量。

通过其变量的语义我们可以大致猜测出这些变量的含义。

由此我们可以得出被解密后的字串的具体含义都代表什么了,接下来我们继续看上边提到的EncryptionUtils.DecodeRegistrationKey()这句代码,点击打开“ErtcryptionUtils”类,就会看到如下的代码:

通过分析函数名以及代码的实现过程,可以得到注册码解密的函数的实现过程,具体代码如下所示:

根据上面的代码我们不难推导出其加密注册码的实现过程,代码如下所示:

现在返回到“License”函数的实现代码上,我们可以看到“this.ProductVariantDef = Product.GetProductVariantDef(strArray[l]);”这句代码,代码当中包含了一个“Product”类,通过查看“Product”类的实现代码,就可以得到代码了。

在此段代码中定义了对各个版本所定义的不同的值数据,对应着前面分析的“Array[l]//产品版本”这一项的信息。至此所有代码信息就基本收集完成,可以开始实现注册机了(c#代码),关键代码如下所示。记得要把“EncryptionUtils”类的实现代码(其中要包含自己实现的加密函数的代码,程序中会用到,并且要添加相应的头文件)贴在此代码之前,不然我们不会编译通过的。

这里我把一些字段都设置成固定的值了,当然也可以通过“textBox”控件获取这些值,然后再进行计算,这里就不再进行代码的实现了。读者朋友们可以自己来实现这部分的代码,包括添加一个ComboBox来选择不同的版本等。

本文到这里就算是结束了,在这次分析中我遇到了很多不懂的地方,但是通过Google或百度的查询都一一解决了,做为一个初学者应该多利用搜索引擎来查找解决遇到的问题,井做好相应的笔记记录,这对水平的提高是很有帮助的,希望通过本文的学习,能够让初学者们了解一些关于.Net程序的分析过程以及工具的使用。

本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。