样本为某单机卡牌游戏 , 使用的是cocos2d, 然而他并没有使用自带的xxtea方式加解密

这些乱序文件名的 .xy 文件既是lua文件 . 既然是自写的加密 , 逆算法好像过于嚣张了,既然他文件本身是加密的, 那么游戏调用的时候必然会解密 ,最终得到解密的文件 , 那么 IDA 启动

loadbuffer是cocos2d自带的lua读取函数 , 通过分析 , 这款游戏用的就是这个函数. 既然这样 , frida 启动
使用Python载入frida模块 , 以下为python代码 , 我测试时hook写在s1.js里面
python 代码:import frida
import sys
import os
import time
device8 = frida.get_device_manager().add_remote_device("192.168.0.184:8888")
pid = device8.spawn("com.*******.hd")
print("pid:", pid)
device8.resume(pid)
#time.sleep(1)
session = device8.attach(pid)
def write(path, content):
print('write:', path)
folder = os.path.dirname(path)
if not os.path.exists(folder):
os.makedirs(folder)
open(path, 'w').write(content)
def on_message(message, data):
#print(message)
if message['payload']['name']:
name = message['payload']['name']
name = "./app/" + name
content = message['payload']['content']
dirName = os.path.dirname(name)
if not os.path.exists(dirName):
os.makedirs(os.path.dirname(name))
write(name, content)
with open("s1.js") as f:
script = session.create_script(f.read())
#print(script)
script.on('message', on_message)
script.load()
print("------------------------------")
input() #等待输入
以下为上面python调用的JS文件代码 , 对libgame.so进行hook
js 代码:
function main() {
var libgamebase ;
do {
libgamebase = Module.findBaseAddress('libgame.so');
}
while (!libgamebase);
log("libgamebase:", libgamebase);
var luaL_loadbuffer_addr = Module.findExportByName('libgame.so', "luaL_loadbuffer");
console.log("luaL_loadbuffer:", luaL_loadbuffer_addr);
//luaL_loadbuffer (lua_State *L, const char buff, size_t sz, const char name);
Interceptor.attach(luaL_loadbuffer_addr, {
onEnter: function(args) {
var name = Memory.readUtf8String(args[3]);
var size = args[2].toInt32();
var obj = {};obj.name = name;
obj.size = size;
obj.content = Memory.readCString(args[1], size);
send(obj);
}
});
}
setImmediate(main);
运行效果如下:3.png
OJBK . 丝滑又流畅 ,轻松得到所有文件, 打开查看 , 完美收工4.png