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