2013-04-30 83 views
4

我想修改有效應用程序(編輯的存儲器地址),編輯存儲器地址

上地址00498D45我想編輯其值

當期的值:

MOV BYTE PTR SS:[EBP-423],7 

更新值:

MOV BYTE PTR SS:[EBP-423],8 

我到現在爲止是這樣的(在網上搜索它,這有多遠):

在此先感謝!

using System.Runtime.InteropServices; 

    [Flags] 

     public enum ProcessAccessFlags : uint 

{ 
    All = 0x001F0FFF, 
    Terminate = 0x00000001, 
    CreateThread = 0x00000002, 
    VMOperation = 0x00000008, 
    VMRead = 0x00000010, 
    VMWrite = 0x00000020, 
    DupHandle = 0x00000040, 
    SetInformation = 0x00000200, 
    QueryInformation = 0x00000400, 
    Synchronize = 0x00100000 
} 

[DllImport("kernel32.dll")] 
private static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId); 

[DllImport("kernel32.dll", SetLastError = true)] 
private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out int lpNumberOfBytesWritten); 

[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, out int lpNumberOfBytesRead); 

[DllImport("kernel32.dll")] 
public static extern Int32 CloseHandle(IntPtr hProcess); 

Process process = Process.GetProcessesByName("My Apps Name").FirstOrDefault(); 

public static bool WriteMemory(Process process, int address, long value, out int bytesWritten) 
{ 
    IntPtr hProc = OpenProcess(ProcessAccessFlags.All, false, process.Id); 

    byte[] val = BitConverter.GetBytes(value); 

    bool worked = WriteProcessMemory(hProc, new IntPtr(address), val, (UInt32) val.LongLength, out bytesWritten); 

    CloseHandle(hProc); 

    return worked; 
} 
+2

你的問題是什麼? – Yahia 2013-04-30 20:50:59

+0

我怎麼能做我想要的編輯,我的意思是ASM從更正值更新到更新值 - 我是ASM新手,所以我不知道如果我設置值等權利。 – Dan272 2013-04-30 20:51:44

+0

@Yahia他想要任意編輯進程內存中的一個字節。 – Patashu 2013-04-30 20:51:59

回答

3

從你other question

WriteMemory(Process process,00498D45 , MOV BYTE PTR SS:[EBP-423],8) 

有這麼多的問題,這一點,我不知道從哪裏開始。首先,這不是正確的C#語法。

  1. 你正在調用一個函數,但你有Process那裏,就像它是一個簽名。
  2. 00498D45不是任何基地的有效常數。如果你的意思是十六進制,(你可能會這樣做,因爲你正在處理地址),那麼像所有其他類似C語言一樣,應該表示爲0x00498D45
  3. 這是x86中的彙編代碼(但不是字符串,只是亂七八糟)。您不能將ASCII彙編代碼放入另一個進程的地址空間!

也許你應該多做一點研究,瞭解編譯和編譯程序時的彙編工作,以及你的CPU在執行程序時的實際內容。另外,我建議您通過示例代碼閱讀您非常明顯從某處獲取的代碼,並嘗試瞭解它。你會更好地瞭解正在發生的事情,而不是要求每個人幫助解決你們拼湊在一起的東西。 </rant>

無論如何,您彙編代碼之後,它看起來像這樣(重新DIS組裝):

C68559FEFFFF08 mov byte [ebp-0x1a7],0x8 

這意味着,你的指令,實際上是一個字節C6 85 59 FE FF FF 08的字符串。所以這就是你需要寫入你的目標應用程序。

這是你想要做什麼的基礎:

byte[] new_instr = new byte[] {0xC6, 0x85, 0x59, 0xFE, 0xFF, 0xFF, 0x08}; 
IntPtr target_addr = (IntPtr)0x00498D45; 

int bytesWritten; 
WriteProcessMemory(hProcess, target_addr, new_instr, (UInt32)new_instr.Length, out bytesWritten); 

你複製和粘貼不會幫助你在這裏的WriteMemory記憶功能。問題是,它只寫了一個long,它是4個字節。你需要寫7個字節。因此,您必須修改該功能才能使用byte[]參數,或者自己動手。


我很佩服你的野心,但你真的應該開始低一點。編寫一些C#代碼來熟悉C語言的編程。然後寫一些C,以便在你不完美地完成任務時熟悉崩潰。然後嘗試彙編 - 也許在你的C代碼中寫入小的內聯塊。最後,你會準備好繞開其他正在運行的進程的指令。

+0

寫4個字節有什麼問題?實際上只有1個字節會改變,對吧? – harold 2013-05-03 10:17:58

1

您可以使用注射庫,如MemorySharp(我是作者)。所有這些函數都封裝在一個方便的API中,集成了一個彙編器(FASM語法)。因此,這段代碼執行你想要的東西:

using (var m = new MemorySharp(ApplicationFinder.FromProcessName("My App").First())) 
{ 
    m.Assembly.Inject("MOV BYTE [EBP-423],8", new IntPtr(0x00498D45)); 
}