作成日:2002.7.14
bool enable_debug_privilege() {
HANDLE hToken;
LUID Value;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken (GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
return false;
}
if (!LookupPrivilegeValue ((LPSTR)NULL, SE_DEBUG_NAME, &Value)){
return false; // error
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = Value;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges (hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL);
if (GetLastError () != ERROR_SUCCESS) {
return false; // error
}
CloseHandle( hToken );
return true;
}
char proc_pid_mem[MAX_FILE_PATH];
sprintf(proc_pid_mem, "/proc/%d/as", pid);
if( (fd = open(proc_pid_mem, O_CREAT | O_RDONLY)) != -1 ){
off_t p = lseek( fd, offset, SEEK_SET );
if( p == offset ){
size_t size = read(fd, &buffer, sizeof(buffer));
if( size == sizeof(buffer) ){
printf("%02x", buffer);
}
}
}
3. は 2. と原理的同じ手法でデータを転送するが、
/proc の下のファイルを操作する代わりに
専用の API を用いる。long result; char proc_pid_mem[MAX_FILE_PATH + 1]; // attachproccess ptrace(PTRACE_ATTACH, pid, NULL, NULL); #if defined(__READ_BY_PTRACE__) /* ptrace API を使ってメモリを読みこむ */ result = ptrace( PTRACE_PEEKDATA, pid, (void*)offset, NULL); printf("memory: %d\n", (int)result ); #else /* procfs 経由でメモリを読みこむ */ sprintf(proc_pid_mem, "/proc/%d/mem", pid); if( (fd = open(proc_pid_mem, O_RDWR)) >= 0 ){ off_t p = lseek( fd, offset, SEEK_SET ); if( p == offset ){ size_t size = read(fd, buffer, 4); if( size == 4){ for(int i=0 ; i<4; i++){ printf("%02x", buffer[i]); } printf("\n"); } } } #endif // detach the proccess ptrace(PTRACE_DETACH, pid, NULL, NULL);