修改编译后的可执行内存分配



我有一个编译好的可执行文件,但不能访问源代码。每次运行时,都会将一个变量分配给内存地址0x7B008C。我试着让它使用不同的地址,而不是每次使用一个。它不一定是动态的,因为我的目的只是破坏当前存在的修改源程序行为的应用程序。

所以我的问题是,在不破坏程序行为的情况下实现这一点的最简单方法是什么?

一般来说,你不能。

编译可执行文件时,对静态变量的引用由链接器在机器码中解析为变量的原始地址。没有任何迹象表明存在这样的引用,而且由于x86机器码的性质,以后很难找到这些引用(您不一定能明确地告诉指令从哪里开始)。

此外,您不知道它是否只是一个普通变量。它可能是静态类或结构的一部分。这些区别在编译后就消失了,但是当试图移动变量时,它会使它变得更加困难-可能是代码基于另一个变量的偏移量(即结构体的开始)引用它。

你到底想要完成什么?也许有比打乱虚拟内存布局更好的方法。

如果您只是试图破坏现有的训练器,一种方法(未经测试!)可能是更改进程ACL。在创建进程时,使用CreateProcess并为lpProcessAttributeslpThreadAttributes传入自定义安全描述符(对于已经运行的进程,可以使用SetSecurityInfo执行此操作)。在安全描述符中设置DACL,以便只授予SYNCHRONIZE | PROCESS_QUERY_INFORMATION | PROCESS_SUSPEND_RESUME | PROCESS_TERMINATE权限(即撤销所有DACL项上的所有其他权限)。这种技术并不是万无一失的——一个知道您正在这样做的培训师可以简单地将DACL设置回默认值;然而,它应该破坏现有的训练器,通过拒绝他们调试访问。

您可能可以通过使用BEAEngine检查整个可执行文件来完成(我说可能是因为我从未这样做过,以为我使用过BEAEngine并且它能够做到这一点),但这将非常复杂并且可能相当复杂。

我不会浪费时间去尝试这么做,因为和bdonlan一样,我并不在乎人们在单人游戏中使用训练器。还有其他比你描述的更简单的方法。

最新更新