Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.62 KB | None | 0 0
  1.  
  2. using namespace std;
  3.  
  4. string cinput;
  5. DWORD WINAPI ThreadProc(PVOID p, string dllpath)
  6. {
  7. LoadLibraryA("D:\\APIHOOK.dll");
  8. return 0;
  9. }
  10.  
  11. unsigned long attach(char* pName)
  12. {
  13. HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
  14. PROCESSENTRY32 entry;
  15. entry.dwSize = sizeof(entry);
  16. do
  17. if (!strcmp(entry.szExeFile, pName)) {
  18. CloseHandle(handle);
  19. return entry.th32ProcessID;
  20. }
  21. while (Process32Next(handle, &entry));
  22. return false;
  23. }
  24.  
  25.  
  26. int main(int argc, char* argv[])
  27. {
  28. PIMAGE_DOS_HEADER pIDH;
  29. PIMAGE_NT_HEADERS pINH;
  30. PIMAGE_BASE_RELOCATION pIBR;
  31.  
  32. cout << "Enter target process name: ";
  33. cin >> cinput;
  34.  
  35. HANDLE hProcess, hThread;
  36. PUSHORT TypeOffset;
  37. DWORD pid = attach((char*)cinput.c_str());
  38. PVOID ImageBase, Buffer, mem;
  39. ULONG i, Count, Delta, *p;
  40.  
  41.  
  42. printf("\nOpening target process\n");
  43. cout << pid << endl;
  44. hProcess = OpenProcess(
  45. PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE,
  46. FALSE,
  47. pid);
  48.  
  49. if (!hProcess) {
  50. printf("\nError: Unable to open target process (%u)\n", GetLastError());
  51. getchar();
  52. return -1;
  53. }
  54.  
  55. ImageBase = GetModuleHandle(NULL);
  56. printf("\nImage base in current process: %#x\n", ImageBase);
  57.  
  58. pIDH = (PIMAGE_DOS_HEADER)ImageBase;
  59. pINH = (PIMAGE_NT_HEADERS)((PUCHAR)ImageBase + pIDH->e_lfanew);
  60.  
  61. printf("\nAllocating memory in target process\n");
  62. mem = VirtualAllocEx(hProcess, NULL, pINH->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  63. if (!mem) {
  64. printf("\nError: Unable to allocate memory in target process (%u)\n", GetLastError());
  65.  
  66. CloseHandle(hProcess);
  67. getchar();
  68. return 0;
  69. }
  70. printf("\nMemory allocated at %#x\n", mem);
  71.  
  72. Buffer = VirtualAlloc(NULL, pINH->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
  73. memcpy(Buffer, ImageBase, pINH->OptionalHeader.SizeOfImage);
  74.  
  75. printf("\nRelocating image\n");
  76.  
  77. pIBR = (PIMAGE_BASE_RELOCATION)((PUCHAR)Buffer + pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
  78. Delta = (ULONG)mem - (ULONG)ImageBase;
  79.  
  80. printf("\nDelta: %#x\n", Delta);
  81.  
  82. while (pIBR->VirtualAddress)
  83. {
  84. if (pIBR->SizeOfBlock >= sizeof(IMAGE_BASE_RELOCATION)) {
  85. Count = (pIBR->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(USHORT);
  86. TypeOffset = (PUSHORT)(pIBR + 1);
  87.  
  88. for (i = 0; i<Count; i++) {
  89. if (TypeOffset[i]) {
  90. p = (PULONG)((PUCHAR)Buffer + pIBR->VirtualAddress + (TypeOffset[i] & 0xFFF));
  91. *p += Delta;
  92. }
  93. }
  94. }
  95. pIBR = (PIMAGE_BASE_RELOCATION)((PUCHAR)pIBR + pIBR->SizeOfBlock);
  96. }
  97.  
  98. printf("\nWriting relocated image into target process\n");
  99.  
  100. if (!WriteProcessMemory(hProcess, mem, Buffer, pINH->OptionalHeader.SizeOfImage, NULL)) {
  101. printf("\nError: Unable to write process memory (%u)\n", GetLastError());
  102.  
  103. VirtualFreeEx(hProcess, mem, 0, MEM_RELEASE);
  104. CloseHandle(hProcess);
  105. getchar();
  106. return -1;
  107. }
  108.  
  109. VirtualFree(Buffer, 0, MEM_RELEASE);
  110.  
  111. printf("\nCreating thread in target process\n");
  112. hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)((PUCHAR)ThreadProc + Delta), NULL, 0, NULL);
  113.  
  114. if (!hThread) {
  115. printf("\nError: Unable to create thread in target process (%u)\n", GetLastError());
  116.  
  117. VirtualFreeEx(hProcess, mem, 0, MEM_RELEASE);
  118. CloseHandle(hProcess);
  119. getchar();
  120. return -1;
  121. }
  122.  
  123. printf("\nWaiting for the thread to terminate\n");
  124. WaitForSingleObject(hThread, INFINITE);
  125.  
  126. printf("\nThread terminated\n\nFreeing allocated memory\n");
  127.  
  128. VirtualFreeEx(hProcess, mem, 0, MEM_RELEASE);
  129. CloseHandle(hProcess);
  130. getchar();
  131. return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement