这种想抓包就安装个虚拟机然后在虚拟机里装抓包工具的证书(提前转换成安卓支持的格),在把apk安装到虚拟机里,抓包工具打开忽略CONNECT的包。就能抓包了. 在应用层面做得再好也没法确保他的上层设备没问题,你也可以把应用安装在任何一台手机然后在网关设备上安装抓包的证书之后在网关上开代理抓包。
这游戏是基于网狐精华版二次开发的你可以去网上找源码资源分析, 我不发下载链接你自己去谷歌找多的很 什么皇城、宝博、顺金、彩虹堂、彩虹城、九州、宝鑫、发条II、传奇、招财、梦幻、万利等棋牌都是一样的代码改的。去找个lua解密的看看源码是咋写的。
获取网络接口指的是?URL?那你可以反编译luac文件在里头找。
这类游戏的引擎是开源的,想抓数据包的内容的话可以配合着cocos2d的源码去hook对应的函数获取或写入数据。而cocos2d-lua里常用luasocket通信你可以去hook这个函数去获取或写入游戏与服务器的通信数据。游戏外的可以hook Java层的函数获取或写入数据。
https://www.jianshu.com/p/781d835c88c9 Cocos2d-lua工程运行流程的理解
https://juejin.cn/post/7162511636090060813 cocos2d-x lua-binding:将lua-binding结果引入到项目中使用
https://blog.csdn.net/mydreamremindme/article/details/47707989 cocos2d lua绑定感悟---像cc.Sprite,cc.Director这些是如何识别的
https://blog.csdn.net/ByAlick/article/details/81153820 Cocos2dx中lua实现与java交互(异步线程间的数据同步)
根据这几篇文章找到lua绑定的具体函数然后hook 就能获取或写入服务器的通信数据了。
lua绑定的Socket通信源码, 玩游戏时于游戏服务器通信通常会用这个
https://github.com/cocos2d/cocos2d-x/blob/76903dee64046c7bfdba50790be283484b4be271/cocos/scripting/lua-bindings/manual/network/Lua_web_socket.cpp
比如你要在玩游戏时抓游戏客户端与服务器的通信数据就可以
//函数定义 void LuaWebSocket::onMessage(WebSocket* ws, const WebSocket::Data& data)
// 这种方式可以精确的hook某个函数但需要自行查找函数调用地址,动态调试需要自行查找偏移地址。
// 用 nm -DC libcocos2dlua.so | grep -i LuaWebSocket::onMessage 可以找到so内静态的调用地址。
//var func = Module.findBaseAddress("libcocos2dlua.so").add(0x8244b4);
// 当函数是全局唯一时可以用这种方式,如果存在多个函数名则hook无效。
var func = Module.findExportByName("libcocos2dlua.so" , "LuaWebSocket::onMessage");
var Log = Java.use("android.util.Log");
Interceptor.attach(func, {
onEnter: function (args) {
// 在不知道数据类型前先这样看看hook后是否有数据,有数据再用对应数据类型的读函数或转换函数。数据类型不对会导致hook失败。
Log.e("frida-HOOK", "ws:"+args[1]);
Log.e("frida-HOOK", "data:"+args[2]);
}
});
lua绑定的XMLHttpRequest通信源码,游戏内需要HTTP通信会用到这个
https://github.com/cocos2d/cocos2d-x/blob/76903dee64046c7bfdba50790be283484b4be271/cocos/scripting/lua-bindings/manual/network/lua_xml_http_request.cpp
lua绑定的Downloader源码, 游戏内要下载啥文件都会用到这个
https://github.com/cocos2d/cocos2d-x/blob/76903dee64046c7bfdba50790be283484b4be271/cocos/scripting/lua-bindings/manual/network/lua_downloader.cpp
https://blog.csdn.net/freeking101/article/details/109213383 FRIDA - API使用篇:rpc、Process、Module、Memory 使用方法及示例
Frida抓包逆向方面你可以去看看这本书 安卓Frida逆向与协议分析 (陈佳林) 和 安卓Frida逆向与抓包实战 (陈佳林)
这游戏解密用的
key是:ShengRiKuaiLe
sign是:elegate_setHttp
脱壳后的dex在附件classes.dex
脱壳修复加集成frida在附件分卷压缩 Game_20791_414054_frida.zip Game_20791_414054_frida.z01 Game_20791_414054_frida.z02
集成frida用到https://github.com/nszdhd1/UtilScript仓库的LIEFInjectFrida.py,使用方式看作者说明
已解密的luac在附件luac.zip
已反编译的lua在附件lua.zip
反编译用的是 https://github.com/Dr-MTN/luajit-decompiler
批量反编译用到的bash脚本
for i in `find declua -name "*.luac"`;do
dn=`dirname $i`
fn=`basename -s .luac $i`
mkdir -p ./out/$dn
python main.py $i >./out/$dn/$fn.lua
done
Dump lua文件的frida脚本, 脚本文件放置路径为/data/local/tmp/frida_script.js
var func = Module.findBaseAddress("libcocos2dlua.so").add(0x93ad2d);
//var func = Module.findBaseAddress("libcocos2dlua.so").add(0x93ad0d);
Interceptor.attach(func, {
onEnter: function (args) {
this.fileout = "/sdcard/lua/" + Memory.readCString(args[3]).split("/").join(".");
console.log("read file from: "+this.fileout);
var tmp = Memory.readByteArray(args[1], args[2].toInt32());
var file = new File(this.fileout, "w");
file.write(tmp);
file.flush();
file.close();
}
});
获取sign和key的frida脚本, 脚本文件放置路径为/data/local/tmp/frida_script.js
var func = Module.findBaseAddress("libcocos2dlua.so").add(0x6ea6d4);
//var func = Module.findExportByName("libcocos2dlua.so" , "cocos2d::LuaStack::setXXTEAKeyAndSign");
var Log = Java.use("android.util.Log");
Interceptor.attach(func, {
onEnter: function (args) {
Log.e("frida-HOOK", "key:"+Memory.readCString(args[1]));
Log.e("frida-HOOK", "sign:"+Memory.readCString(args[3]));
}
});
最后于 2023-9-14 03:24
被微启宇编辑
,原因: