我向Grok3与DeepSeek提出了以下问题:
IDA反编译生成的伪代码中的变量名称通常以v开头,然后是数字。但是,有时会出现一个名为”savedregs“的变量。请问这个变量有何特殊意义和作用?
得到的回答让我有了一些模糊的认识,但不足以解决实际问题。
以下是IDA9.0生成的一段伪代码:
_DWORD Src[2035]; // [esp+20h] [ebp-21E8h] BYREF
_BYTE v10[536]; // [esp+1FF0h] [ebp-218h] BYREF
int savedregs; // [esp+2208h] [ebp+0h] BYREF
for ( j = 1; j <= 127; ++j )
{
*((_BYTE *)&savedregs + 64 * j - 8732) = 1;
当j是1时:
0 + 64 * j – 8732 = -8668 = -0x21DC
变量Src是[ebp-21E8h],即它的地址偏移是0x21E8。
0x21E8-0x21DC=12,即这两者之间的相对偏移是12个字节。
变量Src实际是一个具有以下类型的结构体:
typedef struct
{
integer32 _0;
integer32 _4;
integer32 _8;
map_data__map_record_union_t _12[127];
} map_data__map_record_union_set_8140_t;//size=8140
偏移为12字节的分量是一个联合体数组。
最终,把原来的语句修改为:
Src._12[j – 1].u32._0 = 1;
上例表明,通过计算偏移可找出savedregs对应的真实变量。
我用以上方法解决了迄今为止遇到的所有avedregs相关的问题。
1001

被折叠的 条评论
为什么被折叠?



