SHARE
TWEET

Untitled

ahcript Apr 18th, 2017 (edited) 80 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define EXPORT_DIRECTORY OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]
  2.  
  3. BOOL GetProcessModuleInfo(__in HANDLE hProcess, __in LPCWSTR lpModuleName, __out LPVOID *lplpBaseOfDll)
  4. {
  5.     PROCESS_BASIC_INFORMATION pbi;
  6.     PEB peb;
  7.     HMODULE hModule;
  8.  
  9.     if (lplpBaseOfDll == NULL || lpdwSizeOfImage == NULL)
  10.         return FALSE;
  11.  
  12.     if (NT_SUCCESS(NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL)))
  13.     {
  14.         if (!ReadProcessMemory(hProcess, pbi.PebBaseAddress, &peb, sizeof(PEB), NULL))
  15.             return FALSE;
  16.  
  17.         // read peb
  18.         if (lpModuleName !=  NULL)
  19.         {
  20.             LDR_DATA_TABLE_ENTRY LdrTable;
  21.             PEB_LDR_DATA LdrData;
  22.             PLIST_ENTRY pList;
  23.             PLIST_ENTRY pCurrentList;
  24.             LPVOID pDllName;
  25.  
  26.             // PEB_LDR_DATA
  27.             if (!ReadProcessMemory(hProcess, (PBYTE)peb.Ldr, &LdrData, sizeof(PEB_LDR_DATA), NULL))
  28.                 return FALSE;
  29.  
  30.             pList = LdrData.InLoadOrderModuleList.Blink;
  31.             pCurrentList = LdrData.InLoadOrderModuleList.Flink;
  32.  
  33.             while (pCurrentList != pList)
  34.             {
  35.                 if (!ReadProcessMemory(hProcess, pCurrentList, &LdrTable, sizeof(LDR_DATA_TABLE_ENTRY), NULL))
  36.                     return FALSE;
  37.  
  38.                 pDllName = VirtualAlloc(NULL, LdrTable.FullDllName.Length, MEM_COMMIT, PAGE_READWRITE);
  39.  
  40.                 if (!ReadProcessMemory(hProcess, LdrTable.FullDllName.Buffer, pDllName, LdrTable.FullDllName.Length, NULL))
  41.                     return FALSE;
  42.  
  43.                 if (wcsstr((LPCWSTR)pDllName, lpModuleName))
  44.                 {
  45.                     hModule = (HMODULE)LdrTable.BaseAddress;
  46.                     break;
  47.                 }
  48.  
  49.                 VirtualFree(pDllName, 0, MEM_RELEASE);
  50.  
  51.                 pCurrentList = LdrTable.InLoadOrderModuleList.Flink;
  52.             }
  53.         }
  54.  
  55.         // manual
  56.         IMAGE_DOS_HEADER ImageDosHeader;
  57.         IMAGE_NT_HEADERS ImageNtHeaders;
  58.         LONG e_lfanew;
  59.  
  60.         // read dos header
  61.         if (!ReadProcessMemory(hProcess, reinterpret_cast<LPCVOID>(hModule), &ImageDosHeader, sizeof(IMAGE_DOS_HEADER), NULL))
  62.             return FALSE;
  63.  
  64.         if (ImageDosHeader.e_magic != IMAGE_DOS_SIGNATURE)
  65.         {
  66.             // wrong signature
  67.             return FALSE;
  68.         }
  69.  
  70.         e_lfanew = ImageDosHeader.e_lfanew;
  71.         if (e_lfanew >= 0 && e_lfanew < 0x10000000)
  72.         {
  73.             if (!ReadProcessMemory(hProcess, reinterpret_cast<LPCVOID>(PBYTE(hModule) + e_lfanew),
  74.                 &ImageNtHeaders, sizeof(IMAGE_NT_HEADERS), NULL))
  75.             {
  76.                 return FALSE;
  77.             }
  78.  
  79.             if (ImageNtHeaders.Signature == IMAGE_NT_SIGNATURE)
  80.             {
  81.                 *lplpBaseOfDll = hModule;
  82.                 return TRUE;
  83.             }
  84.         }
  85.     }
  86.  
  87.     return FALSE;
  88. }
  89.  
  90. FARPROC GetProcAddressEx(__in HANDLE hProcess, __in LPCWSTR lpModuleName, __in LPCSTR lpProcName)
  91. {
  92.     HMODULE hModule;
  93.     LPVOID lpBaseOfDll;
  94.  
  95.     if (!GetProcessModuleInfo(hProcess, lpModuleName, &lpBaseOfDll))
  96.         return NULL;
  97.  
  98.     hModule = (HMODULE)lpBaseOfDll;
  99.     if (!hModule)
  100.         return NULL;
  101.  
  102.     IMAGE_DOS_HEADER ImageDosHeader;
  103.     IMAGE_NT_HEADERS ImageNtHeaders;
  104.     LONG e_lfanew;
  105.  
  106.     // read dos header
  107.     if (!ReadProcessMemory(hProcess, reinterpret_cast<LPCVOID>(hModule), &ImageDosHeader, sizeof(IMAGE_DOS_HEADER), NULL))
  108.         return NULL;
  109.  
  110.     if (ImageDosHeader.e_magic != IMAGE_DOS_SIGNATURE)
  111.     {
  112.         // wrong signature
  113.         return NULL;
  114.     }
  115.  
  116.     e_lfanew = ImageDosHeader.e_lfanew;
  117.     if (e_lfanew >= 0 && e_lfanew < 0x10000000)
  118.     {
  119.         if (!ReadProcessMemory(hProcess, reinterpret_cast<LPCVOID>(PBYTE(hModule) + e_lfanew),
  120.             &ImageNtHeaders, sizeof(IMAGE_NT_HEADERS), NULL))
  121.         {
  122.             return NULL;
  123.         }
  124.  
  125.         if (ImageNtHeaders.Signature == IMAGE_NT_SIGNATURE)
  126.         {
  127.             IMAGE_EXPORT_DIRECTORY ExportDirectory;
  128.  
  129.             if (ReadProcessMemory(hProcess, reinterpret_cast<PIMAGE_EXPORT_DIRECTORY>(PBYTE(hModule) + ImageNtHeaders.EXPORT_DIRECTORY.VirtualAddress),
  130.                 &ExportDirectory, sizeof(IMAGE_EXPORT_DIRECTORY), NULL))
  131.             {
  132.                 LPDWORD lpdwName = reinterpret_cast<LPDWORD>(PBYTE(hModule) + ExportDirectory.AddressOfNames);
  133.                 LPDWORD lpdwFunction = reinterpret_cast<LPDWORD>(PBYTE(hModule) + ExportDirectory.AddressOfFunctions);
  134.                 LPWORD lpwOrdinals = reinterpret_cast<LPWORD>(PBYTE(hModule) + ExportDirectory.AddressOfNameOrdinals);
  135.  
  136.                 for (int i = 0; i < ExportDirectory.NumberOfNames; i++)
  137.                 {
  138.                     WORD wOrdinal;
  139.                     LPVOID lpvFunction;
  140.                     LPVOID lpvName;
  141.                     char pszName[MAX_PATH];
  142.  
  143.                     if (!ReadProcessMemory(hProcess, &lpwOrdinals[i], &wOrdinal, sizeof(WORD), NULL))
  144.                         continue;
  145.  
  146.                     if (!ReadProcessMemory(hProcess, &lpdwName[i], &lpvName, sizeof(DWORD), NULL))
  147.                         continue;
  148.  
  149.                     if (!ReadProcessMemory(hProcess, &lpdwFunction[wOrdinal], &lpvFunction, sizeof(DWORD), NULL))
  150.                         continue;
  151.  
  152.                     if (!ReadProcessMemory(hProcess, (LPCVOID)((DWORD)hModule + (DWORD)lpvName), pszName, sizeof(pszName), NULL))
  153.                         continue;
  154.  
  155.                     if (strcmp(pszName, lpProcName) == 0)
  156.                     {
  157.                         lpvFunction = (LPVOID)((DWORD)hModule + (DWORD)lpvFunction);
  158.  
  159.                         return (FARPROC)lpvFunction;
  160.                     }
  161.                 }
  162.             }
  163.         }
  164.     }
  165.  
  166.     return NULL;
  167. }
RAW Paste Data
Pastebin PRO Summer Special!
Get 60% OFF on Pastebin PRO accounts!
Top