我已经将DLL注入到现有游戏中。

我可以这样导入函数和变量:
是否可以从可执行文件中导入原始函数,以便链接器可以找到它们,并且可以使用常规的(外部)声明?

#1 楼

是的,您可以将导出表添加到原始可执行文件中,并使用命名符号(由您定义)指向这些函数/ globals / etc的地址。

您的DLL然后可以通过在运行时导出表符号名称。请确保您了解函数的副作用,使用全局变量等,因为从DLL调用它可能不是线程安全的。

评论


请注意,即使采用这种方法,您仍然需要使用typedef等。

–詹森·格夫纳(Jason Geffner)
2014年9月12日19:15在

为什么需要typedef?一个普通的声明就足够了。以及如何导入数据(变量)?我希望在链接时解决此问题,这也避免了必须更新exe。

– XTF
2014年9月13日15:15

#2 楼

您的意思是从已注入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;


如果编译器支持C ++ 11或更高版本,因为使用了'decltype'关键字。