2016-09-04 59 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這是你,但我認爲你是對的。鏈接的答案非常好,非常完整。 –

相關問題