函数指针汇编计算

逆向工程 艾达 指针
2021-06-10 10:45:46

我在 IDA Pro 中对二进制文件进行逆向工程,我遇到了sub_8048FB6我认为提供函数指针地址的函数。子程序的反编译如下,我试图找到result.

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;
}

dword_804C0D4我猜测变量指向一个内存位置,并且在二进制文件中只被引用了 2 次,如下所示:

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

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

LOAD:0804C0B8 unk_804C0B8     db 0E8h   ; DATA XREF: sub_804A24E+3↑o
LOAD:0804C0B9                 db 0FFh
LOAD:0804C0BA                 db 0FFh
LOAD:0804C0BB                 db  8Bh
LOAD:0804C0BC                 db  85h
LOAD:0804C0BD                 db  68h ; h
LOAD:0804C0BE                 db 0BFh
LOAD:0804C0BF                 db 0FBh
LOAD:0804C0C0                 db 0FFh
LOAD:0804C0C1                 db  89h
LOAD:0804C0C2                 db 0C2h
LOAD:0804C0C3                 db 0B8h
LOAD:0804C0C4                 db    0
LOAD:0804C0C5                 db    0
LOAD:0804C0C6                 db    0
LOAD:0804C0C7                 db    0
LOAD:0804C0C8 dword_804C0C8   dd 0FFEB0EE8h   ; DATA XREF: sub_8049D1E+2B1↑r

但我不知道如何用所有这些dbs读取值它的大小offset unk_804C0B8和价值是多少?我是否正确进行?

1个回答
mov     ds:dword_804C0D4, offset unk_804C0B8

所以如果在调用 sub 之前先执行了条指令,那么

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

编辑

incase a1 == 1 那么看起来你有一个 NULL 指针,所以你应该先反转一些其他的东西,将一些数据移动到 0x804c0c4