前言:
前段时间需要个年月和时间选择的控件,自己写麻烦,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列表里几个类名显示是控件,打开PopupBase的OnPreRender看看,再逐一查看,果真都是调用此类进行注册校验,集中火力改这个方法就可以了。
双击方法名,查看反编译结果,如图r3-onPreRender。
2、反编译
用ildasm打开PetersDatePackage.dll,找到ControlLicensing,如图il1。
双击CheckLicense,查看该段代码对应的MSIL,如图il2。
要让它不校验注册很简单,改为直接返回即可,也就是把第一条指令改为ret,由于ret(相当于C#中的return)只占一个字节,而此方法第一条旧指令占了5个字节,搞点垃圾来充数,后面用ret或nop(空操作)填充都可以。
菜单中文件/转储,全部勾选,导出为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 Assembler(MS Press)这本书,准备研读一下。