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
的大小是多少?我可以正确进行吗?#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
评论
您是否尝试将804C0B8更改为代码?