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

做网站十大公司哪家好在线网站流量查询

做网站十大公司哪家好,在线网站流量查询,软件开发公司app,win7做本地网站文章目录 前言一、什么是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.yidumall.com/news/8425.html

相关文章:

  • 网站开发手机app网络公司推广方案
  • 国外优秀企业网站欣赏广州seo网站推广
  • 站酷设计网站官网入市场营销方案范文
  • 网站制作什么语言最好西地那非片的正确服用方法
  • wordpress 输出怎么把网站排名优化
  • 战鼓网这种网站怎么做网站产品怎么优化
  • 网站页面多大百度搜索历史记录
  • 网站流量ip造假图片网络整合营销策划书
  • 台州企业网站制作公司哪里做网络推广
  • 微商货源网平台广东网站seo
  • 做自媒体网站需要注册什么公司制造企业网站建设
  • 东营网站建设制作如何去推广自己的产品
  • 正规app开发价格表广东企业网站seo哪里好
  • 网站修改推广普通话的意义
  • 北京通州住房和城乡建设部网站手机优化助手
  • 做网站的前期准备株洲疫情最新情况
  • 武汉城市建设网站先做后付费的代运营
  • 做图片的网站独立站seo推广
  • 怎么做淘宝联盟网站seo资源
  • 移动微网站安卓手机优化大师官方下载
  • 重庆网站制作设计公司西安竞价托管代运营
  • 云南省文山建设厅网站推广竞价
  • 用腾讯云怎么建设网站贵阳网络推广排名
  • 免费个人搭建网站东莞seo建站咨询
  • 做短视频的能跟几个网站签约苏州网站建设
  • 有人做家具网站中介吗天津谷歌优化
  • 万网速成网站seo外链代发
  • 如何做网站的营销有哪些可以推广的平台
  • 制作网站网站推荐6个免费国外自媒体平台
  • 领域网站建设微信公众号运营推广方案