腾讯Unity3D手游 dll加密分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BlueEffie/article/details/49077769

此文章的技术内容已过时,仅当做技术存档参考。腾讯的Unity游戏已不再mono.so中加密dll了,而是通过libtprt.so来hook了加载Assembly-CSharp.dll的地方进行解密,解密算法有点复杂,建议用ida动态dump


腾讯有很多用Unity做的手游,比如《XX飞车》《我叫XX2》《XX战神》《XX与勇士》等等,都对dll进行了加密,而且这些游戏对dll的加密方式是一样的

关于Assembly-CSharp.dll和Assembly-CSharp-firstpass.dll的加密原理参考Unity3D 游戏加密解密那些事

以Assembly-CSharp.dll为例,来分析一下TXUnity游戏解密dll的算法

0x00 把libmono.so文件拖入IDA中,在函数窗口中搜索mono_image_open_from_data_with_name这个方法

 

这时我们看到除了mono_image_open_from_data_with_name还有mono_image_open_from_data_with_name_0这个方法,mono_image_open_from_data_with_name是Mono本身就有的方法,而mono_image_open_from_data_with_name_0肯定是TX后加的,可以分别打开这2个方法看看

按Tab或F5 看看mono_image_open_from_data_with_name方法的伪代码,里面直接调用了mono_image_open_from_data_with_name_0这个方法

 

在看看mono_image_open_from_data_with_name_0方法的伪代码

能看到3个方法: sub_3D21CC,sub_3D20c8,sub_3D20B0,第一个是解密的方法,第二个忽略,第三个是mono_image_open_from_data_with_name原方法的逻辑

 

0x01 进入sub_3D21CC这个方法看看解密算法是怎样的

红框中的内容就是解密dll的核心算法,在看看汇编代码

 

0x02 经过上面的分析,我写了一个C#版的解密小工具,这里只贴出解密算法

//TX Assembly-CSharp.dll解密算法
private byte[] mono_image_encrypt(byte[] bytes)
{
    if (bytes[0] == 0x4D && bytes[1] != 0x5A)
    {
        for (int i = 0; i < bytes.Length - 1; i++)
        {
            bytes[i + 1] = (byte)((bytes[i + 1] + 0x77) ^ 0x8D);
            bytes[i + 1] = (byte)(((bytes[i + 1] ^ bytes[i]) + 0x3A) ^ 0x93);
        }
    }
    return bytes;
}

 

解密后用对比工具看下,现在能看到了Dos头部信息

0x03 用.Net Reflector 打开解密后的dll

这里报了个错误,元数据头签名无效(关于.Net 文件格式和元数据等知识这里就不讲解了,感兴趣的话网上有很多资料)


关于元数据头中Signature的修复 腾讯是在mono_image_open_full中去检测这个值,可在IDA中搜索字符串“BSJB”来定位具体的位置

这里直接用CFF Explorer修复一下就好(快捷方便偷笑),找到.Net 元数据头,在Signature的Value值中填入424A5342,修改后保存

在用对比工具比较一下,左边就是刚才修改后的,已经清晰的看到‘BSJB’签名了

 

这时在.Net Reflector 中就能看到dll的代码了

 资源提取源码

链接:http://pan.baidu.com/s/1kVudWSB 密码:i58w

猜你喜欢

转载自blog.csdn.net/BlueEffie/article/details/49077769
今日推荐