1

我有一个编译后的可执行文件,无法访问源代码。每次运行时,都会将一个变量分配给内存地址 0x7B008C。我试图让它使用不同的地址,而不是每次都使用那个地址。它不必是动态的,因为我的目的只是破坏现有的修改源程序行为的应用程序。

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

4

2 回答 2

4

一般来说,你不能。

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

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

你真的想在这里完成什么?可能有比仅仅搞乱虚拟内存布局更好的方法。

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

于 2011-07-31T18:31:30.900 回答
0

您可能可以通过使用BEAEngine浏览整个可执行文件来做到这一点(我说可能是因为我从未做过,我认为我已经使用过 BEAEngine 并且它能够做到),但它会非常复杂并且可能非常复杂。

不过,我不会浪费时间尝试这样做,因为就像 bdonlan 一样,我不会关心人们在单人游戏中使用训练器。还有其他比你描述的更简单的破坏教练的方法。

于 2011-07-31T19:07:27.153 回答