引导型网站设计个人主题网站做的步骤
news/
2025/9/22 17:19:44/
文章来源:
引导型网站设计,个人主题网站做的步骤,荆州哪个公司做网站,多少钱一个文章目录 前言一、什么是Windows PE格式中的导入表#xff1f;二、解析导入表并显示1.导入表的结构2.解析导入表3.显示导入表 前言
通过分析和解析Windows PE格式#xff0c;并使用qt进行图形化显示 一、什么是Windows PE格式中的导入表#xff1f;
在Windows中#xff0… 文章目录 前言一、什么是Windows PE格式中的导入表二、解析导入表并显示1.导入表的结构2.解析导入表3.显示导入表 前言
通过分析和解析Windows PE格式并使用qt进行图形化显示 一、什么是Windows PE格式中的导入表
在Windows中PE文件格式中的导入表Import Table是一个关键的数据结构它记录了程序在运行时所需调用的外部动态链接库DLL中的函数和变量。导入表的主要作用是在程序加载时帮助操作系统定位并加载这些外部库以便程序能够正确地调用其中的函数和访问变量。
导入表由一系列_IMAGE_IMPORT_DESCRIPTOR结构组成每个结构都包含一个指向外部库的导入地址表Import Address TableIAT的指针。IAT是一个包含函数名和对应函数地址的列表它提供了程序在运行时查找和调用外部库函数所需的信息。 当程序被加载到内存中时操作系统会使用导入表中的信息来解析IAT从而将外部库的函数地址填充到正确的位置。这样当程序调用一个外部库函数时它可以通过IAT直接找到正确的函数地址并执行相应的操作。
总之PE文件格式中的导入表是连接程序与外部动态链接库的关键桥梁它确保了程序在运行时能够正确地调用外部库中的函数和访问变量。
二、解析导入表并显示
1.导入表的结构 导入表的结构如下 IMAGE_IMPORT_DESCRIPTOR结构数组这是一个可变长度的数组每个元素描述一个导入的模块。数组的最后一个元素的所有字段都为零表示数组的结束。 struct IMAGE_IMPORT_DESCRIPTOR {union {DWORD Characteristics;DWORD OriginalFirstThunk;};DWORD TimeDateStamp;DWORD ForwarderChain;DWORD Name;DWORD FirstThunk;
};每个IMAGE_IMPORT_DESCRIPTOR结构包含以下字段 OriginalFirstThunk指向一个IMAGE_THUNK_DATA结构数组该数组包含了导入函数的原始名称或序号。 TimeDateStamp时间戳表示导入表的创建时间。如果此值为零表示导入表未被绑定。 ForwarderChain链表的前一个结构的索引用于处理转发器导入。 Name以null结尾的字符串表示导入的模块名称。 FirstThunk指向一个IMAGE_THUNK_DATA结构数组该数组包含了导入函数的序号或地址。 IMAGE_THUNK_DATA结构这个结构表示一个导入函数的信息。它的大小取决于操作系统32位或64位。 对于32位系统IMAGE_THUNK_DATA结构定义如下 typedef struct _IMAGE_THUNK_DATA32 {union {DWORD ForwarderString;DWORD Function;DWORD Ordinal;DWORD AddressOfData;} u1;
} IMAGE_THUNK_DATA32, *PIMAGE_THUNK_DATA32;对于64位系统IMAGE_THUNK_DATA结构定义如下 typedef struct _IMAGE_THUNK_DATA64 {union {ULONGLONG ForwarderString;ULONGLONG Function;ULONGLONG Ordinal;ULONGLONG AddressOfData;} u1;
} IMAGE_THUNK_DATA64, *PIMAGE_THUNK_DATA64;2.解析导入表
bool PEParser::parserFileData(const QByteArray fileData)
{//判断是否是MZ开头的文件if (fileData.left(2) ! MZ){return false;}//解析DOS头parserDOSHeader(fileData.left(sizeof(IMAGE_DOS_HEADER)));//DOSStub数据m_dosStubData fileData.mid(sizeof(IMAGE_DOS_HEADER), m_dosHeader.e_lfanew - sizeof(IMAGE_DOS_HEADER));long peAddress m_dosHeader.e_lfanew;if (fileData.mid(peAddress, 2) ! PE){return false;}m_fileData fileData;//去除前4个字节的PE头标识long fileHeaderIndex peAddress 4;//记录文件头索引m_fileHeaderIndex fileHeaderIndex;//解析标准PE文件头paserFileHeader(fileData.mid(fileHeaderIndex, sizeof(IMAGE_FILE_HEADER)));//解析扩展PE文件头long optionHeaderIndex fileHeaderIndex sizeof(IMAGE_FILE_HEADER);//记录扩展PE文件头索引m_optionHeaderIndex optionHeaderIndex;//解析扩展PE文件头parserOptionHeader(fileData.mid(optionHeaderIndex, m_fileHeader.SizeOfOptionalHeader));//解析节表long sectionHeaderIndex optionHeaderIndex m_fileHeader.SizeOfOptionalHeader;//节表结构在文件中开始的偏移m_sectionHeaderIndex sectionHeaderIndex;//解析节表parserSectionHeader(fileData.mid(sectionHeaderIndex,m_fileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER)));//解析数据目录parserDataDirectory();//解析导出表parserExportTable();//解析导入表parserImportTable();return true;
}void PEParser::parserImportTable()
{DWORD address 0;int iatSize 0;if (m_x86Flag){address m_optionalHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;iatSize sizeof(IMAGE_THUNK_DATA32);}else{address m_optionalHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;iatSize sizeof(IMAGE_THUNK_DATA64);}QListImportTableInfo importTable;RVA2FOAInfo info RVA2FOA(address);int i 0;char endFlag[20] {0};while (1){ImportTableInfo tableInfo{};//获取导入表数据IMAGE_IMPORT_DESCRIPTOR table;memcpy(table, m_fileData.data() info.FOA i * sizeof(IMAGE_IMPORT_DESCRIPTOR), sizeof(IMAGE_IMPORT_DESCRIPTOR));//20个0 导入表结束if (memcmp(table, endFlag, sizeof(endFlag)) 0){break;}RVA2FOAInfo nameInfo RVA2FOA(table.Name);int index m_fileData.indexOf(\0, nameInfo.FOA);//获取dll名称tableInfo.dllName m_fileData.mid(nameInfo.FOA, index - nameInfo.FOA);tableInfo.originalFirstThunk table.OriginalFirstThunk;tableInfo.forwarderChain table.ForwarderChain;tableInfo.name table.Name;tableInfo.timeDateStamp table.TimeDateStamp;tableInfo.firstThunk table.FirstThunk;RVA2FOAInfo originalFirstThunkInfo RVA2FOA(table.OriginalFirstThunk);RVA2FOAInfo firstThunkInfo RVA2FOA(table.FirstThunk);int j 0;while (1){ThunkInfo thunkInfo{};memcpy(thunkInfo.thunkValue, m_fileData.data() firstThunkInfo.FOA j * iatSize, iatSize);//IAT表结束if (thunkInfo.thunkValue 0){break;}memcpy(thunkInfo.thunkRVA, m_fileData.data() originalFirstThunkInfo.FOA j * iatSize, iatSize);//最高位为1 表示函数导出序号if (thunkInfo.thunkRVA 0X80000000){thunkInfo.functionName QString::number(thunkInfo.thunkRVA - 0X80000000).toUtf8();}else{//获取函数名称RVA2FOAInfo functionNameInfo RVA2FOA(thunkInfo.thunkRVA);thunkInfo.thunkFOA functionNameInfo.FOA;memcpy(thunkInfo.hint, m_fileData.data() functionNameInfo.FOA, sizeof(WORD));int functionNameFOA functionNameInfo.FOA sizeof(WORD);index m_fileData.indexOf(\0, functionNameFOA);thunkInfo.functionName m_fileData.mid(functionNameFOA, index - functionNameFOA);}tableInfo.thunkList.append(thunkInfo);j;}importTable.append(tableInfo);i;}emit sendImportTable(importTable);
}3.显示导入表
void MainWindow::showImportTable(const QListImportTableInfo importTable)
{ui-tableWidget_importTable-clearContents();ui-tableWidget_importTable-setRowCount(0);for (int i 0; i importTable.size(); i){ui-tableWidget_importTable-insertRow(i);ui-tableWidget_importTable-setItem(i, 0, new QTableWidgetItem(importTable[i].dllName));QTableWidgetItem *item ui-tableWidget_importTable-item(i, 0);item-setData(100, QVariant::fromValue(importTable[i]));ui-tableWidget_importTable-setItem(i, 1, new QTableWidgetItem(QString::asprintf(%d, importTable[i].thunkList.size())));ui-tableWidget_importTable-setItem(i, 2, new QTableWidgetItem(QString::asprintf(%08lX, importTable[i].originalFirstThunk)));ui-tableWidget_importTable-setItem(i, 3, new QTableWidgetItem(QString::asprintf(%08lX, importTable[i].timeDateStamp)));ui-tableWidget_importTable-setItem(i, 4, new QTableWidgetItem(QString::asprintf(%08lX, importTable[i].forwarderChain)));ui-tableWidget_importTable-setItem(i, 5, new QTableWidgetItem(QString::asprintf(%08lX, importTable[i].firstThunk)));}
}void MainWindow::on_tableWidget_importTable_clicked(const QModelIndex index)
{if (ui-tableWidget_importTable-rowCount() index.row()){QTableWidgetItem *item ui-tableWidget_importTable-item(index.row(), 0);ImportTableInfo info item-data(100).valueImportTableInfo();ui-tableWidget_iatTable-clearContents();ui-tableWidget_iatTable-setRowCount(0);for (int i 0; i info.thunkList.size(); i){ui-tableWidget_iatTable-insertRow(i);ui-tableWidget_iatTable-setItem(i, 0, new QTableWidgetItem(QString::asprintf(%016llX, info.thunkList[i].thunkValue)));ui-tableWidget_iatTable-setItem(i, 1, new QTableWidgetItem(QString::asprintf(%016llX, info.thunkList[i].thunkRVA)));ui-tableWidget_iatTable-setItem(i, 2, new QTableWidgetItem(QString::asprintf(%016llX, info.thunkList[i].hint)));ui-tableWidget_iatTable-setItem(i, 3, new QTableWidgetItem(info.thunkList[i].functionName));}}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909782.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!