欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

PE文件得到導(dǎo)入表和導(dǎo)出表代碼加注釋

主要目的 熟悉PE文件

成都創(chuàng)新互聯(lián)公司專(zhuān)注于網(wǎng)站建設(shè)|網(wǎng)站維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋成都三輪攪拌車(chē)等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷(xiāo)售的產(chǎn)品,結(jié)合品牌形象的塑造,量身設(shè)計(jì)品質(zhì)網(wǎng)站。

創(chuàng)建句柄 映射pe文件到地址空間 創(chuàng)建文件視圖 得到文件的首地址  PIMAGE

然后對(duì)各個(gè)結(jié)構(gòu)進(jìn)行初始化

主要代碼

導(dǎo)入表

void GETIMPORT(PVOID PIMAGE)
{
PBYTE PBIMAGE = (PBYTE)PIMAGE;
DWORD IMPORTRAW = 0;
DWORD CNTDLL=0;
DWORD IMPORTRVA = pe.DATA[1].VirtualAddress;
PIMAGE_SECTION_HEADER PIMPORTSEC;
for (int i=0; i<pe.FILE->NumberOfSections; i++)
{
 if (IMPORTRVA>=a[i] && IMPORTRVA<=b[i])
 {
  IMPORTRAW = IMPORTRVA - pe.SECTION[i].VirtualAddress +  pe.SECTION[i].PointerToRawData; //RVA->RAW計(jì)算文件偏移
  PIMPORTSEC = &pe.SECTION[i]; //記錄輸入表所在節(jié)
 }
}
if(!IMPORTRVA)
{
 MessageBox(NULL,"IMPORT IS EMOPTY","ERROR",NULL);
 return;
}
PIMAGE_IMPORT_DESCRIPTOR IMPORT = PIMAGE_IMPORT_DESCRIPTOR(IMPORTRAW+PBIMAGE); //使用輸入表的文件地址
//因?yàn)橐话鉕riginalFirstThunk不為0  所以采用這個(gè)判斷條件 其實(shí)是不嚴(yán)謹(jǐn)?shù)?br />//有的程序OriginalFirstThunk是為0的 這樣的話 就采用FIRSTTHUNK來(lái)循環(huán)遍歷 在此未考慮為0的情況
//不過(guò)也用了FIRSTTHUNK 目的是利用它得到每個(gè)函數(shù)的 RVA


while (0 != IMPORT->OriginalFirstThunk) //判斷dll是否結(jié)束
{
      LPDWORD THUNK =(LPDWORD) (IMPORT->OriginalFirstThunk - PIMPORTSEC->VirtualAddress

                                                                   +  PIMPORTSEC-   >PointerToRawData+PBIMAGE);
   LPDWORD FIRSTTHUNK = (LPDWORD)IMPORT->FirstThunk;

//THUNK      使用OriginalFirstThunk   來(lái)遍歷每一個(gè) PIMAGE_THUNK_DATA (四個(gè)字節(jié)大小) 的結(jié)構(gòu)
//FIRSTTHUNK 使用FirstThunk           來(lái)遍歷每一個(gè) PIMAGE_THUNK_DATA (四個(gè)字節(jié)大小) 的結(jié)構(gòu)
//在這里使用它找到每個(gè)函數(shù)的RVA
/*****************************************************************************************************/
//要想得到dll 或者 函數(shù)的名字 都要計(jì)算出其在磁盤(pán)上的位置 方可取出

   LPDWORD DLLNAME = (LPDWORD)(IMPORT->Name - PIMPORTSEC->VirtualAddress +

                                                    PIMPORTSEC->PointerToRawData + PBIMAGE);
   CHAR NAMEBUF[20];
   sprintf(NAMEBUF,"%s",DLLNAME);
   DWORD NAMEBUFFER = strlen(NAMEBUF);
   DWORD STYLE;
   WriteFile(IMPORTHANDLE,"\r\n",2,&STYLE,NULL);
   WriteFile(IMPORTHANDLE,NAMEBUF,NAMEBUFFER,&NAMEBUFFER,NULL);
   WriteFile(IMPORTHANDLE,"\r\n",2,&NAMEBUFFER,NULL);
   WriteFile(IMPORTHANDLE,"\r\n",2,&NAMEBUFFER,NULL);

/* 這段代碼是 得到每個(gè)引入的dll的名字 并且在循環(huán)輸出函數(shù)索引和名字之前 輸出此函數(shù)所在的這個(gè)dll名字*/
/*****************************************************************************************************/
//THUNK指針保存的值是OriginalFirstThunk指向的PIMAGE_THUNK_DATA結(jié)構(gòu) 即這是判斷函數(shù)是否結(jié)束
// *THUNK就是 PIMAGE_THUNK_DATA  (四個(gè)字節(jié)大小) 結(jié)構(gòu)的內(nèi)容
// 此內(nèi)容是一個(gè)RVA 指向PIMAGE_IMPORT_BY_NAME 轉(zhuǎn)換成 RAW后  所保存的內(nèi)容就是函數(shù)名字和索引

   while(*THUNK)
   {
  if (*THUNK & IMAGE_ORDINAL_FLAG32) //最高位是1 是序號(hào)引入
  {
   DWORD index = (*THUNK & 0x7fffffff);
   CHAR BUFFER[20];
   DWORD REALBUFFER;
   sprintf(BUFFER,"0x%x",index);
   WriteFile(IMPORTHANDLE,BUFFER,4,&REALBUFFER,NULL);
   WriteFile(IMPORTHANDLE,"\r",2,&REALBUFFER,NULL);


   CHAR FRISTTHUNK[20];
   sprintf(FRISTTHUNK,"0x%x",FIRSTTHUNK);
   WriteFile(IMPORTHANDLE,FRISTTHUNK,8,&REALBUFFER,NULL);
   WriteFile(IMPORTHANDLE,"\r\n",2,&REALBUFFER,NULL);
  }
  else
  {
/*
計(jì)算得到 PIMAGE_IMPORT_BY_NAME 結(jié)構(gòu)的磁盤(pán)位置
*THUNK就是 PIMAGE_THUNK_DATA  (四個(gè)字節(jié)大小) 結(jié)構(gòu)的內(nèi)容
此內(nèi)容是一個(gè)RVA 指向PIMAGE_IMPORT_BY_NAME 結(jié)構(gòu)  將其轉(zhuǎn)換成 RAW后  所保存的內(nèi)容就是索引和函數(shù)名字
FIRSTTHUNK 此時(shí)也是PIMAGE_THUNK_DATA的內(nèi)容
當(dāng)加載到內(nèi)存后 才會(huì) 被換成 函數(shù)的真實(shí)地址 所以在這里只是取出 FIRSTTHUNK 的值 即一個(gè)RVA
因?yàn)榇藭r(shí)  *FIRSTTHUNK  的內(nèi)容跟 *THUNK 是一模一樣的
*/

     PIMAGE_IMPORT_BY_NAME NAME = PIMAGE_IMPORT_BY_NAME(*THUNK - PIMPORTSEC->VirtualAddress

                                                                                                         +  PIMPORTSEC->PointerToRawData + PBIMAGE);
/*********************************************************************************************************************/
// 輸出 PIMAGE_IMPORT_BY_NAME 結(jié)構(gòu)中的HINT

  CHAR BUFFER[10];
  DWORD REALBUFFER;
  sprintf(BUFFER,"0x%x",NAME->Hint);
  WriteFile(IMPORTHANDLE,BUFFER,5,&REALBUFFER,NULL);
  WriteFile(IMPORTHANDLE,"\r",2,&REALBUFFER,NULL);


/*********************************************************************************************************************/
//輸出 PIMAGE_IMPORT_BY_NAME 結(jié)構(gòu)中的NAME

  CHAR BUF[30];
  DWORD LEN ;
  sprintf(BUF,"%s",NAME->Name);
  LEN=strlen(BUF)+1;
  WriteFile(IMPORTHANDLE,NAME->Name,LEN,&REALBUFFER,NULL);

/*********************************************************************************************************************/
//輸出 PIMAGE_THUNK_DATA 結(jié)構(gòu)的內(nèi)容 即 指向 PIMAGE_IMPORT_BY_NAME 結(jié)構(gòu)的RVA

  CHAR THUNKBUF[20];
  sprintf(THUNKBUF,"0x%x",*THUNK);
  WriteFile(IMPORTHANDLE,THUNKBUF,8,&REALBUFFER,NULL);
  WriteFile(IMPORTHANDLE,"\r",2,&REALBUFFER,NULL);

/*********************************************************************************************************************/
//輸出 FRISTTHUNK 的值 即一個(gè)當(dāng)pe加載時(shí)指向引入函數(shù)真實(shí)地址的 RVA 初始值為 IMPORT->FirstThunk; 指針加1即可

  CHAR FRISTTHUNK[20];
  sprintf(FRISTTHUNK,"0x%x",FIRSTTHUNK);
  WriteFile(IMPORTHANDLE,FRISTTHUNK,6,&REALBUFFER,NULL);
  WriteFile(IMPORTHANDLE,"\r\n",2,&REALBUFFER,NULL);

/*********************************************************************************************************************/
    }

  THUNK++; // 指針加1  也就是跳過(guò)一個(gè) PIMAGE_THUNK_DATA 結(jié)構(gòu)  掃描下一個(gè)函數(shù)
   FIRSTTHUNK++;  //獲得每個(gè)引入函數(shù)的RVA
   }
   IMPORT++;//掃描下一個(gè)dll
   CNTDLL++; //記錄dll個(gè)數(shù)    
}
}

導(dǎo)出表

void GETEXPORT(PVOID PIMAGE)
{
PBYTE PBIMAGE = (PBYTE)PIMAGE;
DWORD EXPORTRVA = pe.DATA[0].VirtualAddress;
PIMAGE_SECTION_HEADER EXPORTSECT;
PIMAGE_EXPORT_DIRECTORY EXPORT;
DWORD EXPORTRAW;
for(int i=0; i<pe.FILE->NumberOfSections; i++)
{
 if (EXPORTRVA>=a[i] && EXPORTRVA<=b[i])
 {
   EXPORTRAW = EXPORTRVA - pe.SECTION[i].VirtualAddress + pe.SECTION[i].PointerToRawData; //RVA->RAW
   EXPORTSECT = &pe.SECTION[i];
 }

}
EXPORT = PIMAGE_EXPORT_DIRECTORY(EXPORTRAW+PBIMAGE); //使用輸出表的文件地址

if(!EXPORTRVA)
{
 MessageBox(NULL,"EXPORT IS EMOPTY","ERROR",NULL);
 return;

}

printf("Base = 0x%x\n",EXPORT->Base);
printf("NumberOfFunctions = 0x%x\n",EXPORT->NumberOfFunctions);
printf("NumberOfNames = 0x%x\n",EXPORT->NumberOfNames);
printf("AddressOfFunctions = 0x%x\n",EXPORT->AddressOfFunctions);
printf("AddressOfNameOrdinals = 0x%x\n",EXPORT->AddressOfNameOrdinals);
printf("AddressOfNames = 0x%x\n",EXPORT->AddressOfNames);
DWORD DLLNAME = (DWORD)(EXPORT->Name - EXPORTSECT->VirtualAddress + EXPORTSECT->PointerToRawData + PBIMAGE);
//輸出名字之前 必須得到名字RVA 的RAW 并加上 文件首地址 得到文件地址
printf("Name = %s\n",DLLNAME);

LPDWORD NAMEADDRESS = (LPDWORD)(EXPORT->AddressOfNames - EXPORTSECT->VirtualAddress + EXPORTSECT->PointerToRawData + PBIMAGE);
LPWORD ADDNAMEORD = (LPWORD)(EXPORT->AddressOfNameOrdinals - EXPORTSECT->VirtualAddress + EXPORTSECT->PointerToRawData + PBIMAGE);
LPDWORD FUNCTIONADDRESS = (LPDWORD)(EXPORT->AddressOfFunctions - EXPORTSECT->VirtualAddress + EXPORTSECT->PointerToRawData + PBIMAGE);

for(DWORD j=0; j<EXPORT->NumberOfNames; j++)

{
// 計(jì)算名字所在的文件地址 通過(guò)兩步找到的 RVA -> RAW(名字的RVA2)  RVA2->RAW2(名字)
 PDWORD NAME = (PDWORD)(*NAMEADDRESS - EXPORTSECT->VirtualAddress + EXPORTSECT->PointerToRawData + PBIMAGE);

/*********************************************************************************************************************/
/**********************函數(shù)的名字 得到其文件地址很重要********************************************************/
 DWORD BUF;
 CHAR NAMEBUF[50];
 DWORD LEN;
 sprintf(NAMEBUF,"%s",NAME);
 LEN=strlen(NAMEBUF);
 WriteFile(EXPORTHANDLE,NAME,LEN,&BUF,NULL);
 WriteFile(EXPORTHANDLE,"\r",2,&BUF,NULL);
 WriteFile(EXPORTHANDLE,"\r",2,&BUF,NULL);
/*********************************************************************************************************************/
/**********************索引號(hào) 一步可以得到其內(nèi)容**************************************************************/
 sprintf(NAMEBUF,"0x%04x",*ADDNAMEORD+1);
 WriteFile(EXPORTHANDLE,NAMEBUF,6,&BUF,NULL);
 WriteFile(EXPORTHANDLE,"\r",2,&BUF,NULL);
 WriteFile(EXPORTHANDLE,"\r",2,&BUF,NULL);
/*********************************************************************************************************************/
/**********************函數(shù)的RVA  類(lèi)似于索引號(hào)的求法**********************************************************************/

 sprintf(NAMEBUF,"0x%08x",*FUNCTIONADDRESS);
 WriteFile(EXPORTHANDLE,NAMEBUF,10,&BUF,NULL);
 WriteFile(EXPORTHANDLE,"\r\n",2,&BUF,NULL);

/*********************************************************************************************************************/

 NAMEADDRESS++;
 ADDNAMEORD++;
 FUNCTIONADDRESS++;

}

}

結(jié)束。

名稱(chēng)欄目:PE文件得到導(dǎo)入表和導(dǎo)出表代碼加注釋
本文鏈接:http://aaarwkj.com/article0/psocoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站改版、定制開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)公司、云服務(wù)器、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
国产精品自拍激情在线观看| 日本精品在线亚洲国产欧美| 黄色av在线免费观看| 人妻丝袜中文字幕在线| 特级特色生活片免费看| 国产精品毛片在线看不卡| 日韩免费色视频一区| 久久精品人妻中文av| 国产真实乱偷精品视频免| 综合国产精品久久久久久| 精品女同一区二区三区久久| 人妻少妇中文字幕久久| 欧美日韩国产天堂一区| 精品人妻一区二区四区| 人人爽久久爱夜夜躁一区| 一区二区三区蜜桃av| 蜜桃视频国产在线观看| 日韩人妻一区中文字幕| 91午夜福利视频鉴赏| 亚洲天堂国产中文在线| 日本视频一曲二曲三曲四曲 | 国产精品亚洲av三区国产毛片 | 亚洲熟妇亚洲熟妇亚洲熟妇| 激情久久五月激情婷婷| 亚洲综合美女极品啪啪啪| 亚洲三区四区视频在线观看| 国产精品老熟女一区二区| 极品大胸美女被啪啪的高潮| 91美女黑丝免费国产视频| 少妇高潮喷水下面的水| 国内丰满少妇嗷嗷叫在线播放| 精品国产一区二区三区性色av| 日本免费一区二区三区四区视频| 日本福利写真在线观看| 日韩精品a区二区在线电影| 亚洲国产欧美日韩一区| 日本国产一区二区精品| 亚洲免费一级黄色录像片| 高清av网站大全网站| 一级黄片视频免费下载| 青草草草草草在线观看|