2014-03-25 23 views
1

我知道有這方面的許多問題,但似乎沒有解決我的問題。Windows 7 - WriteProcessMemory的作品,但沒有效果可見

我正在玩WriteProcessMemory函數。這一切似乎很簡單,但我在這裏遇到了一個問題,似乎無法找到解決方案。

我有什麼:

1)的 「受害者」 - 的過程,內存應該被改變

#include <windows.h> 
#include <stdio.h> 

int main() 
{ 

    SetConsoleTitle("MyTest"); 

    int var = 5; 

    printf ("%p\n\n\n\n", &var); 

    while (1) 
    { 
     printf ("%d\n", var); 
     Sleep(1000); 
    } 

    return 0; 
} 

2) 「攻擊者」 - 試圖改變「VAR過程「可變

#include <stdio.h> 
#include <windows.h> 

int main() { 

    HWND hwnd;  
    HANDLE handle; 
    DWORD pid;  

    hwnd = FindWindow(0, "MyTest"); 
    GetWindowThreadProcessId(hwnd, &pid); 
    handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); 

    int NewVar = 89; 

    SIZE_T bytesWritten = 0; 

    printf ("%d\n", WriteProcessMemory(handle, (void *)ADDRESS, &NewVar, 4, &bytesWritten)); 

    printf("%d\n", bytesWritten); 

    return 0; 
} 

當然,地址是‘受害者’告訴我們它的位置‘VAR’變量。

問題:

當我啓動的受害者,然後開始攻擊,WriteProcessMemory的返回1和bytesWritten設置爲4 - 所以,在理論上,都去了好。問題是客戶端仍然printfs 5,5,5而不是89.我也嘗試過與另一個例子,以至於無濟於事。我究竟做錯了什麼?

不確定是否有必要,但操作系統是32位Windows 7旗艦版。

+3

看看'pid'。你會發現你寫錯了過程。 –

+1

FindWindow將找到cmd.exe的PID,因爲很可能你正在使用SetConsoleTitle設置cmd.exe的窗口標題,正如Raymond所說的,只是改變找到受害者進程的PID的方法,嘗試使用受害進程的進程名稱來執行此操作。 –

+2

不,控制檯窗口由舊版本Windows上的csrss.exe擁有,當前版本爲conhost.exe。你正在破壞這個過程,我建議儘快重啓。按名稱查找流程或自行啓動。該變量必須聲明爲* volatile *。 –

回答

1

嘗試volatile int var = 5;。編譯器可能不會從RAM重新加載變量,而是將其保存在寄存器中。

相關問題