我有一个游戏代码(来自ioquake3项目),该代码即时编译了一部分游戏玩法二进制文件(QVM系统)。现在,人们可以通过加载此操作的先前保存的二进制文件(带有任何文件更改预防措施)来加速它。

但是,在这些二进制文件中保存的功能的指针并不是通过会议持续存在的。

可以随时改变这些方法的正确方法是什么? (考虑到一个在主申请中可以使用的汇编程序和组件)

有帮助吗?

解决方案

这几乎是可执行组件的普通加载程序。它们通常是通过存储一个在其中的地址的表格来工作的工作,这些地址需要根据文件的加载位置进行更改。通常,它们在每个位置中存储一个相对地址,因此要加载文件,您可以查看表格并将基本加载地址添加到每个地址的基本地址,然后将其放入将其加载到内存中的图像中。

其他提示

将相关函数指针的表格作为参数。另外,您可以生成的代码依赖于相对于代码,位置放置在固定位置的数据区域。

我记得当我弄乱这些东西时,我会设置一个读/写入/执行内存页面,将上半部分用于生成的代码,然后将下半部分制成数据。该代码一旦得到控制,就会像这样进行:

call l
l:
pop eax ; eax has the current eip
and eax, 0fffff000h ;round down to the page size, 4K AKA 0x1000
add eax, 800h ;now eax points at the data area

...等等。

对于大规模生成的代码,您可能需要将其存储为完全爆炸的DLL,并利用系统提供的重定位和地址修复服务。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top