macOS 代码运行错误:vm_read() 函数使用说明
macOS 代码运行错误:vm_read() 函数使用说明
问题描述:
在 macOS 环境下,使用 vm_read() 函数读取内存数据时,代码运行不符合预期。具体问题如下:
- printf("%d\n", (char)ptr); 语句输出结果不正确
- vm_map_t 类型被弃用,编译报错
- vm_read() 函数调用时,buffer 参数类型错误
- 使用 ntohl() 函数进行网络字节序转换,导致输出错误
解决方法:
以下是修正后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <mach/mach.h>
#include <arpa/inet.h>
int main() {
int x = 42;
int* ptr = &x;
printf("%p\n", (void*)ptr);
printf("%d\n", *ptr);
fflush(stdout);
// 获取需要读取的地址
uint64_t address = (uint64_t)ptr;
// 定义一个缓冲区来存储读取的数据
char buffer[sizeof(int)];
// 调用 vm_read() 函数读取数据
vm_size_t size;
kern_return_t result;
mach_port_t task;
task = mach_task_self();
result = vm_read(task, (vm_address_t)address, sizeof(int), (vm_offset_t*)buffer, &size);
if (result == KERN_SUCCESS) {
// 数据读取成功
printf("Read %zu bytes at address %llu: ", size, address);
for (int i = 0; i < sizeof(buffer); i++) {
printf("%02x ", (unsigned char)buffer[i]);
}
printf("\n");
int value = *((int*)buffer);
printf("Decoded value: %d\n", value);
if (value == 42) {
printf("Value matches\n");
} else {
printf("Value does not match\n");
}
} else {
// 数据读取失败
printf("Error: unable to read data at address %llu\n", address);
}
sleep(1);
return 0;
}
修改说明:
- 将
printf("%d\n", *(char*)ptr);修改为printf("%d\n", *ptr);,原代码中使用了错误的类型指针,导致输出不正确。 - 将
vm_map_t修改为mach_port_t,因为在 macOS 10.14 及以上版本中,vm_map_t已经被弃用。 - 将
vm_read()函数调用中的 buffer 参数的类型从char*修改为vm_offset_t*,因为vm_read()函数的第四个参数应该是vm_offset_t*类型。 - 将
uint32_t修改为int,因为int类型可以存储四个字节的数据,与uint32_t类型相同。 - 将
ntohl()函数去掉,因为在本地环境中不需要进行网络字节序转换。 - 修改了部分变量名和注释,使代码更加清晰易懂。
总结:
本文分析了 macOS 下使用 vm_read() 函数读取内存数据时遇到的问题,并提供了修正后的代码示例。开发者可以参考本文内容,避免类似错误的发生。
原文地址: https://www.cveoy.top/t/topic/nVYt 著作权归作者所有。请勿转载和采集!