
手写一个PE文件
xuenixiang
这个作者很懒,什么都没留下…
展开
-
第六课 完善节区头并在区段中写入数据
写入.rdata段节表:成员1,8个字节,表识该段的名称,我们这里是.rdata。 成员2,4个字节,表示有效代码所占的字节数。我们不知道有多少个有效字节,这里有两种方法来填写这个值,第一就是填写整个段在内存中对齐后的大小10000h,第二就是打开1.exe做参考,我们用第二种方法写入52 00 00 00。 成员3,4个字节,表示在.rdata段映射到...原创 2018-07-23 13:59:03 · 439 阅读 · 0 评论 -
PE文件内名存实亡的对齐
本文章是我在看雪转载的,感觉非常有用,让我明白了一个核心道理:PE格式只是一个参考PE文件内名存实亡的对齐大家知道PE文件中IMAGE_NT_HEADERS的IMAGE_OPTIONAL_HEADER32里有两个对其因子SectionAlignment和FileAlignment分别表示内存中块的对齐和文件中块的对齐。我同时翻阅了Visual Studio, Microsoft Portabl...转载 2018-07-21 17:07:44 · 1727 阅读 · 1 评论 -
第四课 完善可选头
打开IMAGE_OPTIONAL_HEADER结构.txt文件成员13,2个字节,表示操作系统主版本号,此值不会影响程序的执行,我们这里填充零,此值为“0000”。 成员14,2个字节,表示操作系统副版本号,此值不会影响程序的执行,我们这里填充零,此值为“0000”。 成员15,2个字节,表示程序主版本号,此值不会影响程序的执行,我们这里填充零,此值为“00...原创 2018-07-21 16:58:14 · 161 阅读 · 0 评论 -
第九课 在text段写入可执行代码
写入可执行代码这部分我们借助OD来完成(这部分比较考验汇编语言)首先认识一下MessageBoxA这个API:更详细的解释自己可以在编译器里面去搜索在反汇编代码中可以看到他的参数传递方式同声明时的正好相反 认识程序中参数的传递,将2.exe载入到OD中。按照编译器的习惯我们将”Hello word”字符串的地址放入eax寄存器中。我们知道Hello Word这个字符...原创 2018-07-26 13:13:48 · 795 阅读 · 0 评论 -
第八课 写入导入表
这节课我们来完成.rdata段,这个段非常重要,也有些繁琐。之前我们只是简单的完成数据目录数组的第二个元素导入表目录,用’x’为标记,填充了导入表的位置,现在我们要一并解决这个问题。前面已经说过,每个数据目录具有两个成员,第一个成员表示目录表的起始RVA地址,第二个成员表示目录表的长度。对于我们这个导入表目录来说,他指的就是导入表了,这个导入表实际上是一个IMAGE_IMPORT_DESCRIPT...原创 2018-07-26 00:48:08 · 228 阅读 · 0 评论 -
第三课 完善可选头(整个PE课程中最重要的一课)
上一节课中我写好了_IMAGE_OPTIONAL_HEADER 头的前10个成员,今天我接着来完善这个结构中最重要的两个成员,在学习第11个第12个成员之前我们先来认识一下PE磁盘文件与内存映像结构图。做一个RVAtoRAW的转换练习(根据上节课讲的转换公式)RVA: (Relative Virtual Address 简称RVA),RVA只是内存中的一个简单的相对于PE文件装入地...原创 2018-07-20 12:53:04 · 343 阅读 · 0 评论 -
第一课 PE的介绍与手写DOS头
这个头文件包含了所有PE相关的结构首先创建一个小的可执行程序选择一个小的应用程序编译好之后,我们看一下他的区段(text是放代码的,rdata段是放导入表的,data用来放全局函数的)把头文件放到编译的目录下可以精简我们的程序只要在源码中包含一下这个头文件即可右键查看头文件合并区段的部分被注释掉了加上合并区段的代码编译出来会发...原创 2018-07-18 15:39:13 · 637 阅读 · 0 评论 -
第二课 手写文件头和部分可选头
写入_IMAGE_FILE_HEADER全部成员 和_IMAGE_OPTIONAL_HEADER部分成员上一节我们已经学习了这些结构,再复习一下写入_IMAGE_FILE_HEADER数据: 成员1,占2个字节,表示该文件运行所要求的CPU。对于Intel平台,该值是“4C01”。成员2,占2个字节,表示该文件中段的总数,我这里计划写3个段(用Pelorder查看参考程序)...原创 2018-07-19 13:08:27 · 324 阅读 · 0 评论 -
第七课 认识导入表
认识导入表(_IMAGE_IMPORT_DESCRIPTOR)结构。简单的说一个程序不可能完全包含整个系统中的代码,当我们要实现一些功能的时候,系统的API已经包含了这个功能,那么我们就可以将系统的这个dll加载到我们程序的内存内存空间中,然后去执行他就可以了。比如一个简单的窗口中弹出对话框如果要我们自己写全部代码,我想没有几周是不可能实现的,因为他涉及到显卡...原创 2018-07-24 15:31:04 · 235 阅读 · 0 评论 -
第五课 完善可选头和部分节区头
这节课完善_IMAGE_OPTIONAL_HEADER中的IMAGE_DATA_DIRECTORY成员和节表IMAGE_SECTION_HEADER部分通过看可选头我们可以看到可选头的结尾是16个_IMAGE_DATA_DIRECTORY数组,这就是我们为什么在第30个成员中填入十六16个进制的10h,也就是十进制的16的原因了,代表有16个_IMAGE_DATA_DIRECTORY数组。...原创 2018-07-22 23:54:26 · 305 阅读 · 0 评论