keybode

GetModuleBase

Jan 23rd, 2014
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. typedef struct _UNICODE_STRING
  2. {
  3.     USHORT              Length;
  4.     USHORT              MaximumLength;
  5.     PWSTR               Buffer;
  6. } UNICODE_STRING, *PUNICODE_STRING;
  7.  
  8. typedef struct _PEB_LDR_DATA
  9. {
  10.     ULONG               Length;
  11.     BOOLEAN             Initialized;
  12.     PVOID               SsHandle;
  13.     LIST_ENTRY          InLoadOrderModuleList;
  14.     LIST_ENTRY          InMemoryOrderModuleList;
  15.     LIST_ENTRY          InInitializationOrderModuleList;
  16. } PEB_LDR_DATA, *PPEB_LDR_DATA;
  17.  
  18. typedef struct _LDR_MODULE
  19. {
  20.     LIST_ENTRY          InLoadOrderModuleList;
  21.     LIST_ENTRY          InMemoryOrderModuleList;
  22.     LIST_ENTRY          InInitializationOrderModuleList;
  23.     PVOID               BaseAddress;
  24.     PVOID               EntryPoint;
  25.     ULONG               SizeOfImage;
  26.     UNICODE_STRING      FullDllName;
  27.     UNICODE_STRING      BaseDllName;
  28.     ULONG               Flags;
  29.     SHORT               LoadCount;
  30.     SHORT               TlsIndex;
  31.     LIST_ENTRY          HashTableEntry;
  32.     ULONG               TimeDateStamp;
  33. } LDR_MODULE, *PLDR_MODULE;
  34.  
  35. void x_wcstombs( wchar_t* src, size_t len, char* dest )
  36. {
  37.     int i;
  38.    
  39.     char tmpc;
  40.    
  41.     if ( !src || !dest )
  42.         return;
  43.    
  44.     // iterate our wide str
  45.     for ( i = 0; i < len; i++ )
  46.     {
  47.         // truncate to 8-bit
  48.         tmpc = src[ i ] & 255;
  49.         if ( (tmpc >= 'A') && (tmpc <= 'Z') )
  50.             tmpc += 32;
  51.         // copy to buffer
  52.         dest[ i ] = tmpc;
  53.     }
  54.    
  55.     // zero-terminator fix
  56.     dest[ len ] = '\0';
  57. }
  58.  
  59. DWORD_PTR GetModuleBase( const char* lpModuleName )
  60. {
  61.     int             iLenght;
  62.     char            lpBuffer[ 255 ];
  63.     DWORD_PTR       dwPEB;
  64.     PEB_LDR_DATA*   pPEB;
  65.     LIST_ENTRY*     pHead, *pNode;
  66.     LDR_MODULE*     pModule;
  67.  
  68.     dwPEB = *makeptr( DWORD_PTR*, __readfsdword( 0x18 ), 0x30 );
  69.     dwPEB = *makeptr( DWORD_PTR*, dwPEB, 0xC );
  70.  
  71.     if( !dwPEB )
  72.         return NULL;
  73.  
  74.     pPEB    = ( PEB_LDR_DATA* )dwPEB;
  75.     pHead   = &pPEB->InLoadOrderModuleList;
  76.  
  77.     for( pNode = pHead->Flink; pNode != pHead; pNode = pNode->Flink )
  78.     {
  79.         pModule = CONTAINING_RECORD( pNode, LDR_MODULE, InLoadOrderModuleList );
  80.  
  81.         if( pModule )
  82.         {
  83.             iLenght = pModule->BaseDllName.Length >> 1;
  84.             x_wcstombs( pModule->BaseDllName.Buffer, iLenght, lpBuffer );
  85.  
  86.             if( !strcmp( lpModuleName, lpBuffer ) )
  87.             {
  88.                 return ( DWORD_PTR )pModule->BaseAddress;
  89.             }
  90.         }
  91.     }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment