破解合计行控件AX.SumDataGrid.dll(仅供大家学习交流,勿用于商业用途)

主程序调用AX.SumDataGrid.dll时会先出现下面界面,下面开始破解这个 dll
  先用Reflector 分析,可以加载,但程序是被混淆(加密)过的,可以看到类名(大部分被改成无序的名称了),但要打开类,看类里的代码时会出现  “Expression stack is empty at offset 0006”
 
照着上面的错误提示google了一下,找到了”看雪”, 看雪大牛如是说:
程序是用 .Net Reactor 混淆过的
用dotnet helper反编译得到IL文件,
用文本编辑器删除以下的文本段:
    IL_0000:  br         IL_0007

    IL_0005:  pop
    IL_0006:  ldc.i4.0
,再编译。
得到的文件可以用reflector看C#源码

我照作了,果然OK,可以看到函数内部代码了

于是找到底是哪段代码让上面那个广告弹出来的,刚开始想从反混淆着手破解,先用reflector把AX.SumDataGrid.dll反成C#代码,然后再根据自己2个月的C#学习经验来调试,但是看啊看,实在太累人了,代码里有好多”asdfsdf(“  和  ” Adse)jou”之类的字符串变量,查找替换了老半天,里面还是有很多错误的地方,还是不能编译成DLL,可能这条路行不通.
后来换了思路,找程序的破解入口,也就是说哪句话让那个广告窗口出来了(当时想着找关键字show()),后来在reflector中看代码,分析出来了,是下面这句,后来验证果真不错,哈哈,这两个月的C#也不是白学的

破解前
 
但是知道是这句代码了,还有一个问题没解决:怎么把这句话给去掉(或注释掉)???   现在有的可只是一个DLL文件啊,没有源码啊,自己又不懂IL语言,不会修改,后来临时补了下IL语言(在网上找了一点儿,临时抱佛脚),学了老半天,也还是找不到上面的这个破解入口点所对应的IL代码部分.
下午下班吃完饭,内急,去蹲厕所, 蹲着蹲着,嘿灵感来了,我顿时有种预感破解就要成功了,果真如是

新建一个工程,什么也不要往里边加,就只在一个新定义的函数中添加(还得在工程里新添加一个空类TestExpired)
public void ABC()
        {
            TestExpired expired = new TestExpired();
        }
把这个EXE转成IL代码,这样IL代码就会很短,更容易查找目标,经验证把IL代码中的
    .maxstack  1
    .locals init (class ILCode.TestExpired V_0)
    IL_0000:  nop
    IL_0001:  newobj     instance void ILCode.TestExpired::.ctor()
    IL_0006:  stloc.0
    IL_0007:  ret
部分去掉,再用dotnet helper编译回EXE文件,可以正常运行, 加载到reflector后, public void ABC()部分就变成了
public void ABC()
        { 
        }
在AX.SumDataGrid.dll的IL代码里去掉下面两行(或注释这两行)
    IL_0093:  newobj     instance void AX.SumDataGrid.TestExpired::.ctor()
    IL_0098:  stloc.0
,然后再用dotnet helper编译得到DLL文件,再加载到reflector中后如下,没有TestExpired expired = new TestExpired();这句了,如下图所示.
再用主程序调用AX.SumDataGrid.dll也没有广告窗口了,OK………………..完!!!!!!!!!!!!!!!!!!!!!!