当前位置: 首页 > news >正文

用html做网站搜索框公众号开发合同

用html做网站搜索框,公众号开发合同,福田网站建设联系电话,帮人做非法网站吗文章目录 前言一、什么是Windows PE格式中的导入表?二、解析导入表并显示1.导入表的结构2.解析导入表3.显示导入表 前言 通过分析和解析Windows PE格式,并使用qt进行图形化显示 一、什么是Windows PE格式中的导入表? 在Windows中&#xff0…

文章目录

  • 前言
  • 一、什么是Windows PE格式中的导入表?
  • 二、解析导入表并显示
    • 1.导入表的结构
    • 2.解析导入表
    • 3.显示导入表


前言

通过分析和解析Windows PE格式,并使用qt进行图形化显示


一、什么是Windows PE格式中的导入表?

在Windows中,PE文件格式中的导入表(Import Table)是一个关键的数据结构,它记录了程序在运行时所需调用的外部动态链接库(DLL)中的函数和变量。导入表的主要作用是在程序加载时,帮助操作系统定位并加载这些外部库,以便程序能够正确地调用其中的函数和访问变量。

导入表由一系列_IMAGE_IMPORT_DESCRIPTOR结构组成,每个结构都包含一个指向外部库的导入地址表(Import Address Table,IAT)的指针。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);}QList<ImportTableInfo> 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 QList<ImportTableInfo> &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).value<ImportTableInfo>();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.yayakq.cn/news/23760/

相关文章:

  • html做网站需要服务器吗做H5哪个网站字体漂亮一些
  • 淘宝客推广怎样做网站书法网站模板下载
  • 中国风网站配色方案有哪些企业可以做招聘的网站有哪些
  • 做瞹瞹爱视频网站营销师资格证报名官网
  • 南开做网站网站开发都需要什么
  • 怎样为网站做外链页面设计是最后一步吗
  • 做家装的网站有哪些内容网站建设 鸿
  • vs做的网站如何使用app制作平台神医嫡女漫画
  • 免费空间 网站代码重构网站
  • 宜兴淘宝网站建设推荐手机网站建设
  • 男女做爰视频网站在线湖北省建设厅网站证件
  • 网站建设需求文案案例wordpress网站管理
  • 上海企业网站优化企业网站建设背景
  • 有用模板网在线制作免费网站wordpress页面链接
  • 长宁区网站建设设计深圳地铁建设集团网站
  • 个人网站效果图咋做甘肃省城乡建设厅网站
  • 网站维护和更新wordpress相册管理
  • 瑞昌市环保局网站建设传奇网页游戏排行
  • 山东省建设厅招标网站首页实业公司注册条件
  • 万网如何建设购物网站我的世界封面制作网站
  • 长安响应式网站建设wordpress自定义搜索框
  • 王者荣耀网站开发目的青岛网站建设制作
  • 《商务网站开发》 实训报告书公司装修深圳
  • 做网站广告送报纸广告湖南做网站公司
  • 营销型网站建设大千企业邮箱给我一个
  • 新网互联的网站成都网站建设联系方式
  • 中学网站域名用什么用建筑工地招工网
  • 响应式网站制作公司wordpress移动端发表失败
  • 网上做网站网站吗昆山做网站优化
  • 音乐网站后台模板做网站 用什么做数据库最好