1

私はいくつかのexeアプリケーションを持っています。このアプリにはエクスポート テーブルがあり、多数の関数をエクスポートします。いくつか使ってみたいと思います。たとえば、ABS 機能を使用する必要があります。Ida Pro を開き、疑似コードを調べたところ、次のものがあります。

double __cdecl ABS(double *a1, double *a2)
{
 if ( *a2 < 0.0 )
 {
   *a1 = -1.0 * *a2;
 }
 else
 {
   *a1 = *a2;
   *(a1 + 4) = *(a2 + 4);
 }
 return *a1;
}

それから私はプロトタイプを書きました:

typedef double (*ABS)(double *,double *);

int _tmain(int argc,_TCHAR* argv[])
{
    HINSTANCE hMod = LoadLibrary(L"exe.exe");
    if (hMod!=NULL)
    {
        ABS func = (ABS)GetProcAddress(HMod,"ABS");
        if (func!=NULL)
        {
            double x=0;
            double y =-2;
            double z = func(&x,&y);
        }
    }

    return 0;
}

私のプロジェクトのプロトタイプ:

typedef double (*ABS)(double *, double *);

わかりました、hMod と func は NULL ではありませんが、その結果、(メモリの読み取り中に) エラーが発生するか、正しくない値がいくつかあります。(例: 483435, -343524) この状況を正すために、私を助けてください

ここでオリジン Ida pro シュードソード:

double __cdecl ABS(int a1, int a2)
{
  if ( *(double *)a2 < 0.0 )
  {
    *(double *)a1 = -1.0 * *(double *)a2;
  }
  else
  {
    *(_DWORD *)a1 = *(_DWORD *)a2;
    *(_DWORD *)(a1 + 4) = *(_DWORD *)(a2 + 4);
  }
  return *(double *)a1;
}

私はそれが私の最適化に等しいと思った

PS:*(a1 + 4) = *(a2 + 4);住所を移転するということではないですか?ポインタ値を移動するため

4

0 に答える 0