【问题标题】:What is the proper way to replace very small portions of a binary file programmatically?以编程方式替换很小部分二进制文件的正确方法是什么?
【发布时间】:2011-01-24 14:28:21
【问题描述】:

我有一个游戏代码(来自 ioquake3 项目),它可以即时编译部分游戏二进制文件(qvm 系统)。现在,可以通过加载先前保存的此操作的二进制文件来潜在地加快它(使用任何文件更改预防措施)。

但是,指向保存在这些二进制文件中的函数的指针不会通过会话保持不变。

即时更改这些内容的正确方法是什么? (考虑到主应用程序中提供了它的汇编程序和汇编程序)

【问题讨论】:

  • 什么操作系统?答案可能是特定于操作系统的。
  • 我了解您想编辑二进制文件,但我不太确定您的其他问题。为什么指针首先会发生变化?你怎么知道在不重新编译的情况下要进行哪些更改?也许我错过了什么,但我只是不完全理解你的问题。

标签: assembly binary jit hex-editors


【解决方案1】:

这几乎就是可执行文件的普通加载器所做的。它们通常通过存储引用地址的位置表来工作,这些地址需要根据加载文件的位置进行更改。通常,它们在每个位置存储一个相对地址,因此要加载文件,您需要查看表并将基本加载地址添加到每个地址的内容中,然后在加载到内存时将结果放入图像中。

【讨论】:

    【解决方案2】:

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

    我记得当我搞砸这些东西时,我设置了一个读/写/执行内存页面,将前半部分用于生成的代码,将后半部分用于数据。代码一旦获得控制权,就会变成这样:

    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,并利用系统提供的重定位和地址修复服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-02
      • 2016-03-22
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 2023-03-23
      • 2011-11-25
      • 2013-01-04
      相关资源
      最近更新 更多