青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Tiany 's Blog

奮斗的路上肯定會遇到很多困難 該不該繼續?

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  15 Posts :: 1 Stories :: 28 Comments :: 0 Trackbacks

常用鏈接

留言簿(1)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

這個IMAGE_NT_HEADERS其實就是PE相關結構的映像頭,NT據我揣測應該是New Technology的縮寫,區分于DOS WIN9X的新技術,您老要是非覺得是NTR什么的也沒關系。

IMAGE_NT_HEADERS的結構是這個樣子的

IMAGE_NT_HEADERS STRUCT 

+0h        DWORD    Signature
+4h          IMAGE_FILE_HEADER    FileHeader
+18h        IMAGE_OPTIONAL_HEADER32    OptionalHeader
}
 IMAGE_NT_HEADERS ENDS

 


其中包含兩個子結構體,和一個標志。
其中Signature字段被設置成00004550h ,ASCII碼為PE00 ,標志著PE頭文件的開始。上一篇中 DOS頭結構體中的e_lfanew正是指向這里。

 


IMAGE_FILE_HEAD

ER這個結構是這樣的

typedef struct _IMAGE_FILE_HEADER
{
+04h WORD Machine; // 運行平臺
+06h WORD NumberOfSections; // 文件的區塊數目
+08h DWORD TimeDateStamp; // 文件創建日期和時間
+0Ch DWORD PointerToSymbolTable; // 指向符號表(主要用于調試)
+10h DWORD NumberOfSymbols; // 符號表中符號個數(同上)
+14h WORD SizeOfOptionalHeader; // IMAGE_OPTIONAL_HEADER32 結構大小
+16h WORD Characteristics; // 文件屬性
}
IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

Machine 代表了CPU的類型 ,定義在windows.h中

#define IMAGE_FILE_MACHINE_UNKNOWN   0
  
#define IMAGE_FILE_MACHINE_I386    0x014c // Intel 386.
  
#define IMAGE_FILE_MACHINE_R3000    0x0162 // MIPS little-endian, 0x160 big-endian
  
#define IMAGE_FILE_MACHINE_R4000    0x0166 // MIPS little-endian
  
#define IMAGE_FILE_MACHINE_R10000   0x0168 // MIPS little-endian
  
#define IMAGE_FILE_MACHINE_WCEMIPSV2  0x0169 // MIPS little-endian WCE v2
  
#define IMAGE_FILE_MACHINE_ALPHA    0x0184 // Alpha_AXP
  
#define IMAGE_FILE_MACHINE_POWERPC   0x01F0 // IBM PowerPC Little-Endian
  
#define IMAGE_FILE_MACHINE_SH3     0x01a2 // SH3 little-endian
  
#define IMAGE_FILE_MACHINE_SH3E    0x01a4 // SH3E little-endian
  
#define IMAGE_FILE_MACHINE_SH4     0x01a6 // SH4 little-endian
  
#define IMAGE_FILE_MACHINE_ARM     0x01c0 // ARM Little-Endian
  
#define IMAGE_FILE_MACHINE_THUMB    0x01c2
  
#define IMAGE_FILE_MACHINE_IA64    0x0200 // Intel 64
  
#define IMAGE_FILE_MACHINE_MIPS16   0x0266 // MIPS
  
#define IMAGE_FILE_MACHINE_MIPSFPU   0x0366 // MIPS
  
#define IMAGE_FILE_MACHINE_MIPSFPU16  0x0466 // MIPS
  
#define IMAGE_FILE_MACHINE_ALPHA64   0x0284 // ALPHA64
  
#define IMAGE_FILE_MACHINE_AXP64    IMAGE_FILE_MACHINE_ALPHA64


NumberOfSection 代表區塊的數目,區塊表緊跟在IMAGE_NT_HEADERS后面,區塊表大概是一個鏈表結構,鏈表長度由NumberOfSection的數值決定。

TimeDataStamp 表明文件的創建時間

SizeOfOptionalHeader 是IMAGE_NT_HEADERS的另一個子結構IMAGE_OPTIONAL_HEADER的大小,32位的PE文件這個值一般是00E0,64位的PE文件一般是00F0

Characteristics 代表文件的

屬性EXE文件一般是0100h DLL文件一般是210Eh,多種屬性可以用或運算同時擁有。

#define IMAGE_FILE_RELOCS_STRIPPED      0x0001 // 重定位信息被移除
#define IMAGE_FILE_EXECUTABLE_IMAGE     0x0002 // 文件可執行
#define IMAGE_FILE_LINE_NUMS_STRIPPED    0x0004 // 行號被移除
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED    0x0008 // 符號被移除
#define IMAGE_FILE_AGGRESIVE_WS_TRIM     0x0010 // Agressively trim working set
#define IMAGE_FILE_LARGE_ADDRESS_AWARE    0x0020 // 程序能處理大于2G的地址
#define IMAGE_FILE_BYTES_REVERSED_LO     0x0080 // Bytes of machine word are reversed.
#define IMAGE_FILE_32BIT_MACHINE       0x0100 // 32位機器
#define IMAGE_FILE_DEBUG_STRIPPED      0x0200 // .dbg文件的調試信息被移除
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP  0x0400 // 如果在移動介質中,拷到交換文件中運行
#define IMAGE_FILE_NET_RUN_FROM_SWAP     0x0800 // 如果在網絡中,拷到交換文件中運行
#define IMAGE_FILE_SYSTEM          0x1000 // 系統文件
#define IMAGE_FILE_DLL            0x2000 // 文件是一個dll
#define IMAGE_FILE_UP_SYSTEM_ONLY      0x4000 // 文件只能運行在單處理器上
#define IMAGE_FILE_BYTES_REVERSED_HI     0x8000 // Bytes of machine word are reversed.

下面來編寫一個程序來顯示一下這個結構體
#include "windows.h" //PE的那一套結構體大多都是定義在這個頭文件里的
#include "stdio.h"

int main(int argc, char* argv[])
{
    FILE
*p;
    LONG e_lfanew; 
//指向IMAGE_NT_HEADERS32結構在文件中的偏移
    IMAGE_FILE_HEADER myfileheader;
   
    p
= fopen("test.exe","r+b");
    
if(p == NULL)return -1;

    fseek(p,
0x3c,SEEK_SET);
    fread(
&e_lfanew,4,1,p);
    fseek(p,e_lfanew
+4,SEEK_SET); //指向IMAGE_FILE_HEADER結構的偏移 PE的標志位是DWORD占4字節
    fread(&myfileheader,sizeof(myfileheader),1,p);

    printf(
"IMAGE_FILE_HEADER結構:\n");
    printf(
"Machine       : %04X\n",myfileheader.Machine);
    printf(
"NumberOfSections   : %04X\n",myfileheader.NumberOfSections);
    printf(
"TimeDateStamp    : %08X\n",myfileheader.TimeDateStamp);
    printf(
"PointerToSymbolTable : %08X\n",myfileheader.PointerToSymbolTable);
    printf(
"NumberOfSymbols   : %08X\n",myfileheader.NumberOfSymbols);
    printf(
"SizeOfOptionalHeader : %04X\n",myfileheader.SizeOfOptionalHeader);
    printf(
"Characteristics   : %04X\n",myfileheader.Characteristics);
    getch();
    
return 0;
}


總的來說IMAGE_FILE_HEADER是記錄文件的各種信息的

 

下面說一下IMAGE_OPTIONAL_HEADER結構,他是一個可選結構,是對IMAGE_FILE_HEADER的一個補充,當然很多情況下它是必須的。


typedef struct _IMAGE_OPTIONAL_HEADER
{
//
// Standard fields.
//
+18h WORD Magic; // 標志字, ROM 映像(0107h),普通可執行文件(010Bh)
+1Ah BYTE MajorLinkerVersion; // 鏈接程序的主版本號
+1Bh BYTE MinorLinkerVersion; // 鏈接程序的次版本號
+1Ch DWORD SizeOfCode; // 所有含代碼的節的總大小
+20h DWORD SizeOfInitializedData; // 所有含已初始化數據的節的總大小
+24h DWORD SizeOfUninitializedData; // 所有含未初始化數據的節的大小
+28h DWORD AddressOfEntryPoint; // 程序執行入口RVA
+2Ch DWORD BaseOfCode; // 代碼的區塊的起始RVA
+30h DWORD BaseOfData; // 數據的區塊的起始RVA
//
// NT additional fields. 以下是屬于NT結構增加的領域。
//
+34h DWORD ImageBase; // 程序的首選裝載地址
+38h DWORD SectionAlignment; // 內存中的區塊的對齊大小
+3Ch DWORD FileAlignment; // 文件中的區塊的對齊大小
+40h WORD MajorOperatingSystemVersion; // 要求操作系統最低版本號的主版本號
+42h WORD MinorOperatingSystemVersion; // 要求操作系統最低版本號的副版本號
+44h WORD MajorImageVersion; // 可運行于操作系統的主版本號
+46h WORD MinorImageVersion; // 可運行于操作系統的次版本號
+48h WORD MajorSubsystemVersion; // 要求最低子系統版本的主版本號
+4Ah WORD MinorSubsystemVersion; // 要求最低子系統版本的次版本號
+4Ch DWORD Win32VersionValue; // 莫須有字段,不被病毒利用的話一般為0
+50h DWORD SizeOfImage; // 映像裝入內存后的總尺寸
+54h DWORD SizeOfHeaders; // 所有頭 + 區塊表的尺寸大小
+58h DWORD CheckSum; // 映像的校檢和
+5Ch WORD Subsystem; // 可執行文件期望的子系統
+5Eh WORD DllCharacteristics; // DllMain()函數何時被調用,默認為 0
+60h DWORD SizeOfStackReserve; // 初始化時的棧大小
+64h DWORD SizeOfStackCommit; // 初始化時實際提交的棧大小
+68h DWORD SizeOfHeapReserve; // 初始化時保留的堆大小
+6Ch DWORD SizeOfHeapCommit; // 初始化時實際提交的堆大小
+70h DWORD LoaderFlags; // 與調試有關,默認為 0
+74h DWORD NumberOfRvaAndSizes; // 下邊數據目錄的項數,這個字段自Windows NT 發布以來 // 一直是16
+78h IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
// 數據目錄表
}
IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

這個結構東西各種多啊···非常蛋疼,不過很多都是optional的,可以不用管他們,重要的就那么幾個。

AddressOfEntryPoint 指出文件執行時的入口地址,是一個RVA地址,就是大家常說的OEP,常常各種尋找的OEP,如果你有什么代碼要先于程序主體執行,只需要將這個入口指向這段代碼就行啦~

ImageBase 指向文件的優先裝入地址,一般情況EXE文件不需要重定位,DLL文件可能需要重定位。

Se

ctionAlignment 和 FileAlignment 確定了內存中的節對齊單位和在磁盤中的節對齊單位。

DataDirectory 成員是一個比較牛逼的成員,它由16個IMAGE_DATA_DIRCTORY結構組成,用來定義多種不通用處的數據塊。

這個結構體的內容很簡單

typedef struct _IMAGE_DATA_DIRECTORY {
  DWORD  VirtualAddress; 相對虛擬地址
  DWORD  Size;      大小
}
IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

只有相對虛擬地址和大小兩個成員。

IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

IMAGE_NUMBEROF_DIRECTORY_ENTRIES 的值代表了數據塊的用途

#define IMAGE_DIRECTORY_ENTRY_EXPORT     0  // Export Directory
#define IMAGE_DIRECTORY_ENTRY_IMPORT     1  // Import Directory
#define IMAGE_DIRECTORY_ENTRY_RESOURCE    2  // Resource Directory
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION    3  // Exception Directory
#define IMAGE_DIRECTORY_ENTRY_SECURITY    4  // Security Directory
#define IMAGE_DIRECTORY_ENTRY_BASERELOC    5  // Base Relocation Table
#define IMAGE_DIRECTORY_ENTRY_DEBUG      6  // Debug Directory
//   IMAGE_DIRECTORY_ENTRY_COPYRIGHT    7  // (X86 usage)
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE  7  // Architecture Specific Data
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR    8  // RVA of GP
#define IMAGE_DIRECTORY_ENTRY_TLS       9  // TLS Directory
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG  10  // Load Configuration Directory
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT  11  // Bound Import Directory in headers
#define IMAGE_DIRECTORY_ENTRY_IAT      12  // Import Address Table
#defin e IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT  13  // Delay Load Import Descriptors
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14  // COM Runtime descriptor


最后把這些結構·讀出來看一看。

#include "windows.h"
#include
"stdio.h"

int main(int argc, char* argv[])
{
FILE
*p;
unsigned
long Signature;
IMAGE_FILE_HEADER myfileheader;
IMAGE_DOS_HEADER mydosheader;
IMAGE_OPTIONAL_HEADER myoptionalheader;

p
= fopen("test.exe","r+b");
if(p == NULL)return -1;

fread(
&mydosheader,sizeof(mydosheader),1,p);
fseek(p,mydosheader.e_lfanew,SEEK_SET);
fread(
&Signature,sizeof(Signature),1,p);

fseek(p,mydosheader.e_lfanew
+sizeof(Signature),SEEK_SET);//指向IMAGE_FILE_HEADER結構的偏移
fread(&myfileheader,sizeof(myfileheader),1,p);

fseek(p,mydosheader.e_lfanew
+sizeof(Signature)+sizeof(myfileheader),SEEK_SET);
fread(
&myoptionalheader,sizeof(myoptionalheader),1,p);

printf(
"%X\n",mydosheader.e_lfanew);

printf(
"Signature : %04X\n",Signature);
printf(
"IMAGE_FILE_HEADER結構:\n");
printf(
"Machine : %04X\n",myfileheader.Machine);

printf(
"IMAGE_OPTIONALHEADER_HEADER結構:\n");
printf(
"Magic       : %04X\n",myoptionalheader.Magic);
由于這個IMAGE_OPENTIONAL_HEADER結構成員太多,我就不都打出來了,Magic的值一般為010bH,由此可以判頓讀取出的結構是否正確。
posted on 2012-04-11 15:09 Tiany 閱讀(656) 評論(0)  編輯 收藏 引用 所屬分類: 逆向破解
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产天堂久久国产91| 国产一区二区三区高清在线观看| 另类尿喷潮videofree| 亚洲欧洲一区二区在线观看| 欧美在线一级va免费观看| 亚洲国产精品悠悠久久琪琪| 欧美日韩极品在线观看一区| 亚洲欧美视频在线观看| 亚洲美女91| 亚洲三级免费观看| 欧美高清在线观看| 欧美成人午夜免费视在线看片 | 久久国产一二区| 国产美女诱惑一区二区| 久久国产手机看片| 性8sex亚洲区入口| 亚洲精品综合精品自拍| 亚洲在线播放电影| 亚洲一区二区三区四区视频| 亚洲午夜久久久久久久久电影院| 午夜精品久久久久久 | 国产精品久久久久三级| 国产精品久久久久999| 欧美精品成人| 国产精品毛片在线| 国产主播一区二区三区| 国产欧美婷婷中文| 国产精品天天摸av网| 久久久91精品国产| 欧美成人免费网| 欧美日本免费一区二区三区| 久久天天狠狠| 国产欧美精品在线观看| 亚洲国产1区| 亚洲高清123| 99精品国产在热久久| 久久久国产精彩视频美女艺术照福利| 免费中文日韩| 亚洲一区三区电影在线观看| 亚洲欧美文学| 久久人人爽人人爽爽久久| 欧美va天堂在线| 国产精品久久久久久影院8一贰佰| 亚洲日本视频| 久久久噜噜噜久久中文字免| 亚洲成人在线网站| 久久影院午夜论| 国产精品一区二区三区免费观看| 欧美日韩aaaaa| 99在线|亚洲一区二区| 欧美成人国产| 久久尤物视频| 亚洲二区三区四区| 午夜天堂精品久久久久| 久久精品水蜜桃av综合天堂| 亚洲精品在线观看免费| 免费一区二区三区| 亚洲一区二区三区在线播放| 日韩视频在线免费观看| 免播放器亚洲一区| 激情成人综合| 亚洲一区二区免费看| 一区二区三区在线视频观看| 美脚丝袜一区二区三区在线观看 | 欧美成人一品| 久久久7777| 在线看片一区| 亚洲精品乱码久久久久久| 久久久久欧美| 亚洲精品一区中文| 亚洲午夜在线观看视频在线| 国产精品日韩一区二区三区| 亚洲激情亚洲| 亚洲午夜一区二区| 亚洲国产精品va在线看黑人| 亚洲乱亚洲高清| 1024精品一区二区三区| 91久久国产综合久久91精品网站| 欧美成人午夜激情视频| 久久深夜福利免费观看| 亚洲精品九九| 亚洲精品中文字幕在线观看| 亚洲欧美日韩精品综合在线观看| 一本一本久久a久久精品综合麻豆| 日韩一级黄色片| 亚洲国产欧美一区二区三区丁香婷| 亚洲午夜性刺激影院| 亚洲国产成人在线| 99精品99久久久久久宅男| 精品99一区二区| 亚洲电影免费在线 | 国产精品色午夜在线观看| 一区二区三区无毛| 午夜一区不卡| 久久久精品午夜少妇| 国产精品萝li| 久久国产婷婷国产香蕉| 欧美freesex交免费视频| 亚洲国产精品综合| 欧美日韩美女一区二区| 亚洲欧美日韩在线不卡| 另类春色校园亚洲| 99精品国产99久久久久久福利| 欧美高清视频| 欧美一区二区三区的| 久久综合婷婷| 欧美中日韩免费视频| 韩国女主播一区二区三区| 久久噜噜噜精品国产亚洲综合| 日韩视频在线观看免费| 久久久国产精彩视频美女艺术照福利| 亚洲国产精品v| 在线观看不卡av| 国产综合自拍| 国产自产v一区二区三区c| 国产精品欧美日韩一区| 免费视频一区| 久久一区中文字幕| 久久综合久久美利坚合众国| 欧美一区免费| 久久精品亚洲国产奇米99| 午夜激情综合网| 亚洲永久免费视频| 午夜精品福利在线| 久久国产精品久久久| 久久国产精彩视频| 麻豆av一区二区三区| 鲁鲁狠狠狠7777一区二区| 久久精品毛片| 亚洲一区二区三区在线| 欧美日韩你懂的| 亚洲精品久久久久久久久久久久| 亚洲乱码久久| 欧美华人在线视频| 久久视频在线免费观看| 一区二区三区无毛| 噜噜噜噜噜久久久久久91| 久久午夜国产精品| 免费的成人av| 亚洲深夜福利| 欧美成人精品h版在线观看| 国产精品第三页| 亚洲黄色视屏| 久久久久久国产精品mv| 亚洲国产天堂久久综合网| 亚洲欧美日韩电影| 91久久一区二区| 欧美电影免费观看大全| 狠狠综合久久av一区二区老牛| 夜夜嗨av一区二区三区网站四季av | 国产日韩精品综合网站| 一区二区三区免费看| 亚洲全部视频| 久久五月婷婷丁香社区| 噜噜噜久久亚洲精品国产品小说| 欧美日韩综合不卡| 欧美日韩国产成人在线| 国产无遮挡一区二区三区毛片日本| 国产精品第13页| 欧美大尺度在线| 国产精品电影网站| 极品尤物久久久av免费看| 国产伦精品一区二区三区照片91| 久久高清福利视频| 亚洲欧美中文另类| 亚洲欧美国产另类| 久久国产精品99国产| 欧美主播一区二区三区| 午夜亚洲福利在线老司机| 欧美日韩免费一区| 亚洲欧洲日韩综合二区| 午夜精品久久久久久久久久久久久 | 欧美在线看片| 亚洲精品系列| 亚洲免费小视频| 亚洲国产精品一区二区www| 亚洲精品美女91| 国产日韩综合一区二区性色av| 久久精品国产96久久久香蕉| 欧美成人精品| 母乳一区在线观看| 国产视频久久久久久久| 亚洲黄页一区| 在线精品亚洲一区二区| 亚久久调教视频| 亚洲欧美另类在线观看| 欧美精品亚洲| 亚洲麻豆一区| 99精品国产热久久91蜜凸| 久久久999精品| 久久久久久久综合| 国产精品一区二区三区乱码| 国产精品无码专区在线观看 | 国产在线高清精品| 99在线精品观看| 一区二区三区成人| 欧美激情在线有限公司| 亚洲精品乱码| 亚洲欧美影院| 国产精品视频免费|