私はいくつかの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);
住所を移転するということではないですか?ポインタ値を移動するため