通过偏移访问结构体成员时获取错误指针地址的问题
固件逆向中的结构体指针访问问题与修复
我正在对某固件进行逆向分析,需要编写C语言补丁,遇到了结构体指针访问的问题,以下是复现问题的示例代码:
#include <iostream> struct inner { int32_t a; int16_t b; }; struct test { int32_t one; int32_t two; char* data; }; int main() { struct inner inner; inner.a = 4; inner.b = 5; struct test test; test.data = (char*)(&inner); char *ptr = (char*)(&test); int off = offsetof(struct test,data); std::cout << "Data offset: " << off; std::cout << "\n" << (&inner); char* in = (char*)(ptr+off); std::cout << "\n" << (void*)in; return 0; }
这段代码运行后输出两个指针地址,第二个地址比第一个高0x10,导致无法通过该方式访问inner结构体的a、b成员。我尝试修改指针类型,但始终无法解决问题,原本以为转换为char*应该允许按字节偏移访问成员。
修复后的代码
#include <iostream> struct inner { int32_t a; int16_t b; }; struct test { int32_t one; int32_t two; char* data; }; int main() { struct inner inner; inner.a = 4; inner.b = 5; struct test test; test.data = (char*)(&inner); char *ptr = (char*)(&test); int off = offsetof(struct test,data); std::cout << "Data offset: " << off; std::cout << "\n" << (void*)test.data; char* in = *((char**)(ptr+off)); std::cout << "\n" << (void*)in; int32_t a = (int32_t)(*in); int16_t b = (int16_t)(*(in+0x4)); std::cout << "\nA: " << a << " B: " << b; return 0; }
问题根源与修复逻辑
原代码错误在于直接将ptr+off转为char*:ptr是指向test结构体的字节指针,ptr+off指向的是test.data这个指针变量在内存中的存储地址,而非test.data指向的inner结构体地址。正确的操作是先将该地址转为char**(指针的指针),再通过解引用获取test.data实际指向的目标地址,这样才能正确访问inner的成员变量。
内容的提问来源于stack exchange,提问作者bemerged
相关产品推荐
相关产品推荐

