2013-08-30 4 views
0

Я пытаюсь найти шаблоны BYTE в программах, но по какой-то причине, когда я назначаю значение от MINFO.SizeOfImage до ModuleSize, он вызывает программу, в которую я ввел DLL в сбой.Элемент sizeOfImage, вызывающий сбой программы

DWORD FindPattern(const BYTE* Pattern,SIZE_T PatternSize) 
{ 
    DWORD ModuleBase = (DWORD)GetModuleHandle(NULL); 
    DWORD ModuleSize = 0; 
    MODULEINFO MINFO; 
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,0,GetCurrentProcessId()); 

    if(hProcess) 
    { 
     GetModuleInformation(hProcess,GetModuleHandle(NULL),&MINFO,sizeof(MODULEINFO)); 
     CloseHandle(hProcess); 
     ModuleSize = MINFO.SizeOfImage; 
    } 
    else 
     return 0; 

    for(int i = 0;i < ModuleSize;i++) 
    { 
     if(memcmp((void*)(ModuleBase + i),Pattern,PatternSize) == 0) 
      return ModuleBase + i; 
    } 
    return 0; 
} 
+1

Вы указываете за пределы модуля. Исправьте цикл for(), вам нужно остановиться в 'ModuleSize - PatternSize'. –

ответ

2

Вы код работал нормально, когда я скомпилировал его и ввел. Я даже тестировал его против текущего FindPattern, который я использую. У меня не было никаких ошибок. Heres мой код & ваш

bool Compare(const BYTE* pData, const BYTE* bMask, const char* szMask) 
{ 
    for(;*szMask;++szMask,++pData,++bMask) 
     if(*szMask=='x' && *pData!=*bMask) return 0; 
    return (*szMask) == NULL; 
} 
DWORD FindPattern(DWORD dwAddress, DWORD dwLen, BYTE *bMask, char * szMask) 
{ 
    for(DWORD i=0; i<dwLen; i++) 
     if (Compare((BYTE*)(dwAddress+i),bMask,szMask)) return (DWORD)(dwAddress+i); 
    return 0; 
} 

А потом, когда я запускаю это через него

uint8 DecryptNeedle[] = {0x56, 0x8B, 0x74, 0x24, 0x08, 0x89, 0x71, 0x10, 
       0x0F, 0xB6, 0x16, 0x0F, 0xB6, 0x46, 0x01, 0x03, 
       0xC2, 0x8B, 0x51, 0x28, 0x25, 0xFF, 0x00, 0x00, 
       0x00, 0x89, 0x41, 0x04, 0x0F, 0xB6, 0x04, 0x10}; 
char DecryptMask[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 

DWORD addrDecrypt  = FindPattern(dwModuleStartAddr, 0xA000, DecryptNeedle, DecryptMask); 
DWORD decrypt2 = YourFindPattern(DecryptNeedle, 32); 

выход идентичен в обоих.

Я бы дважды проверил ваш код инъекции и проверил whatelse может быть причиной ошибки. Кроме того, выполните быструю проверку ошибок

if(hProcess) 
    { 
     if(!GetModuleInformation(hProcess,GetModuleHandle(NULL),&MINFO,sizeof(MODULEINFO))); 
     { 
       //error 
     } 
     CloseHandle(hProcess); 
     ModuleSize = MINFO.SizeOfImage; 
    } 
Смежные вопросы