做过程序破解的同学都知道,一般的破解分为静态和动态两种,对于动态的破解,大家比较常用ollydbg,其虽然非常强悍,但貌似对.net程序支持不是很好,呵呵也许是我使用不够熟练吧。

   对于.net程序,我们知道,它类似于Java,编译后只是编译成了一种中间码(IL),其高于汇编但低于高等语言如C#,Java之类。其运行时候需要一个运行时,然后在需要的时候才进行JIT,根据当前系统平台将IL转成汇编码。 普通的保护也就是做些混淆,加上强签名,再加上SuppressIldasmAttribute属性禁止Ildasm,相应的破解方法也比较简单,使用修改过的ildasm就可以将相应的IL导出来,然后修改IL代码,再使用ilasm将之编译回去,破解也就完成了。

    不过呢,目前也有一些比较好的.net程序保护工具可以将IL隐藏,如国内的Maxtocode。今天下午我就遇到了一个该类型的保护程序。我使用ildasm打开后查看到所有的方法内容IL都是下边这样:

.method public hidebysig static void  MethodName(class [System.Windows.Forms]System.Windows.Forms.Control contrl, 
                                              string text) cil managed noinlining 

  // 代码大小       4 (0x4) 
  .maxstack  4 
  IL_0000:  nop 
  IL_0001:  nop 
  IL_0002:  nop 
  IL_0003:  ret 
} // end of method CallCtrlWithThreadSafetyEx::SetText

这样的话即使将它们导出也无意义,即使我们使用反射动态的获取它们的IL,也会得到我上边的结果,显然这样的保护做的已经是非常好了。

    那么我们就没有办法了么? 正当我觉得山穷水尽的时候,突然想起来为什么不使用windbg呢。 我们知道任何的保护它都不应该破坏程序的正常逻辑和行为,那么.net的JIT机制是不是也应该还是有效呢?如果有效的话,那么我们是否可以通过windbg的!u addr命令来反编译得到代码呢,说干就干,我立刻挂上目标程序,果不其然,!dumpil得到的依然是上边说到的Il内容,但!U却能得到正确的完整的逻辑。

既然已经得到的汇编代码,那就好办了,使用windbg的ed命令修改一下关键的指令,立刻工作。哈哈,太完美了,下边我就将我的完整破解过程列出来,以防以后忘记。

本来准备将博客中的文章粘贴到这的,可发现粘贴过来后格式、图片全丢了,那详细步骤大家可以移步:http://www.xioxu.com/?p=326010
有朋友说上边地址访问不了,哈哈,没办法我的网站部署在GAE上边,常这样。所以我刚将文章转成了pdf格式,感兴趣的同学请---下载---
存储在Box.net的 下载地址http://www.box.net/shared/cfx9vbxd7h

上传的附件 DotNetApplicationCrack.pdf