强大的.net反编译工具

前言:

    前段时间需要个年月和时间选择的控件,自己写麻烦,js非我所长,于是上google,功夫不负有心人,找来找去找到个蛮不错的,但是要付费,好奇心起,就把它剖开来看了下,体验了一下反汇编工具的强大威力。

    实际项目中是不允许使用破解软件的,解开来纯属研究。

 牛刀:

    Ilasm.exe Ildasm 是微软提供的.net汇编和反汇编工具,基于MSIL,随.NET Framework SDK附带。
   Reflector for .NET
Lutz Roeder提供的一个反编译工具,可以方便的查看和分析.net程序中的类。

 鸡:

    Peter's Date Package v1.1.11

 过程:
1
、跟踪

    用Reflector打开PetersDatePackage.dll,展开命名空间视图,一下就看到了LicensingEngine,继续展开看到了LicenseMgr,是个抽象类,看看其成员没有找到作注册校验的,如图r1 

    在LicenseMgr右击,选择Analyzer,在右边的窗口中会显示其依赖关系,展开Used BY如图r2

    看到了PeterBlum.PetersDatePackage.ControlLicensing.CheckLicense(String, WebControl) : Void在上面右击,选择Go To Member,打开了ControlLicensing.CheckLicense这个方法,再看一下它的依赖关系,如图r3-method

    Used By列表里几个类名显示是控件,打开PopupBaseOnPreRender看看,再逐一查看,果真都是调用此类进行注册校验,集中火力改这个方法就可以了。

    双击方法名,查看反编译结果,如图r3-onPreRender

 2、反编译

    用ildasm打开PetersDatePackage.dll,找到ControlLicensing如图il1

    双击CheckLicense,查看该段代码对应的MSIL,如图il2 

   要让它不校验注册很简单,改为直接返回即可,也就是把第一条指令改为ret,由于ret(相当于C#中的return)只占一个字节,而此方法第一条旧指令占了5个字节,搞点垃圾来充数,后面用retnop(空操作)填充都可以。
   
菜单中文件/转储,全部勾选,导出为PetersDatePackage.il,用UltraEdit(其他文本编辑工具也可)打开此il文件,找到上面所说的那段汇编代码,如上面说的泡制,保存。

3、编译

    在命令行方式下ilasm /dll PetersDatePackage.il,生成dll

 4、测试

    打开VS做个简单的测试项目,一运行提示签名验证失败。

    新问题出来了,就是该控件加了强命名,而我们没有他的私钥,PublicToken校验会失败。

 5、去掉强名称

    在.assembly段中可以找到:
    .custom /*0C000005:0A000003*/ instance void [mscorlib/* 23000001 */]System.Reflection.AssemblyKeyFileAttribute/* 01000052 */::.ctor(string) /* 0A000003 */ = ( 01 00 1B 2E 2E 5C 2E 2E 5C 50 65 74 65 72 73 44   // ...../../PetersD
   将KeyFile去掉,修改为:
    .custom /*0C000005:0A000003*/ instance void [mscorlib/* 23000001 */]System.Reflection.AssemblyKeyFileAttribute/* 01000052 */::.ctor(string) /* 0A000003 */ = ( 01 00 00 00 00 )

     公钥段

    .publickey = (00 24...}
    删除之,再次编译,测试顺利通过,随便改日期J

后话:

    工具真强大,没有加混淆器的assembly真的搞起来是势如破竹,我这个只看了5分钟MSIL不到的人竟然这么容易就把这事摆平了。

    同时对MSIL也产生了兴趣,从硬盘角落里找到了Inside Microsoft .NET IL AssemblerMS Press)这本书,准备研读一下。

你可能感兴趣的:(.net,汇编,String,Microsoft,assembly,反编译工具)