PE变形技术

这章东西太多,太细了。这里我只记录了一些重点概念。为后面学习做铺垫。

PE变形:改变PE结构之后,PE加载器依然可以成功加载运行我们的程序。

一 变形常用技术:

结构重叠技术、空间调整技术、数据转移技术、数据压缩技术。

下面是相关概念只是(我只整理重点)

1.结构重叠技术:

结构重叠技术是指在不影响正常性能的前提下,将某些数据结构进行重叠的技术。在缩小PE的变形中将大量使用这种技术。

重叠能成功通常是以为以下三点:

(1)被覆盖的数据可能是另一个结构中的无用数据。

(2)有用的数据可能只对一个结构起作用,但是被覆盖的数据在两个结构中都用,此种情况下发生的重叠必须保证重叠的字段在两个结构中拥有相同值。

(3)PE加载器并不检测所有的字段。

找了一个helloword随便把头前面改了下。

2.空间调整:

通过改变一些数据块的大小来个自己扩充空间,然后往里面加代码或者数据,但是这种要注意,被扩充的节后面所有的数据要相应修改相对偏移位置,这个比较麻烦。

3.数据转移技术:

在编写过程中,处于某种考虑,经常会将PE中的一部分数据转移到另一个位置。比如,将程序中的变量存储到文件头部结构的某个字段中,将代码转移到头部结构的某个连续空间中等,这就是数据转移技术。

(1)写一个hello输出HelloPE.

(2)找到数据段的这个字符串改为HelloXX,运行发现是显示HelloXX.

(3)然后OD加载起来这个程序,断点到MessageBox的地方,把push地址的那个HelloXX地址改为0x1020020相当于文件头0x20.

(4)然后直接二进制操作,把文件0x20的地方随便写一个传,模拟数据被转移到了这里。然后双击exe显示的是0x20处的这个串。具体细节操作如下图。

4.数据压缩技术

在编程过程中,如果指令代码比较长,海尔可以先对代码实施压缩,然后在PE头部找一块比较大的连续区域存放加压缩用的代码。程序被PE加载器加载后,文件头就基本不再使用了。这时,可以将存储的压缩代码通过PE头部的解压缩程序进行解压,解压后即可通过跳转指令实施程序指令的转移。

由于压缩后的代码不便于通过十六进制直接地看到,所以这种方法在一些病毒程序代码中比较常见;另外,在一些加壳程序中会经常看到数据压缩技术。

书上分析了一个病毒,用了简单的行程压缩算法,

这个很好理解:0000010000压缩后是05104

二 变形技术可用的空间:

要想对PE进行变形,需要掌握PE文件中每个位置数据的可替换特性,即该位置数据是否可以被替换成别的值,某段数据是否可以被其他用途利用等。总体上讲,PE中可以作用变形的空间有以下三类。

(1)文件头部未用的字段(用前一定要仔细测试)

(2)大小不固定的数据块:

(3)因对齐产生的补足空间:

这个也是大小不固定的,要具具体PE具体分析。

三 变形技术原则:

(1)关于数据目录表:

数据目录表的个数必须大于等于2.如果PE文件的最后一个字节位于目录表之间,如介于第3项资源表定义之间,则文件中无法定义资源的大小,PE加载器默认资源表的大小为0.

(2)关于节表:

PE文件头中可以没有节表的定义,但必须将文件头部的字段IMAGE_FILE_HEADER.NumberOfSections设置为1.

(3)关于导入表:

导入表是PE的核心。要想在已有的PE中静态引入动态链接库的函数,就必须通过变形技术构造一个合理的导入表,或者重构已有的导入表。

(4)关于程序数据:

数据可以存储在内存中的任何位置,可以位于文件头,可以可以位于其他节中。

代码和数据一样,可以在内存的任何位置,所在的节,其属性必须可读、可写、可执行。将代码段设置为可写属性主要考虑到某些程序会将一些变量存储在代码段,且在程序中尤为该变量赋值的代码。

如果所有的数据(程序变量、导入表、IAT等)都在文件头部,也就是说加载进内存的PE文件只有头文件存在,假设大小为一个页面1000h,那么操作系统会因为IAT的缘故自动将该页面设置位ERW,即可读、可写、可执行(之前文件头默认是只读的)。

(5)关于对齐:

节的对齐尺寸必须大于等于文件的对齐尺寸。由于文件的对齐尺寸被定义为2的N次幂,所以通常会将文件对齐尺寸设置得更小,并使两个值相等,已达到缩小PE文件的目的。

(6)几个关注的字字段:

Windows PE 第十二章 PE变形技术的更多相关文章

  1. [CSAPP笔记][第十二章并发编程]

    第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...

  2. Gradle 1.12用户指南翻译——第二十二章. 标准的 Gradle 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  3. Gradle 1.12用户指南翻译——第四十二章. Announce插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  4. o'Reill的SVG精髓(第二版)学习笔记——第十二章

    第十二章 SVG动画 12.1动画基础 SVG的动画特性基于万维网联盟的“同步多媒体集成语言”(SMIL)规范(http://www.w3.org/TR/SMIL3). 在这个动画系统中,我们可以指定 ...

  5. PRML读书会第十二章 Continuous Latent Variables(PCA,Principal Component Analysis,PPCA,核PCA,Autoencoder,非线性流形)

    主讲人 戴玮 (新浪微博: @戴玮_CASIA) Wilbur_中博(1954123) 20:00:49 我今天讲PRML的第十二章,连续隐变量.既然有连续隐变量,一定也有离散隐变量,那么离散隐变量是 ...

  6. <构建之法>第十一章、十二章有感

    十一章:软件设计与实现 工作时要懂得平衡进度和质量.我一直有一个困扰:像我们团队这次做 男神女神配 社区交友网,我负责主页的设计及内容模块,有个队友负责网站的注册和登录模块,有个队友负责搜索模块,有个 ...

  7. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)

    第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的  DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...

  8. 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记

    第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...

  9. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

随机推荐

  1. 趣谈 DHCP 协议,有点意思。

    计算机网络我也连载了很多篇了,大家可以在我的公众号「程序员cxuan」 或者我的 github 系统学习. 计算机网络第一篇,聊一聊网络基础 :计算机网络基础知识总结 计算机网络第二篇,聊一聊 TCP ...

  2. FreeBSD jail 折腾记(二)

    FreeBSD jail 折腾记(二) 创建jail目录 创建4个 分别是模板 骨架 数据 项目 创建模板目录 mkdir -p /jail/j1 # 然后放入基本目录,上篇说过不再写 创建骨架目录 ...

  3. 开源项目renren-fast-vue开发环境部署(前端部分)

    开源项目renren-fast-vue开发环境部署(前端部分) 说明:renren-fast是一个开源的基于springboot的前后端分离手脚架,当前版本是3.0 开发文档需要付费,官方的开发环境部 ...

  4. Educational Codeforces Round 69 (Rated for Div. 2) D. Yet Another Subarray Problem 【数学+分块】

    一.题目 D. Yet Another Subarray Problem 二.分析 公式的推导时参考的洛谷聚聚们的推导 重点是公式的推导,推导出公式后,分块是很容易想的.但是很容易写炸. 1 有些地方 ...

  5. springcloud知识点总结

    一.SpringCloud面试题口述1.SpringCloud和DubboSpringCloud和Dubbo都是现在主流的微服务架构SpringCloud是Apache旗下的Spring体系下的微服务 ...

  6. 实验: survivor放不下的对象进入老年代

    实验一: 存活对象包含 小于survivor大小的对象 + 大于survivor的对象 private static final Integer _1MB = 1024 * 1024; /** * - ...

  7. 高仿京东到家APP引导页炫酷动画效果

    前言 京东到家APP的引导页做的可圈可点,插画+动效,简明生动地说明了APP最吸引用户的几个亮点(商品多,价格低,配送快...).本文主要分析拆解这些动画效果,并完成一个高仿Demo,完整的Demo代 ...

  8. IT培训有哪些坑(二)?

    今天继续给大家分享一下IT培训都有哪些坑?有哪些不靠谱? 做招转的不靠谱.什么是招转?就是招聘转招生,名义上说的是招聘,但实际上做的就是招生.有很多大学刚毕业的计算机相关专业的同学,他们大学毕业之后, ...

  9. SqlServer视图的创建与使用

    SqlServer系列之视图的创建与使用: 什么是视图? 视图的概述 在数据查询中,可以看到数据表设计过程中,考虑到数据的冗余度低.数据一致性等问题,通常对数据表的设计要满足范式的要求,因此也会造成一 ...

  10. Codeforces-121C(逆康托展开)

    题目大意: 给你两个数n,k求n的全排列的第k小,有多少满足如下条件的数: 首先定义一个幸运数字:只由4和7构成 对于排列p[i]满足i和p[i]都是幸运数字 思路: 对于n,k<=1e9 一眼 ...