一、 C#程序的反汇编工具详见下面地址
Reflector 已经out了,试试ILSpy
http://www.cnblogs.com/JamesLi2015/archive/2011/09/08/2170519.html
二、破解
由于第一次发破文,写得不好请大家多见谅,另外由于其他方面的原因破文涉及到的程序也暂时不能上传与大家分享,请见谅。
废话不多说,直接开始讲破解过程,要破解的是一个医疗信息管理系统。
首先,安装程序,在安装程序发现提示要安装.NET 1.0,
所以推断程序的编写语言为C#
,安装后的程序文件如下所示:
![](http://attach.52pojie.cn/forum/201211/17/014227q02p20058z0uv2vu.jpg)
由于推断为C#
编写,所以安装完成后立马用反编译工具Reflector
查看,如下所示:
![](http://attach.52pojie.cn/forum/201211/17/014314til6trz734pt0105.jpg)
可以看到命名空间及类名等都被混淆过了,看来是不能直接反编译,但是从上图中我们也可以看到其混淆工具为XenoCode.(
尽管反编译出来可能没有多大作用,但出于对其代码的好奇一开始我还是把它给反编译出来了,得到一大堆文件名乱七八糟,类中的函数体大都为空实现的东西,不过后来还是证明这些还是有些用处滴)
于是,上网查找XenoCode
的反混淆方法,尽管没有找到具体的方法,但也有不少收获,其中最大的收获就是运用C#
的反射机制来提取程序函数的MSIL
代码。
找到了提取MSIL
代码的方法之后,接下来事必要找与注册试用之类有关的提示信息去定位检测试用版的函数过程,但是程序已经被混淆了,查找字符串也不是那么容易,这时还是互联网帮了大忙啊,找了大半天找到了一个可以查看C#
混淆程序中字符串的工具DoNetStringSearch,
程序运行后如下图所示:
![](http://attach.52pojie.cn/forum/201211/17/014349ublaub2ql1izqlql.jpg)
从这里我们找到了有关注册提示的字符串并且也可以知道是哪个类的哪个函数在做这些事情。
好了,竟然已经找到在哪里进行的注册信息检测的了,下面接下来的事情就是提取这个函数的MSIL
代码了,互联网又一次帮了忙,找到了一个类库来帮助我做这件事情,这个类库名称叫SDILReader
,由于下载地址没有保存,同志们可以到网上去找一下。
编程是偶的强项啊,接下来二话不说写了个破烂程序将MSIL
给提取出来了啊,下面是那段破烂的程序代码(
偶以提取MSIL
代码的字符串为目的,没有关注代码的可读性之类的)
:
![](http://attach.52pojie.cn/forum/201211/17/014415w6hk1w2nw55nx441.jpg)
好了,OK
,最后那个字符串msil
中的内容就是我们要的程序代码了,这里贴一部分代码给大家看一下(实际的代码很长):
![](http://attach.52pojie.cn/forum/201211/17/014436dxrazxjhaqx3q7al.jpg)
哈哈,看起来很吓人吧,实际上并不是很困难,只要你懂得MSIL
代码这个就被你给破解了啊,尽管XenoCode
对程序的流程逻辑进行了乱序混淆,但是并没有吓倒我,因为之前已经在网上了解到XenoCode
的流程混淆只是使用了goto
,只要按着goto
的走向一直分析下去肯定是可以解决了。
接下来就是逐行翻译MSIL
代码为伪C#
代码了,从而将混淆的处理流程恢复出来,
得到可以让人读得懂的代码,经过周末一个晚上的努力把MSIL
翻译成了下面的成果:
![](http://attach.52pojie.cn/forum/201211/17/014459x01at11tav0il1a1.jpg)
当然除了这些代码之外,下面还有很多,但是那不影响我们分析程序已经注册的处理,因为到截图中的最后一个return
返回时已经表示程序已经注册过了
分析上面代码我们可以得出,程序从注册表读出了四个加密值setting1,setting2,setting3,setting4
并且解密之后分别将
1. setting1与x5016294158e82a1c.x1060241253fad742.x0607124d85f78745()返回的对象进比较,相等为true
2. setting2与x5016294158e82a1c.x1060241253fad742.x0607124d85f78745()返回的对象即setting1经过x5016294158e82a1c.x1060241253fad742::xfc163b673c29017d(str)处理后返回的对象进行比较,相等为true
3. setting3与”yes”进行比较,相等为true
如果以上三个比较都是相等的那么就表示注册成功。
到这里,我们已经很接近成功了,因为我们可以通过以上三个比较来得出
setting1,setting2,setting3三个的解密值,其中
setting1= x5016294158e82a1c.x1060241253fad742.x0607124d85f78745();
setting2=x5016294158e82a1c.x1060241253fad742::xfc163b673c29017d(setting1);
setting3=”yes”
那么剩下的如果我们能找到他们的加密方法,将他们三个加密后再存回注册表那么我们的
破解就最终完成了。
这时那些被我反编译出来的空壳子发挥作用了,因为根据我翻译出来的伪代码我们可以知道
解密函数在哪个类里,那么可以猜测加密的函数也一定会在那个类里,经过几次的函数调用
的尝试终于被我找到了加密函数:x5016294158e82a1c.x1060241253fad742.x75ab8ead4c62ab63
就这样一个破解程序就诞生了:
![](http://attach.52pojie.cn/forum/201211/17/014517ai1l09zsusvn51wb.jpg)
程序就此破解。