Fiddler_001 初始设置

1 下载Fiddler,打开主界面

#coding:utf-8
import requests

url = "http://zzk-s.cnblogs.com/s/blogpost"

par = {
    "Keywords" : "yoyo"
}
h = {
    "Cookie" : "AspxAutoDetectCookieSupport=1"
}
r = requests.get(url, par, headers = h)


#r = requests.get(url, par)

print(r.status_code)    # 1 状态码
print(r.headers)        # 2 头部信息
print(r.text)           # 3 返回正文

  

  1 /*
  2 时间:2016/11/12
  3 功能:移动重定位表 - 新的节段
  4 环境:控制台
  5 */
  6 #include "stdafx.h"
  7 #include <windows.h>
  8 #define IN_FILEPATH            "D:\\1.exe"        // 输入文件路径 
  9 
 10 /*
 11 功能     字节对齐
 12 参数     Num        当前数字    
 13         align    对齐大小
 14 返回     0:    添加失败
 15         !0:    添加成功
 16 */
 17 unsigned int calc_align(unsigned int Num,unsigned align)
 18 {
 19     // 1.1 判断数值 - 已经对齐
 20     if ( Num / align * align == Num)
 21     {
 22         return Num;    
 23     }
 24     
 25     // 2.1 对齐计算
 26     return  (Num / align + 1) * align;
 27 }
 28 
 29 
 30 /*
 31 功能: 读取文件
 32 
 33 参数 lpszFile        文件路径
 34      pFileBuffer    文件指针
 35      
 36 返回 0: 读取失败
 37     !0:    读取字节
 38 */
 39 DWORD ReadPEFile(IN LPSTR lpszFile, OUT LPVOID *pFileBuffer)
 40 {
 41     FILE *pFile = NULL;            // 文件指针
 42     DWORD FileSize = 0;            // 文件大小
 43     LPVOID pFileMalloc = NULL;    // 申请地址
 44 
 45     // 1.0 打开文件
 46     errno_t err;
 47     err = fopen_s(&pFile, lpszFile, "rb");
 48     if (0 != err)
 49     {
 50         printf("无法打开exe文件!\n");
 51         return 0;
 52     }
 53     
 54     
 55     // 2.0 复制文件
 56     // 2.1 读取文件 - 文件大小
 57     fseek(pFile, 0, SEEK_END);    // 指针置尾
 58     FileSize = ftell(pFile);    // 文件大小
 59     fseek(pFile, 0, SEEK_SET);    // 指针置头
 60 
 61     // 2.2 申请空间
 62     pFileMalloc = malloc(FileSize);
 63     if (NULL == pFileMalloc)
 64     {
 65         printf("分配内存失败");
 66         fclose(pFile);
 67         return 0;
 68     }
 69 
 70     // 2.3 复制文件
 71     size_t nReturn = fread(pFileMalloc, FileSize, 1, pFile);
 72     if (NULL == nReturn)
 73     {
 74         printf("读取数据失败");
 75         free(pFileMalloc);
 76         fclose(pFile);
 77         return 0;
 78     }
 79 
 80     *pFileBuffer    = pFileMalloc;    // 返回参数
 81     pFileMalloc        = NULL;            // 指针置空
 82     fclose(pFile);                    // 关闭指针
 83     return FileSize;                // 返回大小
 84 }
 85 
 86 /*
 87 功能     文件转换: Rva - Foa
 88 
 89 参数     pImageBuffer    ImageBuffer指针
 90         dwRva            Rva
 91 
 92 返回     0:    读取失败
 93         !0:    Foa    
 94 */
 95 DWORD RvaToFileOffset(IN LPVOID pImageBuffer, IN DWORD dwRva)
 96 {
 97     PIMAGE_DOS_HEADER pDosHeader            = (PIMAGE_DOS_HEADER)(DWORD)pImageBuffer;
 98     PIMAGE_NT_HEADERS pNtHeader                = (PIMAGE_NT_HEADERS)((DWORD)pImageBuffer + pDosHeader->e_lfanew);
 99     PIMAGE_FILE_HEADER pFileHeader            = (PIMAGE_FILE_HEADER)((DWORD)pNtHeader + sizeof(pNtHeader->Signature));
100     PIMAGE_OPTIONAL_HEADER pOptionHeader    = (PIMAGE_OPTIONAL_HEADER)((DWORD)(pFileHeader) + sizeof(IMAGE_FILE_HEADER));
101     PIMAGE_SECTION_HEADER pSectionHeader    = (PIMAGE_SECTION_HEADER)((DWORD)(pOptionHeader) + pFileHeader->SizeOfOptionalHeader);
102 
103     // 1.0 检查判断
104     // 1.1 判断参数 - 是否有效 
105     if (NULL == pDosHeader)    
106     {
107         printf("pImageBuffer缓冲区指针无效");
108         return 0;
109     }
110 
111     // 1.2 判断标记 - MZ 
112     if (*(PWORD)pDosHeader != IMAGE_DOS_SIGNATURE)
113     {
114         printf("不是有效的MZ标记\n");
115         return 0;
116     }
117 
118     // 1.3 判断标记 - PE
119     if (*(PDWORD)pNtHeader != IMAGE_NT_SIGNATURE)
120     {
121         printf("不是有效的PE标记\n");
122         return 0;
123     }
124 
125     // 2.1 计算地址
126     DWORD OffsetOfSection    = 0;                                            // 偏移大小 - 节段开始
127     PIMAGE_SECTION_HEADER pTempStartSectionHeader    = pSectionHeader;        // 临时指针
128     
129     int nCurrentSection    = 0;                                // 当前位置 - 节目录中
130     int nSizeOfSection    = pFileHeader->NumberOfSections;    // 节的个数
131     while (nCurrentSection < nSizeOfSection)
132     {
133         DWORD nStartAddress    = pTempStartSectionHeader->VirtualAddress;    // 开始地址 - 区段RVA
134         DWORD nEndAddress    = nStartAddress + calc_align(pTempStartSectionHeader->Misc.VirtualSize, 0x1000);    // 临时指针
135         if (dwRva >= nStartAddress && dwRva < nEndAddress)
136         {
137             OffsetOfSection = dwRva - nStartAddress;    // 偏移大小 - 节段开始
138             break;
139         }
140 
141         ++pTempStartSectionHeader;    // 遍历节表
142         ++nCurrentSection;
143     }
144 
145     dwRva = pTempStartSectionHeader->PointerToRawData + OffsetOfSection;    // 计算Foa
146     return dwRva;
147 }
148 
149 /*
150 功能     显示数据: 导入表
151 返回     0:    显示失败
152         !0:    显示成功
153 */
154 BOOL PrintImport()
155 {
156     // 1.0 数据转换
157     // 1.1 读取文件: 磁盘文件 - pFileBuffer
158     LPVOID pFileBuffer = NULL;
159     ReadPEFile(IN_FILEPATH, &pFileBuffer);
160     if (NULL == pFileBuffer)
161     {
162         printf("磁盘文件 - pFileBuffer失败");
163         return FALSE;
164     }
165 
166 
167     // 2.0 显示信息 - 导入表
168     // 2.1 初始数据
169     PIMAGE_DOS_HEADER pDosHeader            = (PIMAGE_DOS_HEADER)(DWORD)pFileBuffer;
170     PIMAGE_NT_HEADERS pNtHeader                = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer + pDosHeader->e_lfanew);
171     PIMAGE_FILE_HEADER pFileHeader            = (PIMAGE_FILE_HEADER)((DWORD)pNtHeader + sizeof(pNtHeader->Signature));
172     PIMAGE_OPTIONAL_HEADER pOptionHeader    = (PIMAGE_OPTIONAL_HEADER)((DWORD)(pFileHeader) + sizeof(IMAGE_FILE_HEADER));
173     PIMAGE_SECTION_HEADER pSectionHeader    = (PIMAGE_SECTION_HEADER)((DWORD)(pOptionHeader) + pFileHeader->SizeOfOptionalHeader);
174 
175     // 2.2 RvaToFoa - 导入表
176     DWORD RvaOfImport                            = pOptionHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;    // RVA - 导入表
177     DWORD FoaOfImport                            = RvaToFileOffset(pFileBuffer, RvaOfImport);                                    // FOA - 导入表
178     PIMAGE_IMPORT_DESCRIPTOR pImprotDirectory    = (PIMAGE_IMPORT_DESCRIPTOR)(FoaOfImport + (DWORD)pDosHeader);                    // 获取地址 - 导入表
179 
180     // 2.3 打印信息 - 导入表
181     PIMAGE_IMPORT_DESCRIPTOR pTempImprotDirectory    = pImprotDirectory;
182 
183     // 2.4 循环遍历 - 导入表
184     while (0 != pTempImprotDirectory->FirstThunk && 0 != pTempImprotDirectory->OriginalFirstThunk)
185     {
186         // 2.4.1 显示名称 - dll名称
187         DWORD FoaName = RvaToFileOffset(pFileBuffer,pTempImprotDirectory->Name);
188         printf("%s\n", (DWORD)pDosHeader + FoaName);
189 
190         // 2.4.2 初始化 - INT表
191         DWORD RvaInt            = pTempImprotDirectory->OriginalFirstThunk;            // RVA - Int表
192         DWORD FoaInt            = RvaToFileOffset(pFileBuffer, RvaInt);                // FOA - Int表
193         PIMAGE_THUNK_DATA pInt    = (PIMAGE_THUNK_DATA)(FoaInt + (DWORD)pDosHeader);    // 获取地址 - Int表
194 
195         // 2.4.3 循环遍历 - INT表
196         while (0 != pInt->u1.ForwarderString)
197         {
198             DWORD Contrast = pInt->u1.ForwarderString & 0x80000000;    // 保留位数 - 最高一位
199             if (0x80000000 == Contrast)
200             {
201                 DWORD Num = pInt->u1.ForwarderString & 0x7FFFFFFF;    // 除去位数 - 最高一位
202                 printf("序号导入: %d\n", Num);
203             }
204             else
205             {
206                 DWORD RvaIntName                = pInt->u1.ForwarderString;                                    // RVA - Int名称
207                 DWORD FoaIntName                = RvaToFileOffset(pFileBuffer, RvaIntName);                    // FOA - Int名称
208                 PIMAGE_IMPORT_BY_NAME pIntName    = (PIMAGE_IMPORT_BY_NAME)(FoaIntName + (DWORD)pDosHeader);    // 获取地址 - Int名称
209                 printf("名称导入: %d - %s\n", pIntName->Hint, pIntName->Name);                                // 显示名称 - 导入函数
210             }    
211 
212             ++pInt;    // 循环递增 - Int表
213         }
214 
215         ++pTempImprotDirectory; // 循环递增- 导入表
216     }
217 
218     return TRUE;
219 }
220 
221 
222 int _tmain(int argc, _TCHAR* argv[])
223 {
224     PrintImport();    // 打印导出表
225 
226     return 0;
227 }
View Code
  1 /*
  2 时间:2016/11/12
  3 功能:移动重定位表 - 新的节段
  4 环境:控制台
  5 */
  6 #include "stdafx.h"
  7 #include <windows.h>
  8 #define IN_FILEPATH            "D:\\1.exe"        // 输入文件路径 
  9 
 10 /*
 11 功能     字节对齐
 12 参数     Num        当前数字    
 13         align    对齐大小
 14 返回     0:    添加失败
 15         !0:    添加成功
 16 */
 17 unsigned int calc_align(unsigned int Num,unsigned align)
 18 {
 19     // 1.1 判断数值 - 已经对齐
 20     if ( Num / align * align == Num)
 21     {
 22         return Num;    
 23     }
 24     
 25     // 2.1 对齐计算
 26     return  (Num / align + 1) * align;
 27 }
 28 
 29 
 30 /*
 31 功能: 读取文件
 32 
 33 参数 lpszFile        文件路径
 34      pFileBuffer    文件指针
 35      
 36 返回 0: 读取失败
 37     !0:    读取字节
 38 */
 39 DWORD ReadPEFile(IN LPSTR lpszFile, OUT LPVOID *pFileBuffer)
 40 {
 41     FILE *pFile = NULL;            // 文件指针
 42     DWORD FileSize = 0;            // 文件大小
 43     LPVOID pFileMalloc = NULL;    // 申请地址
 44 
 45     // 1.0 打开文件
 46     errno_t err;
 47     err = fopen_s(&pFile, lpszFile, "rb");
 48     if (0 != err)
 49     {
 50         printf("无法打开exe文件!\n");
 51         return 0;
 52     }
 53     
 54     
 55     // 2.0 复制文件
 56     // 2.1 读取文件 - 文件大小
 57     fseek(pFile, 0, SEEK_END);    // 指针置尾
 58     FileSize = ftell(pFile);    // 文件大小
 59     fseek(pFile, 0, SEEK_SET);    // 指针置头
 60 
 61     // 2.2 申请空间
 62     pFileMalloc = malloc(FileSize);
 63     if (NULL == pFileMalloc)
 64     {
 65         printf("分配内存失败");
 66         fclose(pFile);
 67         return 0;
 68     }
 69 
 70     // 2.3 复制文件
 71     size_t nReturn = fread(pFileMalloc, FileSize, 1, pFile);
 72     if (NULL == nReturn)
 73     {
 74         printf("读取数据失败");
 75         free(pFileMalloc);
 76         fclose(pFile);
 77         return 0;
 78     }
 79 
 80     *pFileBuffer    = pFileMalloc;    // 返回参数
 81     pFileMalloc        = NULL;            // 指针置空
 82     fclose(pFile);                    // 关闭指针
 83     return FileSize;                // 返回大小
 84 }
 85 
 86 
 87 /*
 88 功能     文件转换: Rva - Foa
 89 
 90 参数     pImageBuffer    ImageBuffer指针
 91         dwRva            Rva
 92 
 93 返回     0:    读取失败
 94         !0:    Foa    
 95 */
 96 DWORD RvaToFileOffset(IN LPVOID pImageBuffer, IN DWORD dwRva)
 97 {
 98     PIMAGE_DOS_HEADER pDosHeader            = (PIMAGE_DOS_HEADER)(DWORD)pImageBuffer;
 99     PIMAGE_NT_HEADERS pNtHeader                = (PIMAGE_NT_HEADERS)((DWORD)pImageBuffer + pDosHeader->e_lfanew);
100     PIMAGE_FILE_HEADER pFileHeader            = (PIMAGE_FILE_HEADER)((DWORD)pNtHeader + sizeof(pNtHeader->Signature));
101     PIMAGE_OPTIONAL_HEADER pOptionHeader    = (PIMAGE_OPTIONAL_HEADER)((DWORD)(pFileHeader) + sizeof(IMAGE_FILE_HEADER));
102     PIMAGE_SECTION_HEADER pSectionHeader    = (PIMAGE_SECTION_HEADER)((DWORD)(pOptionHeader) + pFileHeader->SizeOfOptionalHeader);
103 
104     // 1.0 检查判断
105     // 1.1 判断参数 - 是否有效 
106     if (NULL == pDosHeader)    
107     {
108         printf("pImageBuffer缓冲区指针无效");
109         return 0;
110     }
111 
112     // 1.2 判断标记 - MZ 
113     if (*(PWORD)pDosHeader != IMAGE_DOS_SIGNATURE)
114     {
115         printf("不是有效的MZ标记\n");
116         return 0;
117     }
118 
119     // 1.3 判断标记 - PE
120     if (*(PDWORD)pNtHeader != IMAGE_NT_SIGNATURE)
121     {
122         printf("不是有效的PE标记\n");
123         return 0;
124     }
125 
126     // 2.1 计算地址
127     DWORD OffsetOfSection    = 0;                                            // 偏移大小 - 节段开始
128     PIMAGE_SECTION_HEADER pTempStartSectionHeader    = pSectionHeader;        // 临时指针
129     
130     int nCurrentSection    = 0;                                // 当前位置 - 节目录中
131     int nSizeOfSection    = pFileHeader->NumberOfSections;    // 节的个数
132     while (nCurrentSection < nSizeOfSection)
133     {
134         DWORD nStartAddress    = pTempStartSectionHeader->VirtualAddress;    // 开始地址 - 区段RVA
135         DWORD nEndAddress    = nStartAddress + calc_align(pTempStartSectionHeader->Misc.VirtualSize, 0x1000);    // 临时指针
136         if (dwRva >= nStartAddress && dwRva < nEndAddress)
137         {
138             OffsetOfSection = dwRva - nStartAddress;    // 偏移大小 - 节段开始
139             break;
140         }
141 
142         ++pTempStartSectionHeader;    // 遍历节表
143         ++nCurrentSection;
144     }
145 
146     dwRva = pTempStartSectionHeader->PointerToRawData + OffsetOfSection;    // 计算Foa
147     return dwRva;
148 }
149 
150 /*
151 功能     显示数据: 导入表
152 返回     0:    显示失败
153         !0:    显示成功
154 */
155 BOOL PrintImport()
156 {
157     // 1.0 数据转换
158     // 1.1 读取文件: 磁盘文件 - pFileBuffer
159     LPVOID pFileBuffer = NULL;
160     ReadPEFile(IN_FILEPATH, &pFileBuffer);
161     if (NULL == pFileBuffer)
162     {
163         printf("磁盘文件 - pFileBuffer失败");
164         return FALSE;
165     }
166 
167 
168     // 2.0 显示信息 - 导入表
169     // 2.1 初始数据
170     PIMAGE_DOS_HEADER pDosHeader            = (PIMAGE_DOS_HEADER)(DWORD)pFileBuffer;
171     PIMAGE_NT_HEADERS pNtHeader                = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer + pDosHeader->e_lfanew);
172     PIMAGE_FILE_HEADER pFileHeader            = (PIMAGE_FILE_HEADER)((DWORD)pNtHeader + sizeof(pNtHeader->Signature));
173     PIMAGE_OPTIONAL_HEADER pOptionHeader    = (PIMAGE_OPTIONAL_HEADER)((DWORD)(pFileHeader) + sizeof(IMAGE_FILE_HEADER));
174     PIMAGE_SECTION_HEADER pSectionHeader    = (PIMAGE_SECTION_HEADER)((DWORD)(pOptionHeader) + pFileHeader->SizeOfOptionalHeader);
175 
176     // 2.2 RvaToFoa - 导入表
177     DWORD RvaOfImport                            = pOptionHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;    // RVA - 导入表
178     DWORD FoaOfImport                            = RvaToFileOffset(pFileBuffer, RvaOfImport);                                    // FOA - 导入表
179     PIMAGE_IMPORT_DESCRIPTOR pImprotDirectory    = (PIMAGE_IMPORT_DESCRIPTOR)(FoaOfImport + (DWORD)pDosHeader);                    // 获取地址 - 导入表
180 
181     // 2.3 打印信息 - 导入表
182     PIMAGE_IMPORT_DESCRIPTOR pTempImprotDirectory    = pImprotDirectory;
183 
184     // 2.4 循环遍历 - 导入表
185     while (0 != pTempImprotDirectory->FirstThunk && 0 != pTempImprotDirectory->OriginalFirstThunk)
186     {
187         // 2.4.1 显示名称 - dll名称
188         DWORD FoaName = RvaToFileOffset(pFileBuffer,pTempImprotDirectory->Name);
189         printf("%s\n", (DWORD)pDosHeader + FoaName);
190 
191         // 2.4.2 初始化 - INT表
192         DWORD RvaInt            = pTempImprotDirectory->OriginalFirstThunk;            // RVA - Int表
193         DWORD FoaInt            = RvaToFileOffset(pFileBuffer, RvaInt);                // FOA - Int表
194         PIMAGE_THUNK_DATA pInt    = (PIMAGE_THUNK_DATA)(FoaInt + (DWORD)pDosHeader);    // 获取地址 - Int表
195 
196         // 2.4.3 循环遍历 - INT表
197         while (0 != pInt->u1.ForwarderString)
198         {
199             DWORD Contrast = pInt->u1.ForwarderString & 0x80000000;    // 保留位数 - 最高一位
200             if (0x80000000 == Contrast)
201             {
202                 DWORD Num = pInt->u1.ForwarderString & 0x7FFFFFFF;    // 除去位数 - 最高一位
203                 printf("序号导入: %d\n", Num);
204             }
205             else
206             {
207                 DWORD RvaIntName                = pInt->u1.ForwarderString;                                    // RVA - Int名称
208                 DWORD FoaIntName                = RvaToFileOffset(pFileBuffer, RvaIntName);                    // FOA - Int名称
209                 PIMAGE_IMPORT_BY_NAME pIntName    = (PIMAGE_IMPORT_BY_NAME)(FoaIntName + (DWORD)pDosHeader);    // 获取地址 - Int名称
210                 printf("名称导入: %d - %s\n", pIntName->Hint, pIntName->Name);                                // 显示名称 - 导入函数
211             }    
212 
213             ++pInt;    // 循环递增 - Int表
214         }
215 
216         ++pTempImprotDirectory; // 循环递增- 导入表
217     }
218 
219     return TRUE;
220 }
221 
222 
223 int _tmain(int argc, _TCHAR* argv[])
224 {
225     PrintImport();    // 打印导出表
226 
227     return 0;
228 }
View Code : 移动重定位表 - 新的节段
  1 /*
  2 时间:2016/11/12
  3 功能:移动重定位表 - 新的节段
  4 环境:控制台
  5 */
  6 #include "stdafx.h"
  7 #include <windows.h>
  8 #define IN_FILEPATH            "D:\\1.exe"        // 输入文件路径 
  9 
 10 /*
 11 功能     字节对齐
 12 参数     Num        当前数字    
 13         align    对齐大小
 14 返回     0:    添加失败
 15         !0:    添加成功
 16 */
 17 unsigned int calc_align(unsigned int Num,unsigned align)
 18 {
 19     // 1.1 判断数值 - 已经对齐
 20     if ( Num / align * align == Num)
 21     {
 22         return Num;    
 23     }
 24     
 25     // 2.1 对齐计算
 26     return  (Num / align + 1) * align;
 27 }
 28 
 29 
 30 /*
 31 功能: 读取文件
 32 
 33 参数 lpszFile        文件路径
 34      pFileBuffer    文件指针
 35      
 36 返回 0: 读取失败
 37     !0:    读取字节
 38 */
 39 DWORD ReadPEFile(IN LPSTR lpszFile, OUT LPVOID *pFileBuffer)
 40 {
 41     FILE *pFile = NULL;            // 文件指针
 42     DWORD FileSize = 0;            // 文件大小
 43     LPVOID pFileMalloc = NULL;    // 申请地址
 44 
 45     // 1.0 打开文件
 46     errno_t err;
 47     err = fopen_s(&pFile, lpszFile, "rb");
 48     if (0 != err)
 49     {
 50         printf("无法打开exe文件!\n");
 51         return 0;
 52     }
 53     
 54     
 55     // 2.0 复制文件
 56     // 2.1 读取文件 - 文件大小
 57     fseek(pFile, 0, SEEK_END);    // 指针置尾
 58     FileSize = ftell(pFile);    // 文件大小
 59     fseek(pFile, 0, SEEK_SET);    // 指针置头
 60 
 61     // 2.2 申请空间
 62     pFileMalloc = malloc(FileSize);
 63     if (NULL == pFileMalloc)
 64     {
 65         printf("分配内存失败");
 66         fclose(pFile);
 67         return 0;
 68     }
 69 
 70     // 2.3 复制文件
 71     size_t nReturn = fread(pFileMalloc, FileSize, 1, pFile);
 72     if (NULL == nReturn)
 73     {
 74         printf("读取数据失败");
 75         free(pFileMalloc);
 76         fclose(pFile);
 77         return 0;
 78     }
 79 
 80     *pFileBuffer    = pFileMalloc;    // 返回参数
 81     pFileMalloc        = NULL;            // 指针置空
 82     fclose(pFile);                    // 关闭指针
 83     return FileSize;                // 返回大小
 84 }
 85 
 86 /*
 87 功能     文件转换: Rva - Foa
 88 
 89 参数     pImageBuffer    ImageBuffer指针
 90         dwRva            Rva
 91 
 92 返回     0:    读取失败
 93         !0:    Foa    
 94 */
 95 DWORD RvaToFileOffset(IN LPVOID pImageBuffer, IN DWORD dwRva)
 96 {
 97     PIMAGE_DOS_HEADER pDosHeader            = (PIMAGE_DOS_HEADER)(DWORD)pImageBuffer;
 98     PIMAGE_NT_HEADERS pNtHeader                = (PIMAGE_NT_HEADERS)((DWORD)pImageBuffer + pDosHeader->e_lfanew);
 99     PIMAGE_FILE_HEADER pFileHeader            = (PIMAGE_FILE_HEADER)((DWORD)pNtHeader + sizeof(pNtHeader->Signature));
100     PIMAGE_OPTIONAL_HEADER pOptionHeader    = (PIMAGE_OPTIONAL_HEADER)((DWORD)(pFileHeader) + sizeof(IMAGE_FILE_HEADER));
101     PIMAGE_SECTION_HEADER pSectionHeader    = (PIMAGE_SECTION_HEADER)((DWORD)(pOptionHeader) + pFileHeader->SizeOfOptionalHeader);
102 
103     // 1.0 检查判断
104     // 1.1 判断参数 - 是否有效 
105     if (NULL == pDosHeader)    
106     {
107         printf("pImageBuffer缓冲区指针无效");
108         return 0;
109     }
110 
111     // 1.2 判断标记 - MZ 
112     if (*(PWORD)pDosHeader != IMAGE_DOS_SIGNATURE)
113     {
114         printf("不是有效的MZ标记\n");
115         return 0;
116     }
117 
118     // 1.3 判断标记 - PE
119     if (*(PDWORD)pNtHeader != IMAGE_NT_SIGNATURE)
120     {
121         printf("不是有效的PE标记\n");
122         return 0;
123     }
124 
125     // 2.1 计算地址
126     DWORD OffsetOfSection    = 0;                                            // 偏移大小 - 节段开始
127     PIMAGE_SECTION_HEADER pTempStartSectionHeader    = pSectionHeader;        // 临时指针
128     
129     int nCurrentSection    = 0;                                // 当前位置 - 节目录中
130     int nSizeOfSection    = pFileHeader->NumberOfSections;    // 节的个数
131     while (nCurrentSection < nSizeOfSection)
132     {
133         DWORD nStartAddress    = pTempStartSectionHeader->VirtualAddress;    // 开始地址 - 区段RVA
134         DWORD nEndAddress    = nStartAddress + calc_align(pTempStartSectionHeader->Misc.VirtualSize, 0x1000);    // 临时指针
135         if (dwRva >= nStartAddress && dwRva < nEndAddress)
136         {
137             OffsetOfSection = dwRva - nStartAddress;    // 偏移大小 - 节段开始
138             break;
139         }
140 
141         ++pTempStartSectionHeader;    // 遍历节表
142         ++nCurrentSection;
143     }
144 
145     dwRva = pTempStartSectionHeader->PointerToRawData + OffsetOfSection;    // 计算Foa
146     return dwRva;
147 }
148 
149 /*
150 功能     显示数据: 导入表
151 返回     0:    显示失败
152         !0:    显示成功
153 */
154 BOOL PrintImport()
155 {
156     // 1.0 数据转换
157     // 1.1 读取文件: 磁盘文件 - pFileBuffer
158     LPVOID pFileBuffer = NULL;
159     ReadPEFile(IN_FILEPATH, &pFileBuffer);
160     if (NULL == pFileBuffer)
161     {
162         printf("磁盘文件 - pFileBuffer失败");
163         return FALSE;
164     }
165 
166 
167     // 2.0 显示信息 - 导入表
168     // 2.1 初始数据
169     PIMAGE_DOS_HEADER pDosHeader            = (PIMAGE_DOS_HEADER)(DWORD)pFileBuffer;
170     PIMAGE_NT_HEADERS pNtHeader                = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer + pDosHeader->e_lfanew);
171     PIMAGE_FILE_HEADER pFileHeader            = (PIMAGE_FILE_HEADER)((DWORD)pNtHeader + sizeof(pNtHeader->Signature));
172     PIMAGE_OPTIONAL_HEADER pOptionHeader    = (PIMAGE_OPTIONAL_HEADER)((DWORD)(pFileHeader) + sizeof(IMAGE_FILE_HEADER));
173     PIMAGE_SECTION_HEADER pSectionHeader    = (PIMAGE_SECTION_HEADER)((DWORD)(pOptionHeader) + pFileHeader->SizeOfOptionalHeader);
174 
175     // 2.2 RvaToFoa - 导入表
176     DWORD RvaOfImport                            = pOptionHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;    // RVA - 导入表
177     DWORD FoaOfImport                            = RvaToFileOffset(pFileBuffer, RvaOfImport);                                    // FOA - 导入表
178     PIMAGE_IMPORT_DESCRIPTOR pImprotDirectory    = (PIMAGE_IMPORT_DESCRIPTOR)(FoaOfImport + (DWORD)pDosHeader);                    // 获取地址 - 导入表
179 
180     // 2.3 打印信息 - 导入表
181     PIMAGE_IMPORT_DESCRIPTOR pTempImprotDirectory    = pImprotDirectory;
182 
183     // 2.4 循环遍历 - 导入表
184     while (0 != pTempImprotDirectory->FirstThunk && 0 != pTempImprotDirectory->OriginalFirstThunk)
185     {
186         // 2.4.1 显示名称 - dll名称
187         DWORD FoaName = RvaToFileOffset(pFileBuffer,pTempImprotDirectory->Name);
188         printf("%s\n", (DWORD)pDosHeader + FoaName);
189 
190         // 2.4.2 初始化 - INT表
191         DWORD RvaInt            = pTempImprotDirectory->OriginalFirstThunk;            // RVA - Int表
192         DWORD FoaInt            = RvaToFileOffset(pFileBuffer, RvaInt);                // FOA - Int表
193         PIMAGE_THUNK_DATA pInt    = (PIMAGE_THUNK_DATA)(FoaInt + (DWORD)pDosHeader);    // 获取地址 - Int表
194 
195         // 2.4.3 循环遍历 - INT表
196         while (0 != pInt->u1.ForwarderString)
197         {
198             DWORD Contrast = pInt->u1.ForwarderString & 0x80000000;    // 保留位数 - 最高一位
199             if (0x80000000 == Contrast)
200             {
201                 DWORD Num = pInt->u1.ForwarderString & 0x7FFFFFFF;    // 除去位数 - 最高一位
202                 printf("序号导入: %d\n", Num);
203             }
204             else
205             {
206                 DWORD RvaIntName                = pInt->u1.ForwarderString;                                    // RVA - Int名称
207                 DWORD FoaIntName                = RvaToFileOffset(pFileBuffer, RvaIntName);                    // FOA - Int名称
208                 PIMAGE_IMPORT_BY_NAME pIntName    = (PIMAGE_IMPORT_BY_NAME)(FoaIntName + (DWORD)pDosHeader);    // 获取地址 - Int名称
209                 printf("名称导入: %d - %s\n", pIntName->Hint, pIntName->Name);                                // 显示名称 - 导入函数
210             }    
211 
212             ++pInt;    // 循环递增 - Int表
213         }
214 
215         ++pTempImprotDirectory; // 循环递增- 导入表
216     }
217 
218     return TRUE;
219 }
220 
221 
222 int _tmain(int argc, _TCHAR* argv[])
223 {
224     PrintImport();    // 打印导出表
225 
226     return 0;
227 }

猜你喜欢

转载自www.cnblogs.com/huafan/p/9380357.html