记一次cocos逆向
我是说如果,你还顺利的话,我得提醒你一下,逆向不注意,亲人两行泪。这里所做的其实只算是逆向中皮毛的皮毛,不过逆向也并不是那么得深不可测,逆向的领域也有很多,人生年不过百,希望你能在有限得时间内能在自己的领域有大成。httpshttpshttpshttpshttps。.........
为什么要想着去做逆向
有一次我在考虑怎么给游戏加密的时候,突发奇想,与其想着怎么加密,不妨看看那些搞逆向的是怎么破解的,正所谓知彼知彼,百战不殆。然后就开始了我的逆向之旅…
何为逆向技术
逆向技术是一项既庞大而又复杂的知识系统,上到密码学,下到各种编程语言系统,若想有大成,没个三年五载难是很难的。因此,我只是去了解了一下关于cocos的逆向,在此我借鉴了一下**https://www.freesion.com/article/1910938019/**这篇博客的一些思路,读者也可以了解一下,但是最后笔者发现这个学习资料太少,又花点时间了解了一下目前主流的逆向技术,最后还是选择了用hook,框架选择了frida,主要frida有不少的学习资料,使用也很方便。
cocos逆向思路
这里我只介绍用xxtea加密的(主要其它自定义的我也不会…)。
1.获取xxtea签名
2.获取xxtea key
3.用xxtea算法解密
准备工作
xxtea的签名能直接获取,主要工作是获取key。xxtea算法的key一般是写在c++层的,所以必须得分析c++的代码,一般我们逆向都是拿人家发布的游戏来做的,而且一般拿安卓的apk(不要问为什么),所以就要分析apk里的so文件。
而分析so文件就必须要反编译,所以我们需要IDA工具。我们主要分析so中xxtea解密算法接口所在的内存偏移地址,然后用hook技术截取到这个key,所以我们还需要搭建hook的环境。
所以需要准备以下工具:
1.下载并安装好IDA【官网链接】
2.一台root手机(笔者主要时间花在了这里…)
3.搭建好frida的hook环境【传送门】
要做到这三步也并非易事,这里关键是搭建frida环境,注意:
1.adb工具版本和手机支持的adb的匹配且能获取adb root(笔者在这里也花了点时间)。
2.frida的服务工具包的架构要和手机的cpu架构匹配,现在的手机基本arm64了吧。
3.注意so使用的指令架构,分thumb和arm指令,看IDA里的反编译的so相邻地址偏移量是多少,大于2是arm,反之都是thumb,thumb指令要在算接口内存中的地址时要+1。
开始逆向
1.获取xxtea签名:
用记事本随便打开一个加密文件,取前面几位明文,记录下来。
2.根据手机cpu架构分析so,拿到接口内存偏移地址
做cocos的都很熟悉引擎结构,很容易就能定位到xxtea解密接口的位置。这里的是我的手机是arm指令集,所以就是箭头所指的地址。
3.写hook脚本获取key:
到这一步前提是手机上已经运行了frida的服务端了,直接上脚本:
import frida
import sys
rdev = frida.get_remote_device()
session = rdev.attach("游戏进程名")
script = session.create_script("""
Java.perform(function(){
var soAddr = Module.findBaseAddress("libcocos2dlua.so");//0x04000000;//Module.findBaseAddress("libcocos2dlua.so");
send("soAddr:"+soAddr);
var MD5Digest = soAddr.add(0xFE7B94)
send("MD5Digest:"+MD5Digest)
console.log("MD5Digest in libcocos2dlua.so addr:"+MD5Digest)
Interceptor.attach(MD5Digest, {
onEnter: function(args) {
send('hooking...');
send("arg0:"+args[0]+" arg1: "+args[1]+" arg2: "+args[2]+" arg3: "+args[3]+" arg4: "+args[4]+" arg5: "+args[5])
send(Memory.readCString(args[2],9)) #args[3]的值
}
//, onLeave: function(retval) {
// retval.replace(0); // Use this to manipulate the return value
//}
});
});
""")
def on_message(message, data):
if message['type'] == 'error':
print("[!] " + message['stack'])
elif message['type'] == 'send':
print("[i] " + message['payload'])
else:
print(message)
script.on('message', on_message)
script.load()
sys.stdin.read()
拿到xxtea的key,记录下来:
4.开始解密
让人激动人心的时刻终于到来了,这里我使用了一个xxtea工具【传送门】
最后
我是说如果,你还顺利的话,我得提醒你一下,逆向不注意,亲人两行泪。这里所做的其实只算是逆向中皮毛的皮毛,不过逆向也并不是那么得深不可测,逆向的领域也有很多,人生年不过百,希望你能在有限得时间内能在自己的领域有大成。
更多推荐
所有评论(0)