此文章的技术内容已过时,仅当做技术存档参考。腾讯的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#版的解密小工具,这里只贴出解密算法
解密后用对比工具看下,现在能看到了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