存档

‘PE文件格式’ 分类的存档

[译]动态加载并执行Win32可执行程序

2012年6月4日 20 条评论

本文所贴出的PoC代码将告诉你如何通过CreateProcess创建一个傀儡进程(称之为可执行程序A),并把dwCreationFlags设置为CREATE_SUSPENDED,然后把另一个可执行程序(称之为可执行程序B)的内容加载到所创建的进程空间中,最终借用傀儡进程(A)的外壳来执行可执行程序B的内容。同时这段代码也会告诉你如何手工对Win32可执行程序进行重定位处理,以及如何从进程空间中取消已经映射的EXE映像。

在Windows操作系统下,通过给CreateProcess传递一个CREATE_SUSPENDED参数可以使得被创建的进程处于挂起状态,此时EXE的映像会被加载到进程空间中,但是并不会立即被执行,除非调用ResumeThread。在调用ResumeThread之前,可以通过调用ReadProcessMemory和WriteProcessMemory这样的API来读写进程空间的内容,这使得这样一种情形成为可能:通过读取另一个可执行文件的内容来覆盖刚创建的处于挂起状态的进程的空间,然后通过原始进程的空间来执行第二个可执行程序的内容。可以通过如下的步骤来完成这个过程:[......]

PE文件格式学习资料

2011年9月26日 5 条评论

以前学习时收集了一些资料,感觉其中有些资料还是很不错的,现在电脑上的文件也是乱七八糟的,拿出来做个备份。
学习PE最权威的资料当属微软官方的《Microsoft Portable Executable and Common Object File Format Specification》,可能现在文档的名字变了,最新的下载地址在http://msdn.microsoft.com/en-us/windows/hardware/gg463119,点击Accept就可以看到了。
上面的PE文件介绍是[......]

继续阅读

分类: PE文件格式 标签: , ,

PE文件格式解析(五)——导出表的解析

2011年4月19日 没有评论

昨天看了一下PE感染的实现,发现还是存在很多疑问,所以决定继续写那个PE工具。这里要实现导出表的解析。
输出表一般存在于Dll之中,在Winnt.h中的定义如下:

typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD N[......]

继续阅读

分类: PE文件格式 标签: , , ,

PE文件格式解析(四)——进程及模块显示

2011年4月17日 2 条评论

本文放在这个系列感觉有点不合适,不过在一般的PE编辑器都有这个功能,但是我写的只是简单的枚举模块,没有其他扩展功能。
到此,PE文件解析工具也基本完工了,要考试了,不打算继续拓展了。这些文章汇总地址如下:
第一篇——《神奇的栈溢出
第二篇——《PE文件格式解析(二)
第三篇——《PE文件格式解析(三)——导入表的解析
第四篇——《PE文件格式解析(四)——进程及模块显示
这里显示进程列表以及模块列表用到的API是CreateToolhelp32Snapshot、Process32Firs[......]

继续阅读

PE文件格式解析(三)——导入表的解析

2011年4月16日 没有评论

在解析导入表之前,要先得到PE文件的数据目录表,数据目录表存在于可选头之中,以一个数组的形式存在,第二个元素指出导入表的一些信息。具体请参考《PE文件之IMAGE_OPTIONAL_HEADER》一文。
通过IMAGE_DATA_DIRECTORY的第二个VirtualAddress可以得到导入表的RVA(到处都是RVA,所以弄懂RVA的概念以及熟悉RVA与Offset的转换是十分重要的,具体请参考《PE文件格式解析(二)》一文)。将RVA转为Offset之后,就可以读取IMAGE_IMPORT[......]

继续阅读

分类: PE文件格式 标签: , ,

PE文件格式解析(二)

2011年4月14日 没有评论

本文为什么是二?(*^__^*) 嘻嘻……上一篇见《神奇的栈溢出》。最近我在用SDK写一个简单的PE格式解析工具,界面模仿LordPE。这个代码到最后面我会将完整的工程文件发布出来,所以,这里都讲一点点原理。
这几天在空余时间写了RVA和文件偏移的转换、节表的解析。
什么是RVA呢?当文件加载如内存的时候,会有一个基地址,一般exe默认为0×00400000(由可选头中的ImageBase域指定,具体可在链接时进行指定),假如说,该进程内存地址为0×00401000的地方,他[......]

继续阅读

神奇的栈溢出

2011年4月12日 4 条评论

最近,我在写一个简单一点的PE文件分析器,也就是把PE里面的一些信息反馈到界面上面来,界面的话模仿了LordPE的编辑器界面。
我觉得要动手去解析这些结构,才会对PE文件有一个更加深刻的了解。
也许有人会问,什么是PE?PE是Windows下可执行程序的一种格式,PE的意思是Portable Executable(可移植的执行体),所有Win32执行体都是用PE文件格式,其中包括SYS, DLL, EXE, COM, OCX等。
作为一个程序员,你可以不了解PE的具体结构,但是如果你能仔细去研究[......]

继续阅读

PE文件之IMAGE_SECTION_HEADER

2011年3月12日 没有评论

在IMAGE_NT_HEADERS之后,是IMAGE_SECTION_HEADER。
重要的数据成员有:8字节大小的NAME,如果节区名称小于8个字节,则多余的用0填充,否则全部填充节名,末尾不保证有1个0,同样会被名字填充。VirtualSize指出实际的节区大小。VirtualAddress为节区被装载到内存中的RVA地址。PointerToRawData为节区在PE文件中的便宜。Characteristics为节区的属性,如可读、可写、可执行等。
IMAGE_SECTION_HEADER的[......]

继续阅读

分类: PE文件格式 标签: ,

PE文件之IMAGE_OPTIONAL_HEADER

2011年3月12日 没有评论

可选头位于IMAGE_NT_HEADERS内,紧接与IMAGE_FILE_HEADER之后,可选头的大小由文件头中倒数第二个成员指定。
可选头中重要的数据成员有:
第一个成员WORD Magic,这个对于32位可执行文件来说为0x010B。DWORD AddressOfEntryPoint,这个成员是程序执行的入口RVA地址。ImageBase为建议的装载地址。对于可执行文件来说一般是0×00400000。SectionAlignment为内存中节的对齐大小,一般为0×000[......]

继续阅读

分类: PE文件格式 标签: ,

PE文件之IMAGE_FILE_HEADER

2011年3月12日 没有评论

IMAGE_NT_HEADERS的第一个成员是一个DWORD类型的PE签名,第二个成员就是IMAGE_FILE_HEADER了。IMAGE_FILE_HEADER的大小为20字节。第一个成员为WORD类型的Machine,这个通常为0x014C(intel 386系列CPU);第二个成员为WORD类型的NumberOfSections,即文件中节的数量,这个对应的文件具体的节区数量。第三个成员为DWORD类型的TimeDateStamp,是一个时间戳,对应于从1970年1月1日开始的秒数。第四个[......]

继续阅读

分类: PE文件格式 标签: ,