吾爱破解安卓逆向入门教程学习
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 逻辑,此时环境通常已经就绪。
也就是保证环境顺利加载
然后就是激活脚本(以后再说)
再说吧
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)