【 聲明:版權所有,歡迎轉載,請勿用於商業用途。 聯繫信箱:feixiaoxing @163.com】
有這樣一些場景,我們需要監控一些進程是否運行,內存數據是否正確。但是,與此同時,原來的程序不能被修改,或者無法修改,但是我們希望做一些監控操作。這個時候,就需要寫一個內存監控程序了。今天,正好在網上看到類似的一篇文章,鏈接地址在這。主要用到了這麼幾個API,即
1、獲取窗口句柄
FindWindowW
2、根據窗口句柄獲取進程id信息
GetWindowThreadProcessId
3、根據進程id獲取進程句柄
OpenProcess
4、讀取進程中的內存數據
ReadProcessMemory
5、數據寫入到對應的進程空間
WriteProcessMemory
其實不管什麼進程,對於操作系統來說都是一樣的。所以,一個進程如果想看另外一個進程的數據,從技術上來說沒有什麼難度。雖然不同程序的user space都差不多,只是tlb不同,但是隻要os api支持,就沒有什麼問題。在實際開發中,我們發現可以通過gdb去調試和操作另外一個程序,原理和這個也差不多。
如果需要將某一個調試dll嵌入(有時候也叫注入)到別人的程序中,可以參考這個鏈接,主要的基本流程也是OpenProcess (打開插入進程)-> VirtualAllocEx(注意是其他process的句柄) -> WriteProcessMemory(同樣是其他process的句柄) -> GetProcAddress(獲取LoadLibraryW的地址) -> CreateRemoteThread (要求另外的process啓動一個thread,主要功能就是用LoadLibraryW加載這個dll)-> WaitForSingleObject(等待線程結束) -> VirtualFreeEx (釋放內存)-> CloseHandle(釋放remote thread句柄) -> CloseHandle(釋放進程句柄)。最關鍵的部分就是CreateRemoteThread 這個函數。
PS:
鏈接的這篇文章本來是做遊戲輔助的。主要方法是通過遊戲操作,在CheatEngine上面找到對應數值的地址,接着通過OD反彙編進一步確認原來可執行程序的基礎地址(因爲有可能不是靜態地址,而是動態地址),而輔助程序就是通過定時檢測操作來修改對應內存的數值,提升遊戲體驗。按照目前的法律,這種修改程序的行爲是不合法的,希望大家還是用在正道上面。類似的程序還有僞裝木馬什麼的,看看就好,不要亂用。