Guest User

Untitled

a guest
Nov 30th, 2015
7
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.80 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <windows.h>
  4. #include <winnt.h>
  5. #include <tlhelp32.h>
  6. #define DIE_IFNOT(cond, msg) if(!(cond)) fprintf(stderr, "%s\n", msg), exit(1);
  7.  
  8. void DisplayImportTableEx(HANDLE hProcess, HMODULE hModImage);
  9. HMODULE RemoteGetModuleHandle(DWORD dwProcessId, LPCSTR lpModuleName);
  10. FARPROC RemoteGetProcAddress(HMODULE hModule, HMODULE hModuleRemote, LPCSTR lpProcName);
  11.  
  12. static DWORD dwCRT; // address of CreateRemoteThread
  13.  
  14. int main(void) {
  15.     DWORD dwProcessId;
  16.     printf("Process ID (Current = %d): ", GetCurrentProcessId());
  17.     if(scanf("%u", &dwProcessId) < 1) return 1;
  18.  
  19.     HMODULE hModRemote;
  20.     printf("EXE/DLL Base Address: 0x");
  21.     if(scanf("%p", &hModRemote) < 1) return 1;
  22.  
  23.     CreateRemoteThread(0, 0, 0, 0, 0, 0, 0); // Test
  24.  
  25.     dwCRT = (DWORD) RemoteGetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), RemoteGetModuleHandle(dwProcessId, "kernel32.dll"), "CreateRemoteThread");
  26.  
  27.     HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
  28.     DisplayImportTableEx(hProcess, hModRemote);
  29.     CloseHandle(hProcess);
  30.  
  31.     return 0;
  32. }
  33.  
  34. void DisplayImportTableEx(HANDLE hProcess, HMODULE hModImage) {
  35.     DWORD cbRead;
  36.     IMAGE_DOS_HEADER idh;
  37.     DIE_IFNOT(ReadProcessMemory(hProcess, hModImage, &idh, sizeof idh, &cbRead), "[!] Failed to read process memory!");
  38.     DIE_IFNOT(idh.e_magic == IMAGE_DOS_SIGNATURE, "[!] Invalid DOS Signature!");
  39.  
  40.     IMAGE_NT_HEADERS inh;
  41.     DIE_IFNOT(ReadProcessMemory(hProcess, (PCHAR)hModImage + idh.e_lfanew, &inh, sizeof inh, &cbRead), "[!] Failed to read process memory!");
  42.     DIE_IFNOT(inh.Signature == IMAGE_NT_SIGNATURE, "[!] Invalid PE Signature!");
  43.  
  44.     IMAGE_DATA_DIRECTORY dirImport = inh.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
  45.     DIE_IFNOT(dirImport.VirtualAddress && dirImport.Size, "[!] No Import Table Found!");
  46.  
  47.     PIMAGE_IMPORT_DESCRIPTOR lpImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ((PCHAR)hModImage + dirImport.VirtualAddress);
  48.     IMAGE_IMPORT_DESCRIPTOR impDesc;
  49.     DIE_IFNOT(ReadProcessMemory(hProcess, lpImportDesc, &impDesc, sizeof impDesc, &cbRead), "[!] Failed to read process memory!");
  50.     while(impDesc.Characteristics) {
  51.         CHAR szImportDllName[MAX_PATH];
  52.         DIE_IFNOT(ReadProcessMemory(hProcess, (PCHAR)hModImage + impDesc.Name, szImportDllName, sizeof szImportDllName, &cbRead), "[!] Failed to read process memory!");
  53.         printf("[+] %s\n", szImportDllName);
  54.  
  55.         PIMAGE_THUNK_DATA lpImportThunk = (PIMAGE_THUNK_DATA) ((PCHAR)hModImage + lpImportDesc->FirstThunk);
  56.         IMAGE_THUNK_DATA impThunk;
  57.         DIE_IFNOT(ReadProcessMemory(hProcess, lpImportThunk, &impThunk, sizeof impThunk, &cbRead), "[!] Failed to read process memory!");
  58.         while(impThunk.u1.Function) {
  59.             printf("\t[+] Function: 0x%08lX", impThunk.u1.Function);
  60.  
  61.             if((DWORD)impThunk.u1.Function == dwCRT) {
  62.                 printf(" (Gotcha! This is CreateRemoteThread)");
  63.             }
  64.  
  65.             putchar('\n');
  66.             DIE_IFNOT(ReadProcessMemory(hProcess, ++lpImportThunk, &impThunk, sizeof impThunk, &cbRead), "[!] Failed to read process memory!");
  67.         }
  68.  
  69.         DIE_IFNOT(ReadProcessMemory(hProcess, ++lpImportDesc, &impDesc, sizeof impDesc, &cbRead), "[!] Failed to read process memory!");
  70.     }
  71. }
  72.  
  73. HMODULE RemoteGetModuleHandle(DWORD dwProcessId, LPCSTR lpModuleName) {
  74.     HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
  75.     if(hSnapshot != INVALID_HANDLE_VALUE) {
  76.         MODULEENTRY32 me = {sizeof(MODULEENTRY32)};
  77.         BOOL bRet = Module32First(hSnapshot, &me);
  78.         while(bRet) {
  79.             if(!strcmpi(me.szModule, lpModuleName))
  80.                 return me.hModule;
  81.             bRet = Module32Next(hSnapshot, &me);
  82.         }
  83.         CloseHandle(hSnapshot);
  84.     }
  85.     return NULL;
  86. }
  87.  
  88. FARPROC RemoteGetProcAddress(HMODULE hModule, HMODULE hModuleRemote, LPCSTR lpProcName) {
  89.     FARPROC fp = GetProcAddress(hModule, lpProcName);
  90.     if(!fp) return NULL;
  91.  
  92.     return (FARPROC)( (PCHAR)fp - (PCHAR)hModule + (PCHAR)hModuleRemote );
  93. }
Advertisement
Add Comment
Please, Sign In to add comment