我正在修改一个旧的废弃软件游戏以拥有无限的生命。
有指令的地址dec ecx
和它在被调试的.exe中的位置不一样。
我记得我的一位老朋友曾经告诉我,有一个公式可以通过 .exe 中的指令获取“真实”地址。作弊引擎给了我内存地址。我记得在数学公式中,我需要得到模块,在 OllyDbg 中我得到了它。但我不记得公式。有人知道这个数学公式是怎么回事吗?公式很简单!还有另一种方法可以让文件位置永久修改.exe?
我正在修改一个旧的废弃软件游戏以拥有无限的生命。
有指令的地址dec ecx
和它在被调试的.exe中的位置不一样。
我记得我的一位老朋友曾经告诉我,有一个公式可以通过 .exe 中的指令获取“真实”地址。作弊引擎给了我内存地址。我记得在数学公式中,我需要得到模块,在 OllyDbg 中我得到了它。但我不记得公式。有人知道这个数学公式是怎么回事吗?公式很简单!还有另一种方法可以让文件位置永久修改.exe?
有一个“公式”,但您实际上需要查看可执行文件的内部(尽管可以根据一些假设简化此公式)。
假设
通常(我坚持通常,有时情况并非如此),第一部分的 [SECRVA] 将是 0x1000 - 这恰好是代码部分 - 而它的 [SECRAWADDR] 将是 0x400。
因此,如果您正在根据内存中的地址搜索指令的偏移量,您通常可以假设:
SECRVA = 0x1000
SECRAWADDR = 0x400
例子
基于 cmd.exe 的示例。
假设我正在0x1C34B0
将程序加载到内存中时搜索此代码:
CPU Disasm
Address Hex dump Command Comments
001C34B0 /$ E8 B3040000 CALL 001C3968
001C34B5 \.^ E9 2EFEFFFF JMP 001C32E8
注意指令操作码(字节)是:0xE8B3040000
VA = 0x1C34B0
MODBASE = 0x1B0000
VA - MODBASE = RVA;0x1C34B0 - 0x1B0000 = 0x134B0
;RVA = 0x134B0
在 PE 编辑器中打开二进制文件(我使用 CFF 资源管理器):
第一部分是 .text,它的虚拟地址是 0x1000,它的虚拟大小是 0x23E4C(所以该部分的结尾是 at 0x1000 + 0x23E4C = 0x24E4C
)。
0x134B0 是否介于 0x1000 和 0x24E4C 之间?
0x1000 >= 0x134B0 < 0x24E4C
-> True:所以地址位于 .text 部分。注意:对每个部分重复相同的过程,直到找到正确的部分。
SECRVA = 0x1000
(虚拟地址部分)
RVA - SECRVA =偏移量;0x134B0 - 0x1000 = 0x124B0
SECRAWADDR = 0x400
(原始地址部分)
偏移量+ SECRAWADDR = INSDATAOFFSET ;0x124B0 + 0x400 = 0x128B0
如果我们查看0x128B0
文件,我们有:
0xE8B3040000
所以我们发现文件( )中的字节数与内存中的字节数完全相同。
当然是有公式的。
我们只需要反转 PE 加载器所做的事情:
为了帮助理解以下步骤,请记住每个 PE 部分都具有以下属性:
因此,对于给定的内存地址 X,您必须:
有一个名为PEEditor 1.7的工具可以为您执行此操作。
由于某种原因,现在很难找到它,但它应该仍然存在于 Internet 上。记住:它是免费的。
找到 PE 编辑器:在这里,使用密码 tuts4you 解压 RAR 压缩包。
加载文件(通过拖入窗口或使用浏览按钮)然后点击 FLC(文件位置计算器)。在新窗口中,输入地址。
1这实际上意味着使用了 PE 标头中设置的基地址,这主要是由于分页。
2计算为内存起始地址+内存长度-1