| ²é¿´: 297 | »Ø¸´: 0 | |||
| µ±Ç°Ö÷ÌâÒѾ´æµµ¡£ | |||
sdlj8051½ð³æ (ÖøÃûдÊÖ)
|
[½»Á÷]
Ò»¶Î·ÂÕæPE¼ÓÔØÆ÷ÐÐΪµÄ³ÌÐò[תÌù]
|
||
|
ÒÔϳÌÐò¼Ù¶¨PEÎļþÊǺϷ¨µÄ£¬ËùÒÔºÜ¶àµØ·½¶¼Ã»ÓÐÌṩÈÝ´í´¦Àí bool PELoader(char *lpStaticPEBuff, long lStaticPELen) { long lPESignOffset = *(long *)(lpStaticPEBuff + 0x3c); IMAGE_NT_HEADERS *pINH = (IMAGE_NT_HEADERS *)(lpStaticPEBuff + lPESignOffset); //È¡¼ÓÔØµ½ÄÚ´æÖдóС long lImageSize = pINH->OptionalHeader.SizeOfImage; char *lpDynPEBuff = new char[lImageSize]; if(lpDynPEBuff == NULL) { return false; } memset(lpDynPEBuff, 0, lImageSize); //È¡PEÎļþµÄ½ÚÊýÁ¿ long lSectionNum = pINH->FileHeader.NumberOfSections; //¼ÆËãPEÍ·ÐÅÏ¢¼°½Ú±íÐÅÏ¢Õ¼ÓÃÄÚ´æ´óС long lPEHeadSize = lPESignOffset + sizeof(IMAGE_NT_HEADERS) + lSectionNum * sizeof(IMAGE_SECTION_HEADER); //¼ÓÔØPEÍ·²¿ÐÅÏ¢¼°Æä¸÷¸ö½Ú±í memcpy(lpDynPEBuff, lpStaticPEBuff, lPEHeadSize); //¼ÓÔØ¸÷¸ö½Ú long lFileAlignMask = pINH->OptionalHeader.FileAlignment - 1; //¸÷½ÚÔÚ´ÅÅÌÖÐµÄ¶ÔÆëÑÚÂë long lSectionAlignMask = pINH->OptionalHeader.SectionAlignment - 1; //¸÷½ÚÔÚloadºóÄÚ´æÖÐµÄ¶ÔÆëÑÚÂë IMAGE_SECTION_HEADER *pISH = (IMAGE_SECTION_HEADER *)((char *)pINH + sizeof(IMAGE_NT_HEADERS)); for(int nIndex = 0; nIndex < lSectionNum; nIndex++, pISH++) { //Åж¨¸÷½ÚµÄ¶ÔÆëÊôÐÔ£¬ºÏ·¨²» if((pISH->VirtualAddress & lSectionAlignMask) || (pISH->SizeOfRawData & lFileAlignMask)) { //³öÏÖ·Ç·¨½Ú delete lpDynPEBuff; return false; } //¼ÓÔØ¸Ä½Ú memcpy(lpDynPEBuff + pISH->VirtualAddress, lpStaticPEBuff + pISH->PointerToRawData, pISH->SizeOfRawData); } //Ð޸ĵ¼Èë±í£¬µ¼Èë³ÌÐòÖ´Ðйý³ÌÖÐÒªÓõ½µÄAPIº¯ÊýµØÖ· if(pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size > 0) //´óÓÚ0˵Ã÷Óе¼Èë±í { IMAGE_IMPORT_DESCRIPTOR *pIID = (IMAGE_IMPORT_DESCRIPTOR *)(lpDynPEBuff + \ pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); //Ñ»·É¨Ãèÿ¸ö½«Óк¯Êýµ¼ÈëµÄdll for(; pIID->Name != NULL; pIID++) { /*Ôø¿´¹ýOllyDumpÔ´´úÂ룬ÄÇÀïÔÚÖØ½¨µ¼Èë±íµÄʱºò£¬²¢Ã»Óгõʼ»¯OriginalFirstThunkÕâ¸ö×Ö¶Î, ËùÒÔÕâÀïÒ²²»¶ÔOriginalFirstThunkÕâ¸ö×ֶνøÐд¦ÀíÁË*/ IMAGE_THUNK_DATA *pITD = (IMAGE_THUNK_DATA *)(lpDynPEBuff + pIID->FirstThunk); HINSTANCE hInstance = LoadLibrary(lpDynPEBuff + pIID->Name); if(hInstance == NULL) { //µ¼ÈëÕâ¸ödllʧ°Ü delete lpDynPEBuff; return false; } //Ñ»·É¨ÃèdllÄÚÿ¸ö±»µ¼È뺯Êý for(; pITD->u1.Ordinal != 0; pITD++) { FARPROC fpFun; if(pITD->u1.Ordinal & IMAGE_ORDINAL_FLAG32) { //º¯ÊýÊÇÒÔÐòºÅµÄ·½Ê½µ¼ÈëµÄ fpFun = GetProcAddress(hInstance, (LPCSTR)(pITD->u1.Ordinal & 0x0000ffff)); } else { //º¯ÊýÊÇÒÔÃû³Æ·½Ê½µ¼ÈëµÄ IMAGE_IMPORT_BY_NAME * pIIBN = (IMAGE_IMPORT_BY_NAME *)(lpDynPEBuff + pITD->u1.Ordinal); fpFun = GetProcAddress(hInstance, (LPCSTR)pIIBN->Name); } if(fpFun == NULL) { //µ¼³öÕâ¸öº¯Êýʧ°Ü delete lpDynPEBuff; return false; } pITD->u1.Ordinal = (long)fpFun; } FreeLibrary(hInstance); } } //ÖØ¶¨Î»´¦Àí if(pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size > 0) { //È¡µÚÒ»¸öÖØ¶¨Î»¿é IMAGE_BASE_RELOCATION *pIBR = (IMAGE_BASE_RELOCATION *)(lpDynPEBuff + \ pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress); long lDifference = (long)lpDynPEBuff - pINH->OptionalHeader.ImageBase; //Ñ»·Ã¿¸öÖØ¶¨Î»¿é for(; pIBR->VirtualAddress != 0; ) { char *lpMemPage = lpDynPEBuff + pIBR->VirtualAddress; long lCount = (pIBR->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) >> 1; //¶ÔÕâ¸öÒ³ÃæÖеÄÿ¸öÐèÖØ¶¨Î»µÄÏî½øÐд¦Àí short int *pRelocationItem = (short int *)((char *)pIBR + sizeof(IMAGE_BASE_RELOCATION)); for(int nIndex = 0; nIndex < lCount; nIndex++) { int nOffset = pRelocationItem[nIndex] &0x0fff; int nType = pRelocationItem[nIndex] >> 12; //ËäÈ»windows¶¨ÒåÁ˺ܶàÖØ¶¨Î»ÀàÐÍ£¬µ«ÊÇÔÚPEÎļþÖÐÖ»Äܼûµ½0ºÍ3Á½ÖÖ if(nType == 3) { *(long *)(lpDynPEBuff + nOffset) += lDifference; } else if(nType == 0) { //ʲôҲ²»×ö } } //pIBRÖ¸ÏòÏÂÒ»¸öÖØ¶¨Î»¿é pIBR = (IMAGE_BASE_RELOCATION *)(pRelocationItem + lCount); } } delete lpDynPEBuff; return true; } [ Last edited by »ÃÓ°ÎÞºÛ on 2006-11-11 at 07:31 ] |
» ²ÂÄãϲ»¶
ÉúÎïѧ308·ÖÇóµ÷¼Á£¨Ò»Ö¾Ô¸»ª¶«Ê¦´ó£©½ÓÊÜ¿çרҵ
ÒѾÓÐ7È˻ظ´
Çóµ÷¼Á
ÒѾÓÐ11È˻ظ´
085600²ÄÁÏÓ뻯¹¤329·ÖÇóµ÷¼Á
ÒѾÓÐ13È˻ظ´
»¯Ñ§070300 Çóµ÷¼Á
ÒѾÓÐ18È˻ظ´
085600²ÄÁÏÓ뻯¹¤349·ÖÇóµ÷¼Á
ÒѾÓÐ12È˻ظ´
273Çóµ÷¼Á
ÒѾÓÐ5È˻ظ´
Ò»Ö¾Ô¸211£¬»¯Ñ§Ñ§Ë¶£¬310·Ö£¬±¾¿ÆÖصãË«·Ç£¬Çóµ÷¼Á
ÒѾÓÐ21È˻ظ´
¿¼ÑÐÓ¢Ò»ÊýÒ»338·Ö
ÒѾÓÐ8È˻ظ´
302Çóµ÷¼Á
ÒѾÓÐ10È˻ظ´
327Çóµ÷¼Á
ÒѾÓÐ14È˻ظ´














»Ø¸´´ËÂ¥