2013-07-09 2 views
1

리눅스 (정확하게, Xubuntu)에서 프로세스 메모리를 읽으려고합니다. Windows에서 Win32API ReadProcessMemory()를 사용하여이 동일한 내용을 읽었지만 Linux에 익숙하지 않았습니다. 일반적인 생각은 내가 내 통계를 얻고 서버에 업로드하는 게임을위한 소프트웨어를 개발하려고한다는 것입니다. 서버에서 내 진행 상황을 추적하고 기록을 남깁니다. 최종 목표는 게임에 대한 데이터를 자동으로 재생하고 저장하는 봇을 만드는 것입니다. 이를 위해서는 프로세스 메모리에 액세스 할 수 있어야합니다. Windows에서는 간단합니다. 리눅스에서는 좀 더 복잡한 것으로 증명됩니다.리눅스 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 

리눅스 아주 새로운이기 때문에, 내가 오류 코드를 찾을 수있어 위치를 모르는 내가 어떻게 일할 수 내 코드는 다음과 같습니다 이 오류가 실제로 무엇을 의미하는지, 주소를 올바르게 선언하는지 알 수 없습니다. 내가 그것을 십진수 이에 상응하는 int로 선언해야합니까? 제가 빠진 것이 있습니까?

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

은 그래서 간단한 대답 : 당신은 첨부하기 전에 분리해야하고, 해결책을 찾을 시간

+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를 사용하는 경우() 당신이 순서대로 호출해야 할 수 메모리를 읽은 후

또한 연결하고 분리 명령 사이, 프로세스가 잠 것을 알고하는 것이 유용 할 수 있습니다,이 방법을 의미하는 것은 내 목적을 위해 너무 좋은 것이 아니라 다른 사람 :)에

감사에 유용 할 수 있습니다 @PeterL. 너의 도움으로.

+1

알아두면 좋습니다! –