Я пытаюсь написать очень простое приложение для отладки 64-битного приложения Win32.Моя конечная цель - получить TIB и PEB удаленного потока, но по какой-то причине способ, которым я сделал это в 32-разрядном приложении, не работает для 64-разрядных (кроме просмотра Esp против Rsp и проверки SegFs против SegGs).).Код, который я пытаюсь использовать, находится здесь:
#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>
int main(int argc, char *argv[]){
LDT_ENTRY entry;
DWORD pid;
HANDLE hThread;
HANDLE hSnapshot;
CONTEXT context;
context.ContextFlags = CONTEXT_CONTROL;
if(argc < 2){
printf("Usage: %s PID\n", argv[0]);
exit(1);
}
pid = atoi(argv[1]);
THREADENTRY32 te32;
te32.dwSize = sizeof(te32);
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
while(Thread32Next(hSnapshot, &te32)){
if(pid == te32.th32OwnerProcessID){
hThread = OpenThread(THREAD_ALL_ACCESS, 0, te32.th32ThreadID);
if(!hThread)
exit(1);
if(SuspendThread(hThread) == (DWORD) -1)
exit(1);
if(!GetThreadContext(hThread, &context))
exit(1);
printf("Rsp = 0x%x\n", context.Rsp);
if(!GetThreadSelectorEntry(hThread, context.SegGs, &entry)){
LPSTR buff = NULL;
FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL,
GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buff, 0, NULL);
printf("Error: %s\n", buff); //ERROR_NOT_SUPPORTED 50 0x32 The request is not supported.
LocalFree(buff);
exit(1);
}
}
}
CloseHandle(hSnapshot);
return 0;
}
, но он всегда выдает ошибку в «GetThreadSelectorEntry».Выдается код ошибки ERROR_NOT_SUPPORTED: запрос не поддерживается.
Я не могу понять, почему он не поддерживается.Кто-нибудь знает почему?
[EDIT]
Ладно GetThreadSelectorEntry не доступен для процессов x86_64, кто-нибудь знает, как я могу получить адреса TIB / PEB удаленногопроцесс