我有一些 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);
是不是意味着我们搬地址?因为我们移动指针值