【问题标题】:Adding bytes to PE without affecting execution [duplicate]在不影响执行的情况下向 PE 添加字节 [重复]
【发布时间】:2017-01-12 04:05:19
【问题描述】:

正如标题所说,这将如何完成?如果我在操作码的开头添加一个字节,它将用一个字节将地址推送到内存中。如果你不明白这个问题:

原文:

0x1  mov ecx, 10
0x2  mov eax, 1
0x3  inc eac
0x4  cmp eax
0x5  jl 0x3

添加字节:

0x1  NOP
0x2  mov ecx, 10
0x3  mov eax, 1
0x4  inc eac
0x5  cmp eax
0x6  jl 0x3

我是否必须手动设置每个 jmp、调用等,还是有其他方法可以做到这一点?

【问题讨论】:

  • 您必须手动检查程序中使用的每个内存地址,看看是否需要调整。在一个重要的程序中,这是不切实际的,因为您需要修复的地址可能在任何地方。另请注意,您列出的大多数指令长度都超过 1 个字节。
  • 嗯,这可能不是完全相同的副本。我选择的 dup-target 是关于添加新代码的一种特定方法(将其放在新部分中,并用 jmp 替换一些现有的 insn),但 Jean-François 的回答指出了其他技术。

标签: assembly reverse-engineering portable-executable


【解决方案1】:

这是个坏主意

  • 移动一些相对跳跃(不是全部)
  • 如果代码不是位置独立的,则移位重定位偏移

以前我破解游戏时,我用 NOP 代替代码,这没问题,但有时你需要做的还不止这些:

替代方案:

  • 找到一个空闲/未使用的程序区域(例如无法访问的健壮性代码)并将一些原始代码移到那里。然后 jsr 到它并添加您的自定义代码。
  • 反汇编可执行文件,以便可以重新汇编并随意添加您的代码。此方法要求您识别所有代码和数据部分,因此比较困难,但最终您可以向程序中添加任何内容。

【讨论】:

  • 如果我反汇编可执行文件。我怎么知道一个字节是指令还是内存位置的一部分?例如:我可能正在寻找 mov 指令 0x89 并在所有 0x89 mov 中找到它,但也在 mov eax, dword_0x4C89 中找到它。
  • @JF:如果您认为我应该重新打开它,请告诉我。我可能是草率地敲打它。
  • @PeterCordes 你真好,但我认为你是对的。链接的答案非常好,非常完整。
猜你喜欢
  • 2015-10-16
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 2022-01-20
  • 2017-03-30
  • 2023-03-26
  • 1970-01-01
  • 2017-12-27
相关资源
最近更新 更多