2016-09-04 64 views
0

正如标题所示,这将如何完成?如果我在操作码的开始处添加了一个字节,它将以一个字节将内存中的地址压入。如果你不明白的问题:在不影响执行的情况下向PE添加字节

原:

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

您必须手动检查程序中使用的每个存储器地址,以确定是否需要调整它。在一个非平凡的程序中,这是不实际的,因为你需要修复的地址可能在任何地方。另请注意,您列出的大多数指令长度超过1个字节。 –

+0

嗯,这可能不是完全相同的。我选择的dup目标是关于添加新代码的一种特定方法(将其放在一个新的部分中,并用jmp替换一些现有的insn),但Jean-François的答案指出了其他技术。 –

回答

2

糟糕的主意,因为它会如果代码不是位置无关

  • 移一些相对跳跃(不是全部)
  • 转变重定位偏移

当我用来破解游戏,我把NOP INSTEAD的代码,这是没问题,但有时你需要做的比这更多:

替代品:

  • 找到一个免费/未使用的程序区域(例如不可达的健壮性代码)并在其中移动一些原始代码。然后jsr到它并添加您的自定义代码。
  • 反汇编可执行文件,以便它可以重新组合并添加您的代码。此方法要求您识别所有代码&数据部分,因此更加困难,但最终您可以向程序添加任何内容。
+0

如果我反汇编可执行文件。我怎么知道一个字节是指令还是内存位置的一部分?例如:我可能正在寻找mov指令0x89,并在所有的0x89 movs中找到它,但也在mov eax,dword_0x4C89中找到它。 –

+0

@JF:让我知道你是否认为我应该重新打开它。我可能很仓促地重复它。 –

+0

@PeterCordes这是你,但我认为你是对的。链接的答案非常好,非常完整。 –

相关问题