我試圖讀取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的十進制等值?有什麼我失蹤?
感謝您的時間
請參閱perror()調用。另外,http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Errors/unix_system_errors.html –
謝謝 - 錯誤列表將無窮無盡。如果我的程序沒有運行權限,那可能是錯誤3的原因嗎?由於它可能無法訪問該進程... – XtrmJosh
@PeterL。我剛從終端鍵入「sudo ./ConsoleApplication」運行程序,它沒有做任何不同的事情。作爲一個整數值,PID是絕對正確的,有什麼我失蹤了嗎?當然,這不可能是這麼簡單! – XtrmJosh