関数ポインタアセンブリの計算


3

私は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 

しかし、私はこれらすべてのdb sの値を読み取る方法がわかりません。 offset unk_804C0B8のサイズとその価値は何ですか?私は正しく進んでいますか?

  0

にいくつかのデータを移動するあなたは、コーディングする '804C0B8'を変更してみたのですか? 06 11月. 172017-11-06 08:11:00

3
mov  ds:dword_804C0D4, offset unk_804C0B8 

ので、サブがと呼ばれていた前に、この命令が最初に実行されたならば、

0x804c0d4 0x804c0b8

V2 = *(_ DWORD *)dword_804C0D4を含むであろう。

ので、V2 = 0

v3 = *(_DWORD *)(8 * a1 + 4 + *(_DWORD *)dword_804C0D4); 

V3は((8×0)+ 4 + 0x804c0b8)==(0 + 4 + 0x804c0b8)あろうINT A1 ==を想定0x804c0b8

あろう= *(0x804c0bc)== 0xfbbf6885

       db 85h 
LOAD:0804C0BD     db 68h ; h 
LOAD:0804C0BE     db 0BFh 
LOAD:0804C0BF     db 0FBh 

あなたがいるので0x804c0bc

でDを2回押すことができますDWORDを定義します句が 満たさないとIF 1は0ザであると仮定したelse節に実行移動

result = *(_DWORD *)(*(_DWORD *)(8 * a1 + v2) - v3); 

**(8 * 0 + 0x804c0b8)== **(0x804c0b8)== * 0x8bffffe8

あなたは何であるかである必要があり8bffffe8

結果であるか表示されません

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で - 0xfbbf6885

編集

包みA1 == 1、それはあなたがNULLポインタ を持って表示されますので、あなたが他のいくつかのことは、最初に逆転すべき 0x804c0c4

  0

明確な応答@blabbをありがとう。私たちが気付かなかったことは、コードセグメントがすべてLOADであることでした。バイナリが何とか壊れているようです。私はそれを修正しようとしています。readelfで遊んでいますが、その使い方は分かりません... 10 11月. 172017-11-10 02:25:26