既然目前很多同学对.net的认识还停留在reflector+ildasm+ilasm通知的阶段,干脆,我再写一篇入门的,让大家都能看明白,动起手来也很简单。
     .NET Reactor是EZIRIZ公司出品的一款.net保护软件,该软件保护.net软件的功能不错,可惜对自己的保护却是很弱。前几个版本的混淆强度挺大,很难定位关键代码,可最新的3.3.0.1版保护就太弱了。MegaX已经发布了它的破解,和他交流过程中发现思路我俩的思路有小差别,在此写出来。本文难度较低,适合初学.net的进行实战入门。
    用CFF Explorer载入reactor的主程序,发现没有元数据,是个win32程序。通常来说这种.net程序是被加壳了。Reactor属于whole assembly保护,最大的弱点是完整程序集在内存中出现,脱壳的方法也很简单,用NET Unpacker直接脱既可。脱壳后可发现15个程序集(如图1),其中一个已经显出了reactor的图标,那便是该程序的真身。(注:现在已经有好几种加密壳无法使用NET Unpacker直接脱了,强度比整体保护大很多。)


图1  用NET Unpacker对整体保护的程序进行脱壳

    用Reflector载入dump出的文件,发现其名称混淆形式如图2所示。真不知道EZIRIZ怎么想的,竟然混淆成这么短,且又好读又好记的名称。前几版的名称比该版本麻烦多了。

图2  很简单的名称混淆

    下面看下流程混淆的形式,与前几个版本一样,使用一个跳转,中间加杂使堆栈溢出的指令,且每个方法的开头都是这三句:
代码:
L_0000: br L_0007
L_0005: pop 
L_0006: ldc.i4.0 
L_0007: nop 
 

    反流程混淆的两种方法:一,用ildasm反编译成il,在EditPlus中搜索前三句指令,并替换为空,如图3所示。

图3  在EditPlus搜索流程混淆指令并替换

    第二种方法,使用我很久以前发的流程混淆小工具replace,尤其对.net reactor这个软件,效果及好。
    反流程混淆完成后,便可以用C#代码浏览了。所有的敏感代码都在入口方法中,爆破的方法很简单,添加一句将flag变量设为真的指令就行了,如下(不敢想像,居然没有校验):
代码:
[STAThread]
public static void uN(string[] A_0)
{
    int num;
    RSACryptoServiceProvider.UseMachineKeyStore = true;
    bool flag = Gz();
    flag = true;//添加的指令
    111 = flag;
    if (!flag)
    {
        110 = M0();
        flag = false;
    }
    HTt.HCw = flag;
    1LY.1LB(flag);

    有兴趣的同学可以跟出它对注册文件的判断。早期版本我跟过,后来它改进了。有两种扩展名,.v3lic和.license,应该也不难。
    就到这,这个软件就这么简单,没什么好多说的。对.net有兴趣的同学可以进行实战的入门训练了。