立即注册,突破游客限制,与技术大牛交流切磋,畅享海量资源,让你的技术之路不再孤单!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
下面是一个 C 语言函数的示例,它接受一个整型引用作为参数,在函数内部修改引用所指向的值,但函数本身并不返回任何值:
- #include <stdio.h>
-
- void modifyValue(int *num) {
- // 修改引用指向的值
- *num = *num * 2;
- printf("在函数内部修改后的值:%d\n", *num);
- }
-
- int main() {
- int x = 10;
- printf("初始值:%d\n", x);
-
- // 传递x的地址给函数
- modifyValue(&x);
-
- printf("修改后的值:%d\n", x);
-
- return 0;
- }
复制代码
- Java.perform(function() {
- // 在目标 Java 进程中执行一段 JavaScript 代码
-
- // 1. 找到 "libhello.so" 这个 SO 文件的基地址
- var soAddr = Module.findBaseAddress("libhello.so");
- send("soAddr: " + soAddr);
-
- // 2. 计算 MD5Final 函数的地址
- // 假设 MD5Final 函数相对于基地址的偏移是 0x1768
- // 32 位系统上,由于对齐方式的原因,需要加 1
- var MDSFinalAddr = soAddr.add(0x1768 + (Process.arch == 'arm' ? 1 : 0));
- send("MD5FinalAddr: " + MDSFinalAddr);
-
- // 3. 拦截 MD5Final 函数
- Interceptor.attach(MDSFinalAddr, {
- // 当函数被调用时
- onEnter: function(args) {
- // 打印函数的第一个参数
- send(args[0]);
- // 将第二个参数保存到 resultPtr,以便后续读取结果
- resultPtr = args[1];
- send(args[1]);
- },
- // 当函数返回时
- onLeave: function(retval) {
- // 从 resultPtr 指向的内存地址读取 16 个字节的数据
- var buffer = Memory.readByteArray(resultPtr, 16);
- // 打印读取到的数据,以十六进制格式显示
- console.log(hexdump(buffer, {
- offset: 0,
- length: 16,
- header: true,
- ansi: false
- }));
- // 打印函数的返回值
- send(retval);
- }
- });
- });
复制代码
|