py脚本直接注入的话,cocos2d游戏会暂停在黑屏导致hook失败。
一开始以为是有反调试,采用 https://www.jianshu.com/p/87769bc0f19e 的办法,
frida -U -f com.app -l script.js --no-pause
(,其中-f 即spwan,在程序最先启动的时候注入。--no-pause是不暂停。这里就可以绕过正常程序反附加的保护措施,但是如果程序中还存在基于frida特征检测的代码,那么我们就需要根据其检测点,来bypass检测。)
确实是不暂停了,但加载的test1.js:
Interceptor.attach(Module.findExportByName("libcocos2dlua.so" , "luaL_loadbuffer"), {
onEnter: function(args) {
send("Function called!");
},
onLeave:function(retval){
send("Bye bye!");
}
});
却出了
error:expected a pointer
at frida/runtime/core.js:502
at /test1.js
的错误提示。
从 https://www.codeleading.com/article/40892488269/ 发现是在刚启动的时候, libcocos2dlua.so 还没有加载,于是frida找不到这个 libcocos2dlua.so ,导致attach 失败了,报了这个错误。该网页但没有解决方案。
最后在https://www.2cto.com/kf/201708/671160.html 发现,“再次运行代码,保持应用处于启动状态,我们的代码就能正常执行。具体操作为,先结束第一次运行的脚本,保持应用处于打开状态,再次运行脚本,点击“inspect using native code”按钮后,程序的运行状态如下图所示。”
由此,尝试了:
1、先运行frida服务端,端口进行转发;
2、再在手机中运行目标apk,等一会,让它加载上 libcocos2dlua.so 【经测试,启动界面过后,到出现“进入游戏”这些字样时候,就加载上 libcocos2dlua.so了
】
3、再 frida -U com.app -l script.js --no-pause,
(去掉了 -f 因为其中-f 即spwan,在程序最先启动的时候注入,带了F会从头启动一次,这时libcocos2dlua还没来得及加载所以会报错。)
然后会attch上,等待so的调用然后hook之……就可以了
--------------------
ps:利用objecttion 可观察该程序在运行时都加加载了哪些so,观察so都有哪些导出函数,从而有的放矢hook到真正的函数名。(当然也可以反编译apk后找到 libcocos2dlua,再用IDA)https://www.anquanke.com/post/id/197657#h3-10