终于决定破解,以前从没有想过要破解,总感觉这样做很不道德,但是实在是被这个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就是token值38-58-AA-68-02-B1-22-3A。是不是很难找到?
到此,破解基本结束,只要用新的token替换掉str2即可。
用新的程序集替换后,终于可以调试Js了。
网上还没有6.0的破解版,我估计都在token上卡住了,因为他的licence控制程序并不难找到,感兴趣的可以自己做破解,破解完后用我的私钥做强命名。
另一种破解方式:
对于一些简单的修改,如改变方法名,更改常量。有另一种简单的方式,我没有式过,不过理论上可行。
首先以二进制格式读取,dll。
其次,根据pe头,运行环境头找到strings和US流的地址。根据Token值计算初偏移量。计算方法可以看我以前写的一个文章http://www.cnblogs.com/bluewater/archive/2006/10/17/531639.html或者何宗键的blog。
最后一步是,修改strings和Us流的信息。
怎么读混淆后的代码
混淆对我们来说,是不可逆过程。破解是不可能了,但是可以找到一个突破口,一点点的读取。如.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