如果由于 ASLR 每次内存地址不同,当我知道的值写入内存时,设置断点的最快方法是什么?

逆向工程 记忆 x64dbg
2021-06-14 20:59:40

我有一个 64 位 exe,我正在使用 x64dbg 进行调试。

我正在搜索一个特定的字符串值myvalue,该位于 exe 中的某处加密(因此,在myvalue开始时搜索不返回任何内容)。

当值被解密时,我可以搜索它并获取当前的内存地址。我可以在该特定地址被写入/读取时放置一个断点,但这没有任何意义,因为它只会被解密和加载一次。

由于ASLR策略,每次关闭和打开程序时,这个内存地址都是不同的。

我的目标是为 exe 生成一个补丁,以便写入后立即myvalue成为anothervaluemyvalue或者通过识别写入该值的代码段。

link /edit /dynamicbase:NO filename.exe无所事事地禁用 ASLR :无论如何,内存地址每次都不同。在整个操作系统范围内禁用 ASLR 似乎有点矫枉过正和危险。

我不能在写入之前放置断点,因为我不知道地址。

理想情况下,“内存”页面上应该有一个菜单,上面写着“谁在这里写的”,并将我指向执行此操作的反汇编程序行。

我怎样才能做到这一点?

1个回答

您可以使用 PE 编辑器在可执行文件上禁用 ASLR,并在 Dll 特性字段中禁用 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE。

如果该值包含在可执行映像中,则可以计算其相对地址并将其添加到可执行文件的基地址中,假设此相对地址每次都相同。

如果它在可执行文件之外,那么它在用 VirtualAlloc 分配的内存页中。我认为页面分配与 ASLR 无关,因此禁用它对随机地址没有帮助。也许您可以记录对 VirtualAlloc 的调用,并找到分配您感兴趣的页面的那个。然后您可以在页面内放置一个断点,位于您的值将要位于的相对地址处。

另一种方法 - 在写入值之前查找您知道的值写入同一页面,并根据它们计算目标地址。