我在IDA Pro中对二进制文件进行了反向工程,遇到了函数sub_8048FB6,我认为它提供了指向函数指针的地址。子程序的反编译如下,我正在尝试查找result。我猜dword_804C0D4变量指向内存位置,仅被引用。二进制中的2次如下:

int __cdecl sub_8048FB6(int a1)
{
  int result; // eax
  int v2; // [esp+0h] [ebp-10h]
  int v3; // [esp+4h] [ebp-Ch]

  v2 = *(_DWORD *)dword_804C0D4;
  v3 = *(_DWORD *)(8 * a1 + 4 + *(_DWORD *)dword_804C0D4);
  if ( a1 & 1 )
    result = *(_DWORD *)(8 * a1 + v2) - v3;
  else
    result = *(_DWORD *)(*(_DWORD *)(8 * a1 + v2) - v3);
  return result;
}


所以,我的猜测是变量unk_804C0B8的偏移量是ds:dword_804C0D4指向的地址中的值。如果是这样,关于偏移量在哪里计算?双击unk_804C0B8后,我得到:

Up  r   sub_8048FB6+6   mov     eax, ds:dword_804C0D4
Up  w   sub_804A24E+3   mov     ds:dword_804C0D4, offset unk_804C0B8


但是我不知道如何用所有db读取值。 offset unk_804C0B8的大小是多少?我可以正确进行吗?

评论

您是否尝试将804C0B8更改为代码?

#1 楼

mov     ds:dword_804C0D4, offset unk_804C0B8

,如果此指令在调用子程序之前先执行,则
0x804c0d4将包含0x804c0b8
v2 = *(_ DWORD *)dword_804C0D4;
因此v2将为0x804c0b8
假设int a1 == 0
v3 = *(_DWORD *)(8 * a1 + 4 + *(_DWORD *)dword_804C0D4);

v3将是((8 * 0)+ 4 + 0x804c0b8)==(0 + 4 + 0x804c0b8)== *(0x804c0bc)== 0xfbbf6885
                              db  85h
LOAD:0804C0BD                 db  68h ; h
LOAD:0804C0BE                 db 0BFh
LOAD:0804C0BF                 db 0FBh

要定义一个双字,您可以在0x804c0bc处按两次d
,因为假设a1为0,则if子句不满足,并且执行移到else子句
result = *(_DWORD *)(*(_DWORD *)(8 * a1 + v2) - v3);

**(8 * 0 + 0x804c0b8)== **(0x804c0b8)== * 0x8bffffe8
LOAD:0804C0B8 unk_804C0B8     db 0E8h   ; DATA XREF: sub_804A24E+3↑o
LOAD:0804C0B9                 db 0FFh
LOAD:0804C0BA                 db 0FFh
LOAD:0804C0BB                 db  8Bh

您不会显示8bffffe8
的结果应该是8bffffe8的值-0xfbbf6885
edit
如果a1 == 1,那么看来您有一个NULL指针
,因此您应该先反转一些东西,然后再将其他数据移动到
0x804c0c4

评论


感谢@blabb的明确答复。我们没有注意到的是代码段都是LOAD。似乎二进制文件某种程度上已损坏。我正在尝试修复它。玩readelf,但不知道如何使用...

–新手
17年10月10日在2:25