Frida系统培训第十二课 SO层引用传递函数返回值hook

[复制链接]
查看1804 | 回复0 | 2024-10-10 18:44:11 | 显示全部楼层 |阅读模式

立即注册,突破游客限制,与技术大牛交流切磋,畅享海量资源,让你的技术之路不再孤单!

您需要 登录 才可以下载或查看,没有账号?立即注册

×
下面是一个 C 语言函数的示例,它接受一个整型引用作为参数,在函数内部修改引用所指向的值,但函数本身并不返回任何值:

  1. #include <stdio.h>
  2. void modifyValue(int *num) {
  3.     // 修改引用指向的值
  4.     *num = *num * 2;
  5.     printf("在函数内部修改后的值:%d\n", *num);
  6. }
  7. int main() {
  8.     int x = 10;
  9.     printf("初始值:%d\n", x);
  10.     // 传递x的地址给函数
  11.     modifyValue(&x);
  12.     printf("修改后的值:%d\n", x);
  13.     return 0;
  14. }
复制代码
  1. Java.perform(function() {
  2.   // 在目标 Java 进程中执行一段 JavaScript 代码
  3.   // 1. 找到 "libhello.so" 这个 SO 文件的基地址
  4.   var soAddr = Module.findBaseAddress("libhello.so");
  5.   send("soAddr: " + soAddr);
  6.   // 2. 计算 MD5Final 函数的地址
  7.   // 假设 MD5Final 函数相对于基地址的偏移是 0x1768
  8.   // 32 位系统上,由于对齐方式的原因,需要加 1
  9.   var MDSFinalAddr = soAddr.add(0x1768 + (Process.arch == 'arm' ? 1 : 0));
  10.   send("MD5FinalAddr: " + MDSFinalAddr);
  11.   // 3. 拦截 MD5Final 函数
  12.   Interceptor.attach(MDSFinalAddr, {
  13.     // 当函数被调用时
  14.     onEnter: function(args) {
  15.       // 打印函数的第一个参数
  16.       send(args[0]);
  17.       // 将第二个参数保存到 resultPtr,以便后续读取结果
  18.       resultPtr = args[1];
  19.       send(args[1]);
  20.     },
  21.     // 当函数返回时
  22.     onLeave: function(retval) {
  23.       // 从 resultPtr 指向的内存地址读取 16 个字节的数据
  24.       var buffer = Memory.readByteArray(resultPtr, 16);
  25.       // 打印读取到的数据,以十六进制格式显示
  26.       console.log(hexdump(buffer, {
  27.         offset: 0,
  28.         length: 16,
  29.         header: true,
  30.         ansi: false
  31.       }));
  32.       // 打印函数的返回值
  33.       send(retval);
  34.     }
  35.   });
  36. });
复制代码






本帖被以下淘专辑推荐:

这个人还没有签名
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

图文推荐
大神求
大神求
6 天前
热门排行