我正在修改一个旧的放弃软件游戏以获得无限生命。
具有指令dec ecx
的地址与其在.exe调试中的位置不同。
我记得我的一位老朋友告诉我,有一个公式可以通过.exe中的指令获得“真实”地址。作弊引擎给了我内存地址。我记得在数学公式中,我需要得到模块,在OllyDbg我得到它。但我不记得这个公式。有人知道那个数学公式怎么样?这个公式非常简单! 还有另一种方法可以让文件位置永久修改.exe?
答案 0 :(得分:10)
有一个"公式"但是你实际上需要查看可执行文件(虽然这个公式可以根据一些假设进行简化)。
<强>假设强>
通常(我坚持通常,有时情况并非如此),[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,其VirtulAddress是0x1000,其VirtualSize是0x23E4C(因此该部分的末尾是0x1000 + 0x23E4C = 0x24E4C
)。
在0x1000和0x24E4C之间是0x134B0吗?
0x1000 >= 0x134B0 < 0x24E4C
- &gt;是的:所以地址位于.text部分。注意:对每个部分重复相同的过程,直到找到正确的部分。
答案 1 :(得分:1)
当然有一个公式 我们只需要反转PE加载器的作用:
为了帮助理解以下步骤,请记住每个PE部分都包含以下属性:
因此,对于给定的内存地址X,您必须:
有一个名为 PEEditor 1.7 的工具可以为您完成此任务 由于某些原因,它现在更难找到它,但它应该仍然存在于互联网上。记住:它是免费的。
找到PE编辑器:Here,使用密码tuts4you解压缩RAR存档。
加载文件(通过拖动到窗口或使用“浏览”按钮),然后点击FLC(文件位置计算器)。在新窗口中,输入地址。
1 大多数情况下,这实际上意味着使用PE头中设置的基地址,这要归功于分页。
2 计算为内存起始地址+内存长度-1