|
|
本帖最后由 正己 于 2024-5-11 16:33 编辑

一、课程目标
1.了解Frida-Native-Hook
2.借助ida脚本实现一键式hook
二、工具
1.教程Demo(更新)
2.jadx-gui
3.VS Code
三、课程内容
1.Process、Module、Memory基础

3.Memory
`Memory`是一个工具对象,提供直接读取和修改进程内存的功能,能够读取特定地址的值、写入数据、分配内存等

2.枚举导入导出表
1. **导出表(Export Table)**:列出了库中可以被其他程序或库访问的所有公开函数和符号的名称。
2. **导入表(Import Table)**:列出了库需要从其他库中调用的函数和符号的名称。
简而言之,导出表告诉其他程序:“这些是我提供的功能。”,而导入表则表示:“这些是我需要的功能。”。
- js
- function hookTest1(){
- Java.perform(function(){
- //打印导入表
- var imports = Module.enumerateImports("lib52pojie.so");
- for(var i =0; i < imports.length;i++){
- if(imports[i].name == "vip"){
- console.log(JSON.stringify(imports[i])); //通过JSON.stringify打印object数据
- console.log(imports[i].address);
- }
- }
- //打印导出表
- var exports = Module.enumerateExports("lib52pojie.so");
- for(var i =0; i < exports.length;i++){
- console.log(JSON.stringify(exports[i]));
- }
-
- })
- }
复制代码
3.Native函数的基础Hook打印
1. 整数型、布尔值类型、char类型
- JS
- function hookTest2(){
- Java.perform(function(){
- //根据导出函数名打印地址
- var helloAddr = Module.findExportByName("lib52pojie.so","Java_com_zj_wuaipojie_util_SecurityUtil_checkVip");
- console.log(helloAddr);
- if(helloAddr != null){
- //Interceptor.attach是Frida里的一个拦截器
- Interceptor.attach(helloAddr,{
- //onEnter里可以打印和修改参数
- onEnter: function(args){ //args传入参数
- console.log(args[0]); //打印第一个参数的值
- console.log(this.context.x1); // 打印寄存器内容
- console.log(args[1].toInt32()); //toInt32()转十进制
- console.log(args[2].readCString()); //读取字符串 char类型
- console.log(hexdump(args[2])); //内存dump
- },
- //onLeave里可以打印和修改返回值
- onLeave: function(retval){ //retval返回值
- console.log(retval);
- console.log("retval",retval.toInt32());
- }
- })
- }
- })
- }
复制代码
2. 字符串类型
- js
- function hookTest2(){
- Java.perform(function(){
- //根据导出函数名打印地址
- var helloAddr = Module.findExportByName("lib52pojie.so","Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel");
- if(helloAddr != null){
- Interceptor.attach(helloAddr,{
- //onEnter里可以打印和修改参数
- onEnter: function(args){ //args传入参数
- // 方法一
- var jString = Java.cast(args[2], Java.use('java.lang.String'));
- console.log("参数:", jString.toString());
- // 方法二
- var JNIEnv = Java.vm.getEnv();
- var originalStrPtr = JNIEnv.getStringUtfChars(args[2], null).readCString();
- console.log("参数:", originalStrPtr);
- },
- //onLeave里可以打印和修改返回值
- onLeave: function(retval){ //retval返回值
- var returnedJString = Java.cast(retval, Java.use('java.lang.String'));
- console.log("返回值:", returnedJString.toString());
- }
- })
- }
- })
- }
复制代码
4.Native函数的基础Hook修改
1. 整数型修改
- js
- function hookTest3(){
- Java.perform(function(){
- //根据导出函数名打印地址
- var helloAddr = Module.findExportByName("lib52pojie.so","Java_com_zj_wuaipojie_util_SecurityUtil_checkVip");
- console.log(helloAddr);
- if(helloAddr != null){
- Interceptor.attach(helloAddr,{
- onEnter: function(args){ //args参数
- args[0] = ptr(1000); //第一个参数修改为整数 1000,先转为指针再赋值
- console.log(args[0]);
-
- },
- onLeave: function(retval){ //retval返回值
- retval.replace(20000); //返回值修改
- console.log("retval",retval.toInt32());
- }
- })
- }
- })
- }
复制代码
2. 字符串类型修改
- js
- function hookTest2(){
- Java.perform(function(){
- //根据导出函数名打印地址
- var helloAddr = Module.findExportByName("lib52pojie.so","Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel");
- if(helloAddr != null){
- Interceptor.attach(helloAddr,{
- //onEnter里可以打印和修改参数
- onEnter: function(args){ //args传入参数
- var JNIEnv = Java.vm.getEnv();
- var originalStrPtr = JNIEnv.getStringUtfChars(args[2], null).readCString();
- console.log("参数:", originalStrPtr);
- var modifiedContent = "至尊";
- var newJString = JNIEnv.newStringUtf(modifiedContent);
- args[2] = newJString;
- },
- //onLeave里可以打印和修改返回值
- onLeave: function(retval){ //retval返回值
- var returnedJString = Java.cast(retval, Java.use('java.lang.String'));
- console.log("返回值:", returnedJString.toString());
- var JNIEnv = Java.vm.getEnv();
- var modifiedContent = "无敌";
- var newJString = JNIEnv.newStringUtf(modifiedContent);
- retval.replace(newJString);
- }
- })
- }
- })
- }
复制代码
5.SO基址的获取方式
- js
- var moduleAddr1 = Process.findModuleByName("lib52pojie.so").base;
- var moduleAddr2 = Process.getModuleByName("lib52pojie.so").base;
- var moduleAddr3 = Module.findBaseAddress("lib52pojie.so");
复制代码
6.Hook未导出函数与函数地址计算
- js
- function hookTest6(){
- Java.perform(function(){
- //根据导出函数名打印基址
- var soAddr = Module.findBaseAddress("lib52pojie.so");
- console.log(soAddr);
- var funcaddr = soAddr.add(0x1071C);
- console.log(funcaddr);
- if(funcaddr != null){
- Interceptor.attach(funcaddr,{
- onEnter: function(args){ //args参数
-
- },
- onLeave: function(retval){ //retval返回值
- console.log(retval.toInt32());
- }
- })
- }
- })
- }
复制代码
函数地址计算
1. 安卓里一般32 位的 so 中都是`thumb`指令,64 位的 so 中都是`arm`指令
2. 通过IDA里的opcode bytes来判断,arm 指令为 4 个字节(options -> general -> Number of opcode bytes (non-graph) 输入4)
3. thumb 指令,函数地址计算方式: so 基址 + 函数在 so 中的偏移 + 1
arm 指令,函数地址计算方式: so 基址 + 函数在 so 中的偏移
7.Hook_dlopen
dlopen源码
android_dlopen_ext源码
- js
- function hook_dlopen() {
- var dlopen = Module.findExportByName(null, "dlopen");
- Interceptor.attach(dlopen, {
- onEnter: function (args) {
- var so_name = args[0].readCString();
- if (so_name.indexOf("lib52pojie.so") >= 0) this.call_hook = true;
- }, onLeave: function (retval) {
- if (this.call_hook) hookTest2();
- }
- });
- // 高版本Android系统使用android_dlopen_ext
- var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext");
- Interceptor.attach(android_dlopen_ext, {
- onEnter: function (args) {
- var so_name = args[0].readCString();
- if (so_name.indexOf("lib52pojie.so") >= 0) this.call_hook = true;
- }, onLeave: function (retval) {
- if (this.call_hook) hookTest2();
- }
- });
- }
复制代码
8.借助IDA脚本实现一键式hook

IDA&Frida 学习
五、答疑
待更新
六、视频及课件地址
百度云
阿里云
哔哩哔哩
开源项目地址
PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压
七、其他章节
《安卓逆向这档事》一、模拟器环境搭建
《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改
《安卓逆向这档事》三、初识smail,vip终结者
《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡
《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩
《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向
《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api
《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook
《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗
《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?
《安卓逆向这档事》十二、大佬帮我分析一下
《安卓逆向这档事》番外实战篇1-某电全家桶
《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)
《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)
《安卓逆向这档事》十五、是时候学习一下Frida一把梭了(下)
《安卓逆向这档事》十六、是时候学习一下Frida一把梭了(终)
《安卓逆向这档事》十七、你的RPCvs佬的RPC
《安卓逆向这档事》番外实战篇2-【2024春节】解题领红包活动,启动!
八、参考文档
FRIDA-API使用篇:rpc、Process、Module、Memory使用方法及示例
IDA&Frida 学习
Frida Hook 常用函数、java 层 hook、so 层 hook、RPC、群控
|
-
查看全部评分
总评分:好评 +4
金币 +4
|