Advertisement
pavedaf

Suspend Thread By Name

Apr 1st, 2018
432
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.04 KB | None | 0 0
  1. #include "stdafx.h"
  2.  
  3. #include <windows.h>
  4. #include <stdio.h>
  5. #include <iostream>
  6. #include <string>
  7. #include <TlHelp32.h>
  8. #include <psapi.h>
  9.  
  10. using namespace std;
  11.  
  12. #pragma comment( lib, "psapi" )
  13.  
  14.  
  15. enum THREADINFOCLASS
  16. {
  17. ThreadQuerySetWin32StartAddress = 9,
  18. };
  19.  
  20. typedef NTSTATUS(__stdcall * f_NtQueryInformationThread)(HANDLE, THREADINFOCLASS, void*, ULONG_PTR, ULONG_PTR*);
  21.  
  22. ULONG_PTR GetThreadStartAddress(HANDLE hThread)
  23. {
  24. auto NtQueryInformationThread = reinterpret_cast<f_NtQueryInformationThread>(GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtQueryInformationThread"));
  25. if (!NtQueryInformationThread)
  26. return 0;
  27.  
  28. ULONG_PTR ulStartAddress = 0;
  29. NTSTATUS Ret = NtQueryInformationThread(hThread, ThreadQuerySetWin32StartAddress, &ulStartAddress, sizeof(ULONG_PTR), nullptr);
  30.  
  31. if (Ret)
  32. return 0;
  33.  
  34. return ulStartAddress;
  35. }
  36.  
  37.  
  38. bool TerminateThreadByStartaddress(ULONG_PTR StartAddress, DWORD dwProcId)
  39. {
  40. HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  41. if (!hSnap)
  42. return false;
  43.  
  44. THREADENTRY32 TE32 = { 0 };
  45. TE32.dwSize = sizeof(THREADENTRY32);
  46.  
  47. BOOL Ret = Thread32First(hSnap, &TE32);
  48. while (Ret)
  49. {
  50. if (TE32.th32OwnerProcessID == dwProcId)
  51. {
  52. HANDLE hTempThread = OpenThread(THREAD_ALL_ACCESS, FALSE, TE32.th32ThreadID);
  53. if (!hTempThread)
  54. continue;
  55.  
  56. if (StartAddress == GetThreadStartAddress(hTempThread))
  57. {
  58. TerminateThread(hTempThread, 0);
  59. CloseHandle(hTempThread);
  60. CloseHandle(hSnap);
  61. return true;
  62. }
  63. }
  64. Ret = Thread32Next(hSnap, &TE32);
  65. }
  66.  
  67. CloseHandle(hSnap);
  68.  
  69. return false;
  70. }
  71.  
  72.  
  73. bool SuspendThreadByStartaddress(ULONG_PTR StartAddress, DWORD dwProcId)
  74. {
  75. HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  76. if (!hSnap)
  77. return false;
  78.  
  79. THREADENTRY32 TE32 = { 0 };
  80. TE32.dwSize = sizeof(THREADENTRY32);
  81.  
  82. BOOL Ret = Thread32First(hSnap, &TE32);
  83. while (Ret)
  84. {
  85. if (TE32.th32OwnerProcessID == dwProcId)
  86. {
  87. HANDLE hTempThread = OpenThread(THREAD_ALL_ACCESS, FALSE, TE32.th32ThreadID);
  88. if (!hTempThread)
  89. continue;
  90.  
  91. if (StartAddress == GetThreadStartAddress(hTempThread))
  92. {
  93. SuspendThread(hTempThread);
  94. CloseHandle(hTempThread);
  95. CloseHandle(hSnap);
  96. return true;
  97. }
  98. }
  99. Ret = Thread32Next(hSnap, &TE32);
  100. }
  101.  
  102. CloseHandle(hSnap);
  103.  
  104. return false;
  105. }
  106.  
  107. DWORD dwGetModuleBaseAddress(DWORD dwProcID, TCHAR *szModuleName)
  108. {
  109. DWORD dwModuleBaseAddress = 0;
  110. HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwProcID);
  111. if (hSnapshot != INVALID_HANDLE_VALUE)
  112. {
  113. MODULEENTRY32 ModuleEntry32;
  114. ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
  115. if (Module32First(hSnapshot, &ModuleEntry32))
  116. {
  117. do
  118. {
  119. if (_tcsicmp(ModuleEntry32.szModule, szModuleName) == 0)
  120. {
  121. dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
  122. break;
  123. }
  124. } while (Module32Next(hSnapshot, &ModuleEntry32));
  125. }
  126. CloseHandle(hSnapshot);
  127. }
  128. return dwModuleBaseAddress;
  129. }
  130.  
  131. HANDLE GetHandleByName(char* Proc){
  132. PROCESSENTRY32 entry;
  133. entry.dwSize = sizeof(PROCESSENTRY32);
  134.  
  135. HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
  136.  
  137. if (Process32First(snapshot, &entry) == TRUE)
  138. {
  139. while (Process32Next(snapshot, &entry) == TRUE)
  140. {
  141. if (_tcsicmp(entry.szExeFile, Proc) == 0)
  142. {
  143. return OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
  144. }
  145. }
  146. }
  147. return NULL;
  148. }
  149.  
  150. int main()
  151. {
  152. char* ProcessName = "jusched.exe";
  153. char* ModuleName = "jusched.exe";
  154.  
  155. HANDLE hProcess = GetHandleByName(ProcessName);
  156.  
  157.  
  158. if (!hProcess) {
  159. cout << "Cannot found process...\n";
  160. }
  161. else {
  162. cout << "Process Found [OK]\n";
  163. DWORD PID = GetProcessId(hProcess);
  164. cout << "PID : " << PID << endl;
  165. DWORD base = dwGetModuleBaseAddress(PID, ModuleName); //Process ID / Module Name
  166.  
  167. char szBuffer[1024];
  168. sprintf(szBuffer, "Base Address : 0x%02x", base);
  169. cout << szBuffer << endl;
  170.  
  171. TerminateThreadByStartaddress(base + 0x0000, PID);
  172.  
  173. cout << "Coded By Nongkie" << endl;
  174. }
  175.  
  176. getchar();
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement