标题: 调试 Frida 脚本的方法 分类: 逆向 创建: 2022-11-19 00:11 修改: 链接: http://0x2531.tech/reverse/202211190011.txt -------------------------------------------------------------------------------- 使用 Frida 干活,应该说最重要的是编写 JS 脚本。想要高效的编写脚本,掌握调试 JS 代码的方法是关键。 下面介绍的这些调试方法,不能说孰优孰劣,只能说各有适合的使用场景和个人偏好。 方法1:直接使用 CLI REPL 通过 spawn 或 attach 的方式插桩后,直接在 REPL 终端编写 JS 代码。 $ frida -U Safari [USB::iPad 4::Safari]-> 这种方法简单直接,适合快速验证某个接口调用。不适合编写复杂脚本。 方法2:使用 CLI 加载 JS 脚本 在方法1的基础上,使用 -l 选项注入 JS 脚本。这种方法比较常用,原因有2个: 1. 每次修改脚本,无需重启 frida 就自动生效; 2. 调试完成后,JS 脚本也就写好了。 $ frida -U 浏览器 -l demo.js --no-pause ========== setImmediate(function() { Java.perform(function() { console.log(Script.runtime); //console.log(Java.androidVersion); }); }); ========== 接着,取消注释,脚本将自动重载 Attaching... QJS [Redmi 6::浏览器 ]-> QJS 8.1.0 缺点是每次修改脚本,都会完整的执行全部的 JS 代码,会带来一些额外的程序执行开销。 方法3:使用内置的调试模式 Frida 内置了调试模式,和 Chrome 的 Inspector 打通,直接在 Chrome 控制台上进行调试 使用上,CLI 和 RPC 都是支持的。 在 CLI 上,只需在命令行上追加 --runtime=v8 --debug 即可 $ frida -U 浏览器 --runtime=v8 --debug --no-pause Attaching... Chrome Inspector server listening on port 9229 然后,打开 Chrome 的开发者工具,点击左上角的 Node.js 绿色图标,切换到控制台 tab,就可以在上 面写脚本进行调试了。 > Script.runtime < 'V8' > Java.enumerateLoadedClassesSync() < (10919)['android.content.res.MiuiConfiguration', 'com.miui.internal.widget. ActionBarContextView', 'miui.R$raw', 'miui.R$anim', 'miui.R$string', 'miui. R$bool', 'com.miui.internal.R$color', 'miui.R$array', 'com.miui.internal. R$dimen', 'miui.R$layout', 'com.miui.internal.widget.a', 'com.miui.internal. widget.ActionBarContainer', 'miui.R$color', 'miui.R$styleable', 'com.miui. internal.R$raw', 'miui.R$style', 'miui.R$attr', 'miui.R$dimen', 'miui. R$integer', 'com.miui.internal.R$layout', 'com.miui.internal.R$integer', 'com. miui.internal.widget.ActionBarOverlayLayout', 'miui.R$plurals', 'com.miui. internal.R$plurals', 'miui.R$id', 'com.miui.internal.widget.ActionModeView', 'com.miui.internal.widget.ActionBarView', 'com.miui.internal.widget. ActionBarMovableLayout', 'com.miui.internal.R$anim', 'com.miui.internal. R$drawable', 'miui.app.ActionBar$FragmentViewPagerChangeListener', 'com.miui. internal.R$bool', 'miui.R$drawable', 'com.miui.internal.R$array', 'com.mediatek. dcfDecoder.MTKDcfDecoderFactoryImpl' 此方法相较于方法1和方法2的优势是,既方便编写复杂脚本,同时,每次只执行新增的脚本。和 REPL 一 样,非常的直观,而且结果展示可读性更高。 而在 RPC 上,使用同样方便。只需在创建脚本对象时传入 runtime="v8" 参数,并使用 session. enable_debugger() 开启调试器即可。 script = session.create_script(script_read, runtime="v8") session.enable_debugger() 接下来的操作和 CLI 一样,不再赘述。 另外提一句,Frida 默认使用 QuickJS 作为 JS 运行时,在支持 V8 的平台上想要切换到 V8,以上操 作也给出了答案。 至此,调试 Frida 脚本的方法就介绍完了。开始享受编程的乐趣吧 :)