2013-07-09 61 views
1

我試圖讀取Linux上的進程內存(準確地說是Xubuntu)。我對Linux很新,儘管我在Windows中使用Win32API ReadProcessMemory()完成了相同的讀取。總的想法是,我正在嘗試開發一些軟件來獲取我的統計數據並將其上傳到服務器,該服務器將跟蹤我的進度並記錄它。最終目標是製作一個能自動播放和收集遊戲數據的機器人。爲了做到這一點,我需要能夠訪問進程內存。在Windows中,這很容易。在Linux中,它證明更復雜一點。Linux ptrace內存讀取和進程管理

我發現了一個內存地址,其中包含我想要讀取的信息。該信息是一個int32,它存儲在84a1bd8。我發現它使用GameConqueror 0.13。重新啓動後地址保持正確,所以看起來沒有ASLR(就像在Windows中一樣)。我也知道ProcessID(我現在可以使用任務管理器找到它,儘管如果有人知道通過ClassName,Exe名稱或類似方法獲得PID的簡單方法,那也會很棒!)所以,看起來像這樣應該是我真的需要使用PTRACE_PEEKDATA來讀取內存,對嗎?那麼,這是問題,它似乎並不是。我的代碼如下所示:

#include <iostream> 
#include <string> 
#include <sys/ptrace.h> 
#include <errno.h> 

using namespace std; 

int main() 
{ 
    pid_t pid = 4847; 
    int addr = 0x84a1bd8; 
    long ret = ptrace(PTRACE_TRACEME, pid, NULL, NULL); 
    cout << "ptrace Status: " << ret << endl; 
    cout << "Errno: " << errno << endl; 
    ret = ptrace(PTRACE_PEEKDATA, pid, (void*)addr, NULL); 
    cout << "ptrace Status: " << ret << endl; 
    cout << "Errno: " << errno << endl; 
    ret = ptrace(PTRACE_DETACH, pid, NULL, NULL); 
    cout << "ptrace Status: " << ret << endl; 
    cout << "Errno: " << errno << endl; 
    return 0; 
} 

輸出看起來是這樣的:

ptrace Status: 0 
Errno: 0 
ptrace Status: -1 
Errno: 3 
ptrace Status: -1 
Errno: 3 

是相當新的Linux,我不知道在哪裏,我找到的錯誤代碼,以及如何我可以工作這個錯誤實際上意味着什麼,也不知道我是否正確地聲明瞭地址。我是否應該將它聲明爲int的十進制等值?有什麼我失蹤?

感謝您的時間

+0

請參閱perror()調用。另外,http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Errors/unix_system_errors.html –

+0

謝謝 - 錯誤列表將無窮無盡。如果我的程序沒有運行權限,那可能是錯誤3的原因嗎?由於它可能無法訪問該進程... – XtrmJosh

+0

@PeterL。我剛從終端鍵入「sudo ./ConsoleApplication」運行程序,它沒有做任何不同的事情。作爲一個整數值,PID是絕對正確的,有什麼我失蹤了嗎?當然,這不可能是這麼簡單! – XtrmJosh

回答

1

找到了解決方案是使用ptrace的()時,你必須在訂單中稱:

ptrace(PTRACE_ATTACH, pid, NULL, NULL) 
ptrace(PTRACE_PEEKDATA, pid, addr, NULL) 
ptrace(PTRACE_DETACH, pid, NULL, NULL) 

所以簡單的回答:你需要連接和之前分離和讀完內存後。

也可能知道,安裝和拆卸命令之間,進程會睡有用的,這意味着這個方法是不是我的目的很好,但可能是有用的人:)

感謝@PeterL。您的幫助。

+1

很高興知道! –