GetThreadSelectorEntry выбрасывает ERROR_NOT_SUPPORTED для приложения x64 - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь написать очень простое приложение для отладки 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 удаленногопроцесс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...