从可执行文件导入函数

逆向工程 C++ 聚乙烯
2021-07-10 04:39:27

我已将 DLL 注入现有游戏。

我可以像这样导入函数和变量:

typedef const wchar_t* (__fastcall *get_string_t)(const char*, int, const char*, int);
get_string_t real_get_string = reinterpret_cast<get_string_t>(0x6f9ec0);
int& g_cx = *reinterpret_cast<int*>(0x8523e0);

但是这些函数指针和变量增加了间接性,并且语法繁琐。有没有办法从可执行文件中导入原始函数,以便链接器可以找到它们并且我可以使用普通(外部)声明?

2个回答

是的,您可以将导出表添加到原始可执行文件中,命名符号(您定义的)指向这些函数/全局变量/等的地址。

然后,您的 DLL 可以在运行时通过导出表符号名称导入这些函数地址。

但是,无论您是采用这个计划还是上面的当前计划,都要小心从 DLL 中调用 EXE 的函数。请确保您了解该函数的副作用、全局变量的使用等,因为从您的 DLL 中调用它可能不是线程安全的。

你的意思是从主机可执行文件中调用函数,你已经在其中注入了你的 DLL?

如果是这种情况,我不建议您使用直接地址,因为图像加载的地址可能与预期不同(特别是如果设置了“IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE”标志)。更好地使用“GetModuleHandle”来获取进程映像库并使用 RVA 加上返回的值调用您的函数。

如果目标函数不在宿主映像的 EAT 中,则上述情况为真。如果是这种情况,如果您有适当的主机图像库,您可以只声明它们的名称并在源中使用这些函数。

这是我能说的最好的,因为你的问题有点不清楚。

编辑:您在 OP 中编写的代码可以重写如下:

const wchar_t* (__fastcall *get_string)(const char*, int, const char*, int) = (decltype(get_string))0x6f9ec0;

int& g_cx = *(int*)0x8523e0;

如果您的编译器由于 'decltype' 关键字而支持 C++11 或更高版本。