Frida native层修改汇编指令 0x08

admin 2025年6月12日11:21:31评论11 views字数 2007阅读6分41秒阅读模式
Frida native层修改汇编指令 0x08

声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我会立即删除并致歉。谢谢

文章有疑问的,可以公众号发消息问我,或者留言。我每天都会看的。

Frida native层修改汇编指令 0x08

字数 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反编译

getFlag方法是在native中实现。
Frida native层修改汇编指令 0x08
e4383216513105332aad80b6dd21077e.png

反编译so

用IDA打开so,查看伪代码会发现这个函数里面是空的。
Frida native层修改汇编指令 0x08
1182e58b29da5e6bfc1d776c6804ff5d.png
使用快捷键tab,切换成汇编代码查看
Frida native层修改汇编指令 0x08
166559095d39460e354986ff8d7f0dd3.png

在跳转指令B.NE loc_1532C的下方,有一串很像解密操作的代码。

触发条件:当 Z 标志为 0 时(即上一条指令的结果不为零),B.NE 指令会跳转到指定的目标地址;如果 Z 标志为 1(结果为零),则继续执行下一条指令。

因为运行APK,点击界面的按钮没有触发log打印flag,以及IDA查看函数是空的,可以得知这条指令是恒成立的。

为了让代码继续向下执行,我们就需要修改这条指令,比如将其修改为NOP,或者把下面的跳转指令覆盖上去。

按快捷键空格,切换成下面的格式,可知该指令的具体地址为0x15248
Frida native层修改汇编指令 0x08
dc4b667d3854f33ef4958b2e85a5396a.png
跳转到的具体汇编指令中,存在字符串FLAG进一步证明flag在其中
Frida native层修改汇编指令 0x08
0a1de5cbad9229a06357eee262ef3b43.png

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()
Frida native层修改汇编指令 0x08
c77d0f1b97ac611a844c63b94e0ad47d.png

欢迎关注公众号~~~

原文始发于微信公众号(进击的HACK):Frida native层修改汇编指令 0x08

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月12日11:21:31
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Frida native层修改汇编指令 0x08https://cn-sec.com/archives/4156932.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息