文章分类 -  PE文件结构理解

摘要:以1个实际的例子来理解数据目录项的各个字段的意义: 资源目录项位于数据目录下的第2项(下标为2) 通过数据目录项2项找到资源的位置: 0x4000< 转成FOA为 >0x1800 0x0D8430 typedef struct _IMAGE_RESOURCE_DIRECTORY{ dword Cha 阅读全文
posted @ 2023-10-26 17:29 一日学一日功 阅读(111) 评论(0) 推荐(0)
摘要:.386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.i 阅读全文
posted @ 2023-08-21 10:12 一日学一日功 阅读(40) 评论(0) 推荐(0)
摘要:.386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.i 阅读全文
posted @ 2023-08-17 18:13 一日学一日功 阅读(70) 评论(0) 推荐(0)
摘要:struct IMAGE_IMPORT_TABLE{ union { dword Characteristics; dword OriginalFirstThunk; //RVA 指向INT结构体数组 } INTName; dword TimeDateStamp; // 时间戳 0 if not b 阅读全文
posted @ 2023-08-17 16:45 一日学一日功 阅读(43) 评论(0) 推荐(0)
摘要:PE32如下: word Magic 0x010B 这个字段有3个值,0x010B 是32位程序,0x020B是64位程序,0x0107是ROM嵌入式设备选项头 byte MajorLinkerVersion 0x05和byte ManorLinkerVersion 0x0C是链接器的版本,可参考, 阅读全文
posted @ 2023-08-16 09:27 一日学一日功 阅读(136) 评论(0) 推荐(0)
摘要:1、先自己手动写一个最简单的汇编程序,弹框MessageBox和ExitProcess,生成1个大约2kb左右的文件 2、手动把PE文件中所有的属性,手动修改一遍,观察每个属性引起的反应。 .386 .model flat,stdcall option casemap:none include \m 阅读全文
posted @ 2023-08-15 18:37 一日学一日功 阅读(676) 评论(0) 推荐(0)
摘要:PE结构学习,其实最主要的学习节表、重定位表、导入表、IAT表; 1、是学习这些表的结构,理解各个表设计的原理 2、移动、修改、修复这些表中的内容,才能真正理解各个表的意思 注入的本质是什么,注入的本质是把自己编写的dll能够贴到目标程序的4GB(针对x86系统)虚拟内存中(不管哪些注入都是这个目的 阅读全文
posted @ 2023-08-11 17:24 一日学一日功 阅读(260) 评论(0) 推荐(0)
摘要:以win10中notepa.exe为例 现在数据目录中找到IAT表 0x00C0 <==> 0xAE00(FOA) 发现IAT中存的值如下: 我们找到导入表的位置:先找到数据目录项 0xCFF8 <==> 0xBDF8(FOA) ,找到导入表的位置 0x 00 00 D1 E8 < >0xBFE8 阅读全文
posted @ 2023-08-10 13:49 一日学一日功 阅读(173) 评论(0) 推荐(0)
摘要:本文主要是为了看一下以函数序号导入的函数长什么样,有图有个直观的印象,这个是以win10 notepad.exe以例子,因为notepad.exe是PE64+,并且还是有绑定导入表的存在, 绑定导入表,下篇会写。PE64+中的_IMAGE_THUNK_DATA结构变成了8个字节,IAT中的地址也变成 阅读全文
posted @ 2023-08-10 13:47 一日学一日功 阅读(55) 评论(0) 推荐(0)
摘要:当exe或者dll中引入了外部PE机构的函数的时候,怎么知道引入了哪些dll?怎么知道引入的这些dll中的哪些函数?怎么知道引入的这些函数的地址? 因此在PE的数据目录表中就有这一张表:导入表,解决了上述3个问题。 导入表在数据目录表的第一项中,在导出表的下边: lpOptionHeader1->D 阅读全文
posted @ 2023-08-10 13:31 一日学一日功 阅读(166) 评论(0) 推荐(0)
摘要:先写一个简单的程序: #include "stdafx.h" #include <Windows.h> int _tmain(int argc, _TCHAR* argv[]) { MessageBox(0,0,0,0); ExitProcess(0); return 0; } 生成release版 阅读全文
posted @ 2023-08-10 10:27 一日学一日功 阅读(260) 评论(0) 推荐(0)
摘要:第一个问题:一个EXE程序如何运行? exe程序加载到内存是由一个exe和一堆dll组成的。 任何一个程序一般都是先加载exe,因此exe加载到内存的时候先加载到ImageBase地方,这个加载过程,就是磁盘文件拉伸到内存的过程。 exe加载到内存运行的过程和一个PE拉伸到内存的过程类似,PE拉伸到 阅读全文
posted @ 2023-07-28 10:23 一日学一日功 阅读(394) 评论(0) 推荐(0)
摘要:一个PE文件生成之后,里面不仅仅有我们自己编写的代码,还有编译器往节区里面填充一些信息,这些数据包括: 这个PE引用了外部的哪些dll 我们这个exe提供一些函数供外部使用 ………………等等内容 如果编译器只是胡乱的把这些重要信息放在PE中,那么程序可以运行不起来。 因此就就使用数据目录表 记录了编 阅读全文
posted @ 2023-07-26 10:11 一日学一日功 阅读(179) 评论(0) 推荐(0)
摘要:1、普通导出方式,函数名字显示,创建一个DLL 然后右键-->新建一个类 添加代码 头文件添加声明: 导出的时候,编译器会考虑按照c或者c++的方式导出,c++中由于有重载存在(即函数名字相同,函数参数不同),当生成c++的导出函数的时候,就会由编译器加一堆乱七八糟的符号,并且c++的导出函数只能由 阅读全文
posted @ 2023-07-20 17:02 一日学一日功 阅读(1394) 评论(0) 推荐(0)
摘要:模拟加载过程,就是用代码把这个过程实现一遍。 主要是把下面3个函数实现以下。 DWORD ReaDiskdFileToFileBuffer(void* DiskFilePath,void** FileBuffer) DWORD CopyFileBufferToImageBuffer(void* Fi 阅读全文
posted @ 2023-07-14 18:08 一日学一日功 阅读(150) 评论(0) 推荐(0)
摘要:PE文件格式学习过程:拿到一个*.exe(例如notepad.exe)照着PE文件头部的结构体一个字段一个字段的扣出来,这个过程加深对各个结构体中字段的理解。时间长了,以后对PE文件操作,也知道那个字段在哪个结构体中。 DOS头 阅读全文
posted @ 2023-07-14 18:03 一日学一日功 阅读(33) 评论(0) 推荐(0)
摘要:0、先手动把随机基址去掉,不然每次程序启动,程序起始位置都要变化,在PE结构中对应的属性的在IMAGE_OPTIONAL_HEADER中的DWORD DllCharacteristics字段。 64位程序对应的hex值"6081"改成"2081",对应32位程序的话,此处是"4081"改成"0081 阅读全文
posted @ 2023-07-10 11:18 一日学一日功 阅读(131) 评论(0) 推荐(0)
摘要:typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //8个字节,可以修改 union { DWORD PhysicalAddress; DWORD VirtualSize; //说明信息,可以修改,但 阅读全文
posted @ 2023-07-07 18:56 一日学一日功 阅读(1058) 评论(0) 推荐(1)