You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过偏移访问结构体成员时获取错误指针地址的问题

固件逆向中的结构体指针访问问题与修复

我正在对某固件进行逆向分析,需要编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:20:08