|
吾爱游客
发表于 2015-10-20 00:30
1、申 请 I D : 初雪月夜
2、个人邮箱:qwx_01@126.com
3、原创技术文章:
看了http://www.52pojie.cn/thread-376901-1-1.html milkice的文章,暴力的太可怕,于是我也拿来分析了一下代码,借鉴了milkice的分析思路,没有修改程序的逻辑结构,只改了验证部分。
工具用了.NET Reflector+插件的reflexil,其他几个工具也用过,这个最顺手,看起来很更好
先看看mcmyadmin.exe的加密方式,
貌似还加了RSA的签名认证?
不过根据这个程序的名字来看只是一个更新程序,后来验证没有这个更新程序主程序一样可以运行,分析了一下他的入口,
Console.BackgroundColor = ConsoleColor.DarkBlue; Console.ForegroundColor = ConsoleColor.White;这两句,ok有颜色了,这主程序没用了。分析的时候有个ds引用,随手点开看看,有Gzip,直接用C#自己带的Gzip一下,下面是代码,除了最后的那些,剩下的是复制milkice的。[C#] 纯文本查看 复制代码 byte[] array = File.ReadAllBytes(@"C:\Users\qwx\Desktop\mcserver\mcmyadmin\McMyAdmin.ebi");[/font] for (int i = 0; i < g.Length; i++)
{
if (array[i] != g[i])
{
Console.WriteLine("Unrecognised File Header");
}
}
MemoryStream memoryStream = new MemoryStream(array, false);
BinaryReader binaryReader = new BinaryReader(memoryStream);
memoryStream.Seek(-12L, SeekOrigin.End);
int num = binaryReader.ReadInt32() - 2;
int num2 = binaryReader.ReadInt32();
int num3 = binaryReader.ReadInt32();
memoryStream.Seek((long)(-(long)(num + 20 - num3)), SeekOrigin.Current);
int count = binaryReader.ReadInt32();
int count2 = binaryReader.ReadInt32();
memoryStream.Seek(0L, SeekOrigin.Begin);
byte[] array2 = new byte[]
{
31,
139
};
binaryReader.ReadBytes(4);
byte[] signature = binaryReader.ReadBytes(count);
byte[] keyBlob = binaryReader.ReadBytes(count2);
memoryStream.Seek(8L, SeekOrigin.Current);
byte[] array3 = binaryReader.ReadBytes(num);
byte[] array4 = new byte[num + 2];
array2.CopyTo(array4, 0);
array3.CopyTo(array4, 2);
byte[] array5 = new byte[num2];
MemoryStream a_ = new MemoryStream(array4);
GZipStream Compress = new GZipStream(a_, CompressionMode.Decompress);
Compress.Read(array5, 0, num2);
FileStream fs = new FileStream(@"C:\Users\qwx\Desktop\mcserver\mcmyadmin\McMyAdminb.ebi", FileMode.Create); //TODO:Enter your own output file directory
//将byte数组写入文件中
fs.Write(array5, 0, array5.Length);
[font=Tahoma, Helvetica, SimSun, sans-serif]fs.Close(); 解析出来的文件直接丢到reflect里,解析一下下手破解,先看类名,有两个关于License的,在CCLClient里面包含一个LicenceData类,有名字和授权类型,分析一下,
这个数据在Mcmyadmin的config下被使用了,进去看了一下,有licensetype这种枚举milkice就是修改这部分的代码不过修改这个担心会对程序造成影响,所以还是对注册过程patch吧查看Licencing下的公共方法,初始化里面看到了个pubkeyRSA,作者真愿意用这东西。。。除了CheckActivationData这个私有函数不能被反编译之外其他都好说,我看不用msil,暂时一放,丢到reflecior里面的时候发现被混淆[module: ConfusedBy("ConfuserEx v0.4.0-46-g76ab048")]在52上找了个可以反混淆的http://www.52pojie.cn/thread-362111-1-1.html根据那个old版本的做下去做完之后
可以看到了看了一下这个函数,注册码的机制也明白了注册码先读入,在license.dat里然后RSA解密,再将解析出来的JSON串变回类,放到info里,本来可以修改公钥然后做注册机的,但是貌似没法修改,在config里,那个东西没法反编译。那么没办法,直接强行破解吧,首先先改LicenceData的初始化函数让他一开始就有GradeName,我们要Enterprise版!直接修改汇编由于我不会MSIL,所以自己写了个C#的小程序,丢到reflector里面一看照葫芦画瓢
一条一条添加
我笨,不知道有啥更好的方法。。。添加完了,保存一下,重新打开
搞定,其他参数不改也罢,除了那个ID被使用了之外其他的都没用接下来修改验证的其他方法,首先是CheckActivationData由于info这个变量在licensing初始化的时候已经被初始化了,所以全程不需要修改这个变量,那么,这个函数就全部return ture吧return true只需要两行代码,先将原来的IL代码全部删除替换为ldc.i4.1ret然后删除所有的variables下的内容,否则会出错。
CheckActivationState这个函数不要动,涉及mcmyadmin的验证MigrateLegacyLicence这函数不知道干啥的,调用参数有两个,一个是key 一个是email,目测没啥用,暂时跳过(其实是我看不懂这方法,貌似里面也没有代码,一直调用基类的)PerformActivation这个好办,是将注册码写会文件的,我们没有文件,这函数没有返回值,那好说,直接全部清空~除了最后的ret之外,保存重开一下(我这里自己操作失误,写成了return true,reflector直接打不开这个方法了,而且还没备份,好吧,重新来过。。。)Requery函数像是重新查询key的,时时刻刻验证嘛,好吧,直接return true保存一下,所有的东西都改完了,那么,一定要运行起来看看了
ok Enterprise看到颜色很别扭对吧,开头那两句C#的话就是为了这个,写个bat修改一下颜色吧,不贴了。Machine ID全部都为0,那个ID在MSIL里面很难初始化,我没弄好,反正也不影响使用,就这么放着吧于是,以上就是破解过程,不够详细,我自己在破解的过程中思考了很多,好多方法跳来跳去很难分析,不过静下心来看看这还是很简单的,最后传一下我修改好的那个ebi,论坛貌似不让上传exe,那就上传个txt
下载后自行改名成exe后缀,可以直接运行最后上一张结果图
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|