2013-08-30 52 views
0

我試圖尋找BYTE模式在程序中,但由於某種原因,當我從MINFO.SizeOfImageModuleSize 012 KB它的值導致我注入該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進行了測試。我沒有得到任何錯誤。我的繼承人代碼&你

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; 
    }