初步了解PE分析

尝试编写代码获取PE文件的信息。
首先使用 CreateFile打开一个PE文件并返回一个用于访问该对象的handle

HANDLE CreateFile(
    LPCTSTR lpFileName,     // pointer to name of the file
    DWORD dwDesiredAccess,      // access (read-write) mode
    DWORD dwShareMode,      // share mode
    LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
    DWORD dwCreationDistribution,       // how to create
    DWORD dwFlagsAndAttributes,     // file attributes
    HANDLE hTemplateFile        // handle to file with attributes to copy
);

然后调用CreateFileMapping函数为该文件创建一个文件映射对象(file-mapping object),此时为文件创建了一个视图,而并未将该视图映射进进程的地址空间,也就是尚未装载进入内存之中的意思吧。

Creating a file-mapping object creates the potential for mapping a view of the file but does not map the view. The MapViewOfFile and MapViewOfFileEx functions map a view of a file into a process‘s address space.

HANDLE CreateFileMapping(
    HANDLE hFile,           // handle to file to map
    LPSECURITY_ATTRIBUTES lpFileMappingAttributes,      // optional security attributes
    DWORD flProtect,            // protection for mapping object
    DWORD dwMaximumSizeHigh,    // high-order 32 bits of object size
    DWORD dwMaximumSizeLow,     // low-order 32 bits of object size
    LPCTSTR lpName              // name of file-mapping object
);

接着MapViewOfFile函数会将之前创建的视图对象映射进入当前调用父进程的内存地址空间中了,那也就是说此时该PE文件基址将不再会是默认的,与DLL文件被程序调用的载入方式一致。

LPVOID MapViewOfFile(
HANDLE hFileMappingObject,  // file-mapping object to map into address space
DWORD dwDesiredAccess,      // access mode
DWORD dwFileOffsetHigh,     // high-order 32 bits of file offset
DWORD dwFileOffsetLow,      // low-order 32 bits of file offset
DWORD dwNumberOfBytesToMap      // number of bytes to map
);

MapViewOfFile返回值为LPVOID,为该映射视图对象在内存中的基址,指向PE文件中最开始的IMAGE_DOS_HEADER结构体,做完这些就可以开始对文件的结构进行分析了。

在写代码的时候要注意类型转换,不然运算结果可能出乎意料:)
大多数结构体中的地址成员为RVA,需要转化,我这里主要记录一下遇到的关于RVAToVA的问题。

  1. 转化RVA,可以使用ImageRvaToVa()函数,该函数在"Imagehlp.h"或"Dbghelp.h"中声明:
PVOID IMAGEAPI ImageRvaToVa(
    \_In\_ PIMAGE_NT_HEADERS NtHeaders,
    \_In\_ PVOID Base,
    \_In\_ ULONG Rva,
    \_In\_opt\_ OUT PIMAGE_SECTION_HEADER *LastRvaSection
    );

在vs中碰到一个问题,编译时可能会出现引用错误之类的问题,这个在#include "imagehlp.h"下面添加#pragma comment(lib, "imagehlp.lib")即可;Dbghelp.h同理。

这里加入#pragma comment 解决问题的原因:出错的地方主要在于链接程序无法解析别引用的外部函数(此时已经编译完成),使用comment使linker根据指定的库名查找该库,从而可以识别调用的函数。
那为什么出现这种情况?谷歌一下,原因在于vs的链接器默认写入了我们常用的一些库,当是一些不常用的库则没有,这个时候链接器只找到声明,倒是没有函数的定义部分,也因此需要我们自己添加。

  1. 由于函数并不复杂,可以尝试自己手动实现一个ImageRvaToVa函数:
INT32 ImageRvaToVa(PIMAGE_NT_HEADERS pNtH, LPVOID ImageBase, DWORD Rva) {

    INT sectionTbNum = pNtH->FileHeader.NumberOfSections;       // 记录节区头的个数,便于遍历
    PIMAGE_SECTION_HEADER pCurrentSection = (PIMAGE_SECTION_HEADER)((DWORD)pNtH + (pNtH->FileHeader).SizeOfOptionalHeader + 0x18);      // 当前节区头VA
//  printf("%x\n", pCurrentSection->VirtualAddress);
//  printf("sectionTbNum : %x \npCurrentSection : %x", (DWORD)sectionTbNum, (DWORD)pCurrentSection);///////////////////

    for (int i = 0; i < sectionTbNum; i++, pCurrentSection ++) {
        // 判定待转化的RVA是否在当前的节区范围内
        if (Rva > pCurrentSection->VirtualAddress && Rva <= pCurrentSection->VirtualAddress+pCurrentSection->SizeOfRawData) {
            // return: RVA - CurrentSectionRVA + CurrentSectionRAW + ImageBase
            return Rva - pCurrentSection->VirtualAddress + pCurrentSection->PointerToRawData + (DWORD)ImageBase;
        }
    }
    return 0;
}

自己尝试写的原因在于刚开始尝试以RVA+ImageBase作为VA的时候一直出错,后面上网找写文章看看,后面又看了一下OD中该可执行文件的导入表的地址计算方式,发现时VA = RVA+ImageBase,然后又看见一个关于ImageRvaToVa函数的汇编代码,之后自己尝试调试之后根据其不复杂的逻辑可以写出代码。

根据这个情况,是不是说明通过函数将PE文件映射进入进程的地址空间的做法并没有如同通常的可执行文件一样根据VA来确定位置,而是带有基址的文件偏移作为地址。

当不使用该文件影响时,要完全关闭这个文件映射对象,需要调用CreateFileMappingCloseHandle函数,调用顺序随意。

原文地址:https://www.cnblogs.com/zUotTe0/p/10693307.html

时间: 2024-08-04 19:21:52

初步了解PE分析的相关文章

开源安全:PE分析

https://github.com/JusticeRage/Manalyze.git https://github.com/JusticeRage/Manalyze https://www.freebuf.com/sectool/104378.html 原文地址:https://www.cnblogs.com/hshy/p/11531502.html

20145207李祉昂《网络对抗技术》恶意代码分析

实验内容 schtasks.Sysmon对电脑进行系统检测,并分析. 对恶意软件进行静态分析,直接上传到网上,或者利用peid等软件. 对恶意软件进行动态分析,使用systracer,以及wireshark分析. 实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控. schtasks,Sysmon监控 (2)如果已经确定是某个程序或进程有问题,你有什么工具可以进一步得到它的哪些信息. wi

Hybrid APP基础篇(二)-&gt;Native、Hybrid、React Native、Web App方案的分析比较

说明 Native.Hybrid.React.Web App方案的分析比较 目录 前言 参考来源 前置技术要求 楔子 几种APP开发模式 概述 Native App Web App Hybrid App React Native App 分析 各大开发模式直观对比 如何选择开发模式 另类的app方案 微网页 微信小程序 其它 前言 参考来源 前人栽树,后台乘凉,本文参考了以下来源 对当前主流hybrid app.web app与native app工具的初步比较与分析 H5.React Nati

转载:案例用Excel对会员客户交易数据进行RFM分析

案例:用Excel对会员客户交易数据进行RFM分析 背景: 一个会员服务的企业,有近1年约1200个会员客户的收银数据.由于公司想针对不同类别不活跃客户进行激活促销:同时,为回馈重点客户,也计划推出一系列针对重点客户的优惠活动,希望保留这些客户,维持其活跃度.因此希望利用该数据进行客户分类研究. 分析: 根据客户的需求,RFM模型相对简单并且直接,按照R(Recency-近度).F(Frequency-频度)和M(Monetary-额度)三个维度进行细分客户群体.由于该客户的数量较少(约1200

Exp4 恶意代码分析

Exp4 恶意代码分析 一.基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控. (1)我们可以使用一些工具帮助自己监测系统,可以实时监控电脑上的端口信息,如果受到怀疑的恶意代码启动的时候连接了一些看起来很可疑的端口,就可以进一步进行分析. (2)我们可以通过在windows下建立一个监测本机连接ip地址的任务计划程序,不定时的查看一下电脑都在什么时候连了网干了什么,如果在你觉得自己的电脑没有联网

windows类书的学习心得(转载)

原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千,很多陌生的出版社,很多陌生的作者,很多陌生的译者,书名也是越来越夸张,什么××天精通××,精通××编程, ××宝典等等,书的印刷质量真的很好,纸张的质量也是今非昔比啊,但书的内容好象却是越来越让人失望,也许是我老了,我的思想我的观念已脱离现实社会,也许是外面的世界变化得太快,我编程数月,出去一走,

基于三维GIS技术的公路交通数字孪生系统

交通运输系统是四个现代化建设的重要保障,在"一带一路"倡议规划背景下,互联网+.智慧交通提升到国家新战略.智慧交通的基石是建立可映射物理世界的虚拟世界,因此大多数交通管理平台项目通过抽象建模构造二维电子地图,并在抽象模型上集成数据及分析工具,实现运营期信息化管理.随着设计.施工.运营全生命周期细化管理日益增长的需求,传统的交通地理信息(Geographic Informa-tion System-Transportation,GIS-T)系统的压力也随之增加.交通基础设施数字化映射为三

如何设计一款优秀的短视频 SDK

2017 年,短视频成为了内容创业的新风口,各种短视频 App 如雨后春笋般先后上线,随着互联网内容消费升级,视频越来越像文字.图片一样,成为每一个 App 不可或缺的一部分. 为了能够更好地聚焦于业务,早日完成短视频 APP 的上线,越来越多的公司倾向于选择一家靠谱的短视频 SDK 来起步,怎么定义靠谱?要关注哪些指标?仅功能满足就可以了吗? -- 显然不够,下面我们看看,如何才能设计一款优秀的短视频 SDK ? 1. 包体一定要尽可能小 在移动互联网时代,App 的包体大小,对获取用户有着至

论文翻译之--- 软件设计师怎样使用标记来帮助提醒和重新查找

最近以来有个学习任务,就是翻译一篇关于软件工程相关的论文.我选择了一篇How Software Developers Tagging to Support Remingding and Refinding.由于本人水平有限,基本直译,有很多不准确不通之处.希望读到文章的人批评指导,大家交流改进,在此基础之上使得翻译和我个人的能力得以提高.我记录了自己工作的时间,确实这篇文章的翻译耗费了我一定的时间.文章来自IEEE TRANSACTIONS ON SOFTWARE ENGINEERING, VO