声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我会立即删除并致歉。谢谢!
文章有疑问的,可以公众号发消息问我,或者留言。我每天都会看的。
字数 849,阅读大约需 5 分钟
前言
到了Frida-Labs 0xB,也就是最后一个APK了。Frida-Labs本身并不难,但也基本演示了如何使用Frida去hook一个APK,进行常见的操作。后续的文章将会是在这些的基础上进行补充。不管Frida多么好用,它始终是一个工具,用起来效果有多好取决于使用者的对Android知识的掌握。他可以帮助你实现你想法,但并不能代替你给出解决办法。
如何提出解决办法呢?一个是多看文章积累经验,举一反三,一个是借助AI大模型,掌握提示词,多向他们提问,询问如何解决。也许在细节上大模型有问题,但大方向上多数场合给出的答案都是合理的。
Java层hook与Native层hook
之前的案例中,Frida对Java层和Native的hook上基本一致,都是hook一个方法,控制传入参数和返回值。
对于Java层来说,因为Java层运行在art虚拟机中,Frida很难修改方法中的具体执行代码。如果要修改,多数是将APK反编译,修改smali代码,然后对APK重打包。
但对于Native层的方法来说,Frida可以实现汇编指令级的修改,比如修改跳转指令为nop,使得代码继续向下执行而不是跳转到别处。
Frida-Labs 0xB的案例将演示这一点。
Challenge 0xB
APK反编译
反编译so
tab
,切换成汇编代码查看在跳转指令B.NE loc_1532C
的下方,有一串很像解密操作的代码。
触发条件:当 Z 标志为 0 时(即上一条指令的结果不为零),B.NE 指令会跳转到指定的目标地址;如果 Z 标志为 1(结果为零),则继续执行下一条指令。
因为运行APK,点击界面的按钮没有触发log打印flag,以及IDA查看函数是空的,可以得知这条指令是恒成立的。
为了让代码继续向下执行,我们就需要修改这条指令,比如将其修改为NOP,或者把下面的跳转指令覆盖上去。
空格
,切换成下面的格式,可知该指令的具体地址为0x15248
FLAG
进一步证明flag在其中Frida脚本
提示词
你是一个安卓逆向工程师,请写一个Frida函数,nop native中的指令。条件:so名为libfrida0xb.sofrida版本:16.7Android版本:13CPU架构:arm64要求:采用frida的Arm64Writer指令如下:015248 B.NE loc_1532C
Frida修改汇编指令可以使用xxWriter,xx是CPU的具体架构,具体参考Frida文档。我这里是arm64,所以用的是Arm64Writer。
代码如下:
function nopConditionalBranch() { var adr = Module.findBaseAddress("libfrida0xb.so").add(0x15248); // b.ne指令的地址 Memory.protect(adr, 0x1000, "rwx"); // 因为要修改指令,需要设置这块内存地址的权限为可写 var writer = new Arm64Writer(adr); // ARM64 writer object console.log(Instruction.parse(adr)) try { writer.putNop(); // 写入nop // Inserts the <b target> instruction in the place of b.ne instruction writer.flush(); // 刷入内存 } finally { writer.dispose(); }}// frida -U -f com.ad2001.frida0xb -l main.js// nopConditionalBranch()
欢迎关注公众号~~~
原文始发于微信公众号(进击的HACK):Frida native层修改汇编指令 0x08
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论