Znn3bq.jpeg
ÉÇÍ·´óѧº£Ñó¿ÆÑ§½ÓÊܵ÷¼Á
²é¿´: 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 ]
»Ø¸´´ËÂ¥

» ²ÂÄãϲ»¶

ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû
Ïà¹Ø°æ¿éÌø×ª ÎÒÒª¶©ÔÄÂ¥Ö÷ sdlj8051 µÄÖ÷Ìâ¸üÐÂ
×î¾ßÈËÆøÈÈÌûÍÆ¼ö [²é¿´È«²¿] ×÷Õß »Ø/¿´ ×îºó·¢±í
[¿¼ÑÐ] ÉúÎïѧ308·ÖÇóµ÷¼Á£¨Ò»Ö¾Ô¸»ª¶«Ê¦´ó£©½ÓÊÜ¿çרҵ +7 ÏàÐűػá¹ââÍòÕ 2026-04-13 7/350 2026-04-13 19:49 by nxybio2007
[¿¼ÑÐ] 310Çóµ÷¼Á +14 666ÕæºÃ 2026-04-11 16/800 2026-04-13 16:44 by 89436494
[¿¼ÑÐ] 245Çóµ÷¼Á +3 ±ùÌÇéÙ?ÆûË® 2026-04-13 7/350 2026-04-13 16:42 by ±ùÌÇéÙ?ÆûË®
[¿¼ÑÐ] 071000ÉúÎïѧ£¬Ò»Ö¾Ô¸ÉîÛÚ´óѧ296·Ö£¬Çóµ÷¼Á +14 TIckLw 2026-04-06 15/750 2026-04-13 10:59 by ѧzh
[¿¼ÑÐ] 279Çóµ÷¼Á +9 ÕÅ·¬ÇѲ»³´µ° 2026-04-11 9/450 2026-04-12 22:22 by paopaotu326
[¿¼ÑÐ] µçÆø¹¤³Ìר˶320Çóµ÷¼Á +5 СÂé×Ó111 2026-04-10 5/250 2026-04-12 10:47 by zhouyuwinner
[¿¼ÑÐ] Çóµ÷¼Á£¬Ò»Ö¾Ô¸²ÄÁÏ¿ÆÑ§Ó빤³Ì985£¬365·Ö£¬ +8 ²Ä»¯Àî¿É 2026-04-11 10/500 2026-04-12 08:42 by 852137818
[¿¼ÑÐ] 332Çóµ÷¼Á +14 ½¶½¶123 2026-04-10 14/700 2026-04-12 00:27 by À¶ÔÆË¼Óê
[¿¼ÑÐ] 0860004 Çóµ÷¼Á 309·Ö +9 Yin DY 2026-04-08 9/450 2026-04-11 22:55 by dongdian1
[¿¼ÑÐ] 070300»¯Ñ§279Çóµ÷¼Á +19 ¹þ¹þ¹þ^_^ 2026-04-08 20/1000 2026-04-11 20:43 by stoner78
[¿¼ÑÐ] »¯Ñ§308·ÖÇóµ÷¼Á +22 ÄãºÃÃ÷ÌìÄãºÃ 2026-04-07 24/1200 2026-04-11 11:14 by ChemPharm
[¿¼ÑÐ] ũѧ0904 312Çóµ÷¼Á +6 Say Never 2026-04-10 6/300 2026-04-11 10:33 by wwj2530616
[¿¼ÑÐ] 298Çóµ÷¼Á +9 ¶¤¶£ß˶¬¹Ï 2026-04-07 11/550 2026-04-11 09:35 by zhq0425
[¿¼ÑÐ] 0854µ÷¼Á +4 ³¤¹­°Á 2026-04-09 4/200 2026-04-11 09:18 by Öí»á·É
[¿¼ÑÐ] µ÷¼ÁÉêÇë086000Ò»Ö¾Ô¸Î÷±±Å©ÁֿƼ¼´óѧÉúÎïÓëÒ½Ò©320·Ö-±¾¿ÆÆë³¹¤Òµ´óѧ +3 ÃÀÃÀŮʿ 2026-04-09 3/150 2026-04-10 10:31 by liuhuiying09
[¿¼ÑÐ] 278Çóµ÷¼Á +27 ·¶æÃÄÈ 2026-04-07 31/1550 2026-04-09 20:49 by zhouxiaoyu
[¿¼ÑÐ] 0703»¯Ñ§Çóµ÷¼Á +21 ²»ÖªÃûµÄСئ 2026-04-08 21/1050 2026-04-09 18:55 by l_paradox
[¿¼ÑÐ] 332£¬085601Çóµ÷¼Á +12 ydfyh 2026-04-09 14/700 2026-04-09 17:28 by wp06
[¿¼ÑÐ] ¿¼ÑÐÇóµ÷¼Á +4 ö©??? 2026-04-08 4/200 2026-04-08 21:44 by ÍÁľ˶ʿÕÐÉú
[¿¼ÑÐ] Ò»Ö¾Ô¸211£¬»¯Ñ§Ñ§Ë¶£¬310·Ö£¬±¾¿ÆÖصãË«·Ç£¬Çóµ÷¼Á +10 ŬÁ¦·Ü¶·112 2026-04-07 10/500 2026-04-08 15:01 by screening
ÐÅÏ¢Ìáʾ
ÇëÌî´¦ÀíÒâ¼û