https://www.52pojie.cn/thread-1823118-1-1.html

00x1 frida

Frida 是一款动态代码插桩工具,主要用于在运行时分析和修改应用程序的行为。它支持多种平台(如 Windows、macOS、Linux、iOS、Android 等)和编程语言(如 C、C++、Java、Objective-C 等),广泛应用于逆向工程、安全研究、漏洞挖掘和调试。

1.插桩技术

插桩技术是指将额外的代码注入程序中以收集运行时的信息,可分为两种:

(1)源代码插桩[Source Code Instrumentation(SCI)]:额外代码注入到程序源代码中。

(2)二进制插桩(Binary Instrumentation):额外代码注入到二进制可执行文件中。

●静态二进制插桩[Static Binary Instrumentation(SBI)]:在程序执行前插入额外的代码和数据,生成一个永久改变的可执行文件。

●动态二进制插桩[Dynamic Binary Instrumentation(DBI)]:在程序运行时实时地插入额外代码和数据,对可执行文件没有任何永久改变。

1. 静态二进制插桩
   · 就是你说的“直接改二进制文件”(如 .exe, .so, .dex)。
   · 本质:修改磁盘上的文件,添加新代码或修改控制流。修改是永久性的。

2. 动态二进制插桩
   · 不修改磁盘上的二进制文件。它是在程序运行时,在内存中实时修改即将执行的指令。
   · 本质:运行时拦截和控制执行流,不改文件,重启就恢复。

Frida 是典型的动态插桩(Dynamic Instrumentation)工具。

参考

详解Hook框架frida,让你在逆向工作中效率成倍提升 - _朝晖 - 博客园

00x2 Frida环境安装

参考

https://www.52pojie.cn/thread-1823118-1-1.html

pip install frida-tools
PS C:\Users\jc\Documents\leidian9> adb push C:\Users\jc\Downloads\frida-server-17.11.0-android-x86_64 /data/local/tmp/frida-server
C:\Users\jc\Downloads\frida-server-17.11.0-android-x86_64\...e pushed, 0 skipped. 28.8 MB/s (111340224 bytes in 3.686s)
PS C:\Users\jc\Documents\leidian9>

adb shell
su
chmod 755 /data/local/tmp/frida-server
/data/local/tmp/frida-server &

帮助文档

C:\Users\jc\Documents\leidian9>frida-ps --help
usage: python.exe C:\Users\jc\AppData\Local\Programs\Python\Python314\Scripts\frida-ps [options]

options:
  -h, --help            show this help message and exit
  -D, --device ID       connect to device with the given ID
  -U, --usb             connect to USB device
  -R, --remote          connect to remote frida-server
  -H, --host HOST       connect to remote frida-server on HOST
  --certificate CERTIFICATE
                        speak TLS with HOST, expecting CERTIFICATE
  --origin ORIGIN       connect to remote server with “Origin” header set to ORIGIN
  --token TOKEN         authenticate with HOST using TOKEN
  --keepalive-interval INTERVAL
                        set keepalive interval in seconds, or 0 to disable (defaults to -1 to auto-select based on
                        transport)
  --device-option option
                        override a backend-specific option, such as “control-endpoint=(string)localabstract:/my-frida-
                        server” (supported types are: string, bool, int)
  --p2p                 establish a peer-to-peer connection with target
  --stun-server ADDRESS
                        set STUN server ADDRESS to use with --p2p
  --relay address,username,password,turn-{udp,tcp,tls}
                        add relay to use with --p2p
  -O, --options-file FILE
                        text file containing additional command line options
  --version             show program's version number and exit
  -a, --applications    list only applications
  -i, --installed       include all installed applications
  -j, --json            output results as JSON
  -e, --exclude-icons   exclude icons in output

C:\Users\jc\Documents\leidian9>

操作模式

操作模式 描述 优点 主要用途
CLI(命令行)模式 通过命令行直接将JavaScript脚本注入进程中,对进程进行操作 便于直接注入和操作 在较小规模的操作或者需求比较简单的场景中使用
RPC模式 使用Python进行JavaScript脚本的注入工作,实际对进程进行操作的还是JavaScript脚本,可以通过RPC传输给Python脚本来进行复杂数据的处理 在对复杂数据的处理上可以通过RPC传输给Python脚本来进行,有利于减少被注入进程的性能损耗 在大规模调用中更加普遍,特别是对于复杂数据处理的需求

注入模式与启动命令

注入模式 描述 命令或参数 优点 主要用途
Spawn模式 将启动App的权利交由Frida来控制,即使目标App已经启动,在使用Frida注入程序时还是会重新启动App 在CLI模式中,Frida通过加上 -f 参数指定包名以spawn模式操作App 适合于需要在App启动时即进行注入的场景,可以在App启动时即捕获其行为 当需要监控App从启动开始的所有行为时使用
Attach模式 在目标App已经启动的情况下,Frida通过ptrace注入程序从而执行Hook的操作 在CLI模式中,如果不添加 -f 参数,则默认会通过attach模式注入App 适合于已经运行的App,不会重新启动App,对用户体验影响较小 在App已经启动,或者我们只关心特定时刻或特定功能的行为时使用

logcat |grep "D.zj2595"

、· logcat:Android 系统的日志输出命令,会实时打印所有应用的调试、信息、警告、错误等日志。
· |(管道符):将 logcat 的输出结果传递给后面的 grep 命令进行处理。
· grep "D.zj2595":在日志中只保留包含 D.zj2595 字符串的行,其余行会被过滤掉。

00x3 脚本

脚本基础语法

API名称 描述
Java.use(className) 获取指定的Java类并使其在JavaScript代码中可用。
Java.perform(callback) 确保回调函数在Java的主线程上执行。
Java.choose(className, callbacks) 枚举指定类的所有实例。
Java.cast(obj, cls) 将一个Java对象转换成另一个Java类的实例。
Java.enumerateLoadedClasses(callbacks) 枚举进程中已经加载的所有Java类。
Java.enumerateClassLoaders(callbacks) 枚举进程中存在的所有Java类加载器。
Java.enumerateMethods(targetClassMethod) 枚举指定类的所有方法。

5.日志输出语法区别

日志方法 描述 区别
console.log() 使用JavaScript直接进行日志打印 多用于在CLI模式中,console.log()直接输出到命令行界面,使用户可以实时查看。在RPC模式中,console.log()同样输出在命令行,但可能被Python脚本的输出内容掩盖。
send() Frida的专有方法,用于发送数据或日志到外部Python脚本 多用于RPC模式中,它允许JavaScript脚本发送数据到Python脚本,Python脚本可以进一步处理或记录这些数据。

模板框架

//定义一个名为hookTest1的函数
function hookTest1(){
//获取一个名为"类名"的Java类,并将其实例赋值给JavaScript变量utils
//Java.use 是 Frida 框架的 API 方法,用于在 Android 逆向工程中获取 Java 类的引用
    var utils = Java.use("类名");
    //修改"类名"的"method"方法的实现。这个新的实现会接收两个参数(a和b)
    utils.method.implementation = function(a, b){
//将参数a和b的值改为123和456。
//修改
        a = 123;
        b = 456;
        //调用修改过的"method"方法,并将返回值存储在`retval`变量中
        var retval = this.method(a, b);
        //在控制台上打印参数a,b的值以及"method"方法的返回值
        console.log(a, b, retval);
        //返回"method"方法的返回值
//修改了,修改值返回app
        return retval;
    }
}

function main(){
//Java.perform(fn) 确保当前线程已附加到虚拟机才会调用,并调用fn
//也就是外面的那一层是兼容校验
    Java.perform(function(){
//执行方法
        hookTest1();
    });
}
//立即执行脚本方法
//setImmediate(main); 的作用是:在 Frida 脚本被加载后,尽快(在下一个事件循环中)调用 main 函数,作为脚本的入口点。
// setImmediate 是 Frida 提供的 JavaScript 函数(类似于 Node.js 中的 setImmediate),它把回调函数(这里是 main)放到事件队列中,在当前执行栈清空后立即执行。这样可以避免阻塞脚本的加载过程。
//· 当当前调用栈中的所有同步任务(比如脚本加载、变量定义、其他函数调用)都执行完毕后,JavaScript 引擎会自动清空调用栈,然后从任务队列中取出 main 来执行。
//· 所以 “被清空的内容”是 main 执行之前的那一堆同步代码,而 main 会在清空之后立即执行。
//它主要的作用是执行脚本方法,次要的作用才是加载之后的清空
setImmediate(main);

· 主要作用:立即(但异步地)调度执行 main 函数,让脚本逻辑得以运行。
· 次要/附带现象:因为 JavaScript 事件循环的机制,setImmediate 会等待当前执行栈中的所有同步代码执行完毕(即“清空”当前栈)后才调用 main。但这只是实现“异步执行”的方式,不是它的目标。

Frida 脚本被注入到目标进程时,脚本的加载和执行是同步进行的。但有些初始化工作(比如等待 Java 虚拟机准备就绪、等待某些模块加载完成)并不是立即完成的。如果直接同步调用 main(),可能会因为所需环境尚未准备好而失败。

setImmediate 将 main 的调用推迟到当前执行栈清空后的下一个事件循环中,这样:

· 脚本的顶层同步代码(可能包括一些准备工作)可以先执行完毕。
· Frida 的运行时环境(比如与目标进程的通信、Java 桥接等)可以有时间完成内部初始化。
· 然后再执行 main 中的 Hook 逻辑,此时环境通常已经就绪。

也就是保证环境顺利加载

然后就是激活脚本(以后再说)

再说吧

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐