Перейти к содержанию

Использование функции SetThreadContext


Рекомендуемые сообщения

Пример использования функции SetThreadContext(Windows.h) для закрытия процесса.

Программа завершает процесс путём замены адреса в регистре EIP, адресом "ExitProcess" из библиотеки kernel32.dll 

Спойлер

#include <iostream>

#include <Windows.h>

#include <tlhelp32.h>

using namespace std;
int main() {
  DWORD PID = NULL;
  HANDLE hPESnap;
  HANDLE hTHSnap;
  THREADENTRY32 te32;
  PROCESSENTRY32 pe32;
  CONTEXT ctx;
  ctx.ContextFlags = CONTEXT_CONTROL;
  HMODULE kernel = GetModuleHandle("kernel32");
  te32.dwSize = sizeof(THREADENTRY32);
  pe32.dwSize = sizeof(PROCESSENTRY32);
  hPESnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (!Process32First(hPESnap, & pe32)) return 2;
  do {
    if (stricmp(pe32.szExeFile, "uTorrent.exe") == 0) {
      PID = pe32.th32ProcessID;
      break;
    }
  } while (Process32Next(hPESnap, & pe32));
  hTHSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  while (Thread32Next(hTHSnap, & te32)) {
    if (PID == te32.th32OwnerProcessID) {
      cout << "Opening thread handle Thread ID:" << te32.th32ThreadID;
      HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, false, te32.th32ThreadID);
      cout << "Setting thread context\n\n";
      SuspendThread(hThread);
      GetThreadContext(hThread, & ctx);
      ctx.Eip = (DWORD) GetProcAddress(kernel, "ExitProcess");
      SetThreadContext(hThread, & ctx);
      ResumeThread(hThread);
      CloseHandle(hThread);
    }
  }
  CloseHandle(hTHSnap);
  CloseHandle(hPESnap);
  return 0;
}
  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.