我有一些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 pseudosode:
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);
并不代表我们移动地址?我们移动指针值