-2
typedef int(__stdcall *__MessageBoxA)(HWND, LPCSTR, LPCSTR, UINT); 

正如我所说,我正在尝试学习如何使用 C++/Assembly 对程序进行逆向工程,所以我正在浏览我在互联网上找到的一些开源项目。但是谁能解释这条线的作用?我在 C++ 方面并不先进,这就是为什么我要通过资源。

4

1 回答 1

2

你的代码是C语言。所以它在 C++ 中也可以很好地编译。

让我们一步一步来。

  1. 这是一个函数声明或原型或签名
    它返回一个 int,接受 4 个参数:
int __stdcall MessageBoxA(HWND, LPCSTR, LPCSTR, UINT); 
  1. 这里 ptr 是一个指向函数的指针变量
int(__stdcall *ptr)(HWND, LPCSTR, LPCSTR, UINT); 
ptr = NULL;
/ assign a correct adress
ptr = MessageBoxA;
// call the function with parameters using the pointer
(*ptr)(hWnd, NULL, NULL, 0); 
  1. 这里__MessageBoxA 是一种有助于定义作为函数指针的变量的类型:
typedef int(__stdcall *__MessageBoxA)(HWND, LPCSTR, LPCSTR, UINT); 

因此可以声明指向函数变量的指针。

__MessageBoxA ptr1 = NULL;

__stdcall 是编译器调用函数的方式(参数是从左到右传递还是反向传递?返回值是通过堆栈内存还是CPU寄存器传递?) - 细节大多数人并不关心只要调用者和被调用者同意

问候

于 2015-10-27T21:15:23.300 回答