dinghao

记录成长点滴

 

cuteEditor6.0的破解方式与Cuteeditor6.0的脚本调试

  昨天遇到一个Js问题,想调试Cuteeditor脚本。没想到还要许可证,在网上找到个免费的,可是由于loader.js是动态的,仍然没有办法调试。

终于决定破解,以前从没有想过要破解,总感觉这样做很不道德,但是实在是被这个bug折磨烦了,只能破解后看看他的执行流程。没想到第一次破解竟然用了近一天时间,不过最终还是搞定了。

服务端代码破解:

首先反编译为IL,找到动态生成js的代码,让他加载指定的文档。修改完后,编译为dll。原以为搞定了,可是,编译时出现了,签名错误。

去掉强命名,不成功,让clr跳过强命明检测,仍然不成功。

因为私钥是不可能获得的,这就没有办法生成新的hash值,只能走最后一步了,重新生成私钥和公钥。重新对程序集进行签名。

这次终于没有了编译错误,可是跑出了null引用异常。一般人到这一步基本就很难再进行下去了,因为从异常看不到什么有用信息。因为我对cuteeditor的代码比较熟悉,才能继续进行下去。

下面是另一个cuteeditor诡异之处,他在初始化Editor类时,要用到token。以此来防止代码被修改。但是要找到这些信息比较难,一是他用了混淆,二是,这些信息被封的层次很深。

还有这个token被以类似随机数的机制编码:

  string str2 = new string(new char[] {

            (char) ((length + 0x2f) + 4), (char) ((length + 0x27) + 0x11), (char) ((length + 0x24) + 9), (char) ((length + 0x18) + 0x1d), (char) ((length + 0x35) + 3), (char) ((length + 0x20) + 13), (char) ((length + 50) + 15), (char) ((length + 8) + 0x39), (char) ((length + 0x27) + 6), (char) ((length + 10) + 0x2c), (char) ((length + 0x17) + 0x21), (char) ((length + 10) + 0x23), (char) ((length + 0x2d) + 3), (char) ((length + 8) + 0x2a), (char) ((length + 0x23) + 10), (char) ((length + 0x26) + 0x1c), (char) ((length + 3) + 0x2e), (char) ((length + 0x29) + 4), (char) ((length + 8) + 0x2a), (char) ((length + 0x25) + 13), (char) ((length + 0x23) + 10), (char) ((length + 0x25) + 14), (char) ((length + 14) + 0x33)

         });

上面的str2就是token38-58-AA-68-02-B1-22-3A。是不是很难找到?

到此,破解基本结束,只要用新的token替换掉str2即可。

用新的程序集替换后,终于可以调试Js了。

网上还没有6.0的破解版,我估计都在token上卡住了,因为他的licence控制程序并不难找到,感兴趣的可以自己做破解,破解完后用我的私钥做强命名。

另一种破解方式:

对于一些简单的修改,如改变方法名,更改常量。有另一种简单的方式,我没有式过,不过理论上可行。

首先以二进制格式读取,dll

其次,根据pe头,运行环境头找到stringsUS流的地址。根据Token值计算初偏移量。计算方法可以看我以前写的一个文章http://www.cnblogs.com/bluewater/archive/2006/10/17/531639.html或者何宗键的blog

最后一步是,修改stringsUs流的信息。

怎么读混淆后的代码

混淆对我们来说,是不可逆过程。破解是不可能了,但是可以找到一个突破口,一点点的读取。如.net类不能被混淆,我们可以通过这些信息去分析源代码。

不过总体来说,这些基于元数据的语言,是不可能阻止破解的。原数据表必须把信息暴露出拉,以便让clr加载。除非MS,在加载器和dll间,另加一个解释层。但是这么做效率会很低,原数据的存在也变成没有意义了。

JS破解:

Js也用到了混淆,这是没有办法破解的。不过,可以做一些简单的替换来使他易于阅读。如:

function CreateXMLHttpRequest()

{

   if( typeof (XMLHttpRequest) != OxO7c60[0x0])

   {

      return  new XMLHttpRequest();

   }

   ;

   if( typeof (ActiveXObject) != OxO7c60[0x0])

   {

      try

      {

         return  new ActiveXObject(OxO7c60[0x1]);

      }

      catch(e)

      {

         return false;

      }

      ;

   }

   ;

   return false;

}

;

function LoadXMLAsync(Ox878, Ox26a, Ox19e, Ox879)

{

   var Ox12e = CreateXMLHttpRequest();

   function Ox87a()

   {

      if(Ox12e[OxO7c60[0x2]] != 0x4)

      {

         return ;

      }

      ;

      Ox12e[OxO7c60[0x3]] = new Function() ;

      var Ox75b = Ox12e;

      Ox12e = null ;

      Ox19e(Ox75b) ;

   }

   ;

   Ox12e[OxO7c60[0x3]] = Ox87a ;

   Ox12e.open(Ox878, Ox26a, true) ;

   Ox12e.send(Ox879 || OxO7c60[0x4]) ;

}

;

格式化后为:

function CreateXMLHttpRequest()

{

   if( typeof (XMLHttpRequest) != undefined)

   {

      return  new XMLHttpRequest();

   }

   ;

   if( typeof (ActiveXObject) != undefined)

   {

      try

      {

         return  new ActiveXObject('Microsoft.XMLHTTP');

      }

      catch(e)

      {

         return false;

      }

      ;

   }

   ;

   return false;

}

;

function LoadXMLAsync(Ox878, Ox26a, Ox19e, Ox879)

{

   var Ox12e = CreateXMLHttpRequest();

   function Ox87a()

   {

      if(Ox12e['readyState'] != 0x4)

      {

         return ;

      }

      ;

      Ox12e['onreadystatechange'] = new Function() ;

      var Ox75b = Ox12e;

      Ox12e = null ;

      Ox19e(Ox75b) ;

   }

   ;

   Ox12e['onreadystatechange'] = Ox87a ;

   Ox12e.open(Ox878, Ox26a, true) ;

   Ox12e.send(Ox879 || '') ;

}

破解后的文件:
http://www.cnblogs.com/files/bluewater/cuteeditor.rar

私钥:
 http://www.cnblogs.com/files/bluewater/t.rar

posted on 2007-09-06 23:49 思无邪 阅读(...) 评论(...) 编辑 收藏

导航

统计

公告