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 }
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 }
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 }