0x1 PE文件与免杀思路

基于PE文件结构知识的免杀技术主要用于对抗启发式扫描。
通过修改PE文件中的一些关键点来达到欺骗反病毒软件的目的。

  • 修改区段名

1.1 移动PE文件头位置免杀

工具:PeClean

SizeOfOptionalHeader字段来描述扩展头的大小,恒定值为0xE0。
某些程序直接使用0xE0对PE文件进行处理,对于修改过的程序会被识别为非PE文件。

1.2 导入表移动免杀

通过修改程序里导入表ThunkValue值实现。

  • 1)通过ThunkValue的偏移地址,找到API函数名
  • 2)将原地址的API函数名移动到其他空白处
  • 3)00填充掉原地址的API函数名
  • 4)修改ThunkValue值为新移动的地址

1.3 导出表移动免杀

通过修改导入表中API函数名的相对偏移地址实现。

  • 获取API函数名的RAV(相对虚拟地址)
  • 将API函数名移动到新位置
  • 将API函数名相对偏移地址填写回原先记录的地方

0x2 PE文件与反启发式扫描

其它非与PE文件相关的启发式扫描请参考第16章“免杀技术前沿”内容。

2.1 最后一个区段为代码段

启发特征:最后一个区段为代码段。这会引发“异常的入口点”。如果入口点被定位在了非正常的代码段上,则会被启发式扫描引擎查杀。

2.2 可疑的区段头部属性

蠕虫在感染一个文件时有三种方案,这些方案都要求会修改代码段具有可写属性。

  • 1 增加一个新的可执行区段
  • 2 现有的代码段中插入恶意代码
  • 3 将恶意代码分别穿插到不同的区段中,并修改相应区段的属性

启发特征:一个正常的可执行程序如果出现多个具有可执行属性的区段,就会制造出这些特征。

2.3 可疑的PE选项头的有效尺寸值

启发特征:这一项启发特征是基于 “移动PE文件头免杀”建立起来的。用于试图修改选项头大小而隐藏更多敏感数据的恶意程序。

2.4 可疑的代码节名称

启发特征:如果产生了编译器厂商之外的区段名,则启发特征判定为恶意程序。

2.5 多个PE头部

启发特征:可执行文件中含有需要释放的DLL或者SYS。

注:一般情况下将其中包含的可执行文件加密即可避免出现这个特征。

2.6 导入表项存在可疑导入

启发特征:

  • 无效导入表
  • 偏移形式调用API
  • 特定恶意行为的API序列

注:黑客一般会使用自己实现的GetProcAddresss函数,以便用散列值寻找并调用相关敏感API

0x3 隐藏导入表

隐藏导入表思路

  • 简单异或加密
  • 导入表单项移除
  • 重构导入表
  • 利用HOOK方式打乱其调用

3.1 操作原理与先决条件

原理:

  • 1)手工将指定导入项的IAT(Import Address Table)删除掉
  • 2)在启动初期用正确的值填充IAT

条件限制:

  • OriginalFirstThunk字段是一个以0x00000000结尾的32位数组,将INT填充为0x00000000删掉后,
    会导致在此IAT项后面所有由此DLL导入的函数失效。

3.2 修改PE文件

简单的例子

3.3 构造我们的反汇编代码

没看懂RegisterClassExW的起始地址是怎么得到的。

0x4 小结

  • PE免杀入门技巧

  • 对PE免杀入门技巧的启发式扫描规则

  • 反启发式扫描PE免杀技巧

0x5 参考文章

《黑客免杀攻防》第八章 PE文件知识在免杀中的应用
http://blog.csdn.net/dalerkd/article/details/41144251

【黑客免杀攻防】读书笔记6 - PE文件知识在免杀中的应用的更多相关文章

  1. 【黑客免杀攻防】读书笔记5 - PE格式讲解

    0x01 MS-DOS头 MS-DOS头部的字段重点关注e_magic与最后一个e_lfanew是需要关注的. 第一个e_magic字段的值为4D5A,作用是可以作为判断这个文件是否是PE文件. 最后 ...

  2. 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

    <Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...

  3. Python读取PE文件(exe/dll)中的时间戳

    代码原文地址: https://www.snip2code.com/Snippet/144008/Read-the-PE-Timestamp-from-a-Windows-Exe https://gi ...

  4. 《UNIX-Shell编程24学时教程》读书笔记Chap3,4 文件,目录操作

    Chap3 文件操作   P28 在这章中,要着重记住一些常用的选项,要有使用正则表达式的思维,能更快达到目的.----@im天行 3.1 列文件名 .profile  sh的初始化脚本: .kshr ...

  5. 【读书笔记】iOS-头文件导入-@class注意事项

    一,导入头文件有两种不同的方法:使用引号或者使用尖括号,例如,#import <Cocoa/Cocoa.h>和#import "Tire.h".带尖括号的语句是用来导入 ...

  6. 读书笔记 effective c++ Item 15 在资源管理类中提供对原生(raw)资源的访问

    1.为什么需要访问资源管理类中的原生资源  资源管理类是很奇妙的.它们是防止资源泄漏的堡垒,没有资源泄漏发生是设计良好的系统的一个基本特征.在一个完美的世界中,你需要依赖这样的类来同资源进行交互,绝不 ...

  7. 【读书笔记】【深入理解ES6】#9-JavaScript中的类

    大多数面向对象的编程语言都支持类和类继承的特性,而JavaScript却不支持这些特性,只能通过其他方法定义并关联多个相似的对象.这个状态一直从ECMAScript 1持续到ECMAScript 5. ...

  8. PE笔记之PE文件总览图

  9. 《Java并发编程实战》读书笔记-第一部分 基础知识小结

    并发技巧清单 可变状态是至关重要的 所有的并发问题都可以归结为如何协调对并发状态的访问.可变状态越少,就越容易确保线程安全性. 尽量将域声明为final类型,除非需要它们是可变的. 不可变对象一定是线 ...

随机推荐

  1. 码云平台IDEA系列的插件使用

    一.IDEA插件安装 file -- setting --  Plugins -- 搜索gitee --  Search in repositories 安装后重启编译器 二.登录并拉取项目 file ...

  2. 洛谷 P10P1343 地震逃生 改错

    P1343 地震逃生 题目描述 汶川地震发生时,四川**中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有\(n\)个点,\(m\)条边.1号点为教室,\ ...

  3. jieba分词器

    始终觉得官方文档是最好的学习途径.嗯,我只是一个大自然的搬运工.传送门https://github.com/fxsjy/jieba 1.分词 jieba.cut 方法接受三个输入参数: 需要分词的字符 ...

  4. HTML5小游戏-简单抽奖小游戏

    换了新工作以后,专注前端开发,平常空闲时间也比较多,可以多钻研一下技术,写一下博客.最近在学习canvas,参考网上的slotmachine插件,用canvas实现了一个简单抽奖小游戏.       ...

  5. Python--Django学习笔记1

    Django:The Web framework for perfectionists with deadlines Django是一个Python语言开发的高级Web框架,采用MVC架构,通过配置可 ...

  6. CF321E Ciel and Gondolas

    题意:给定序列,将其分成k段.如果[l, r]在一段,那么每对不相同的i,j∈[l, r]都会有ai,j的代价.求最小总代价. 解:提供两种方案.第三种去bzoj贞鱼的n²算法. 决策单调性优化: 对 ...

  7. R语言画棒状图(bar chart)和误差棒(error bar)

    假设我们现在有CC,CG,GG三种基因型及三种基因型对应的表型,我们现在想要画出不同的基因型对应表型的棒状图及误差棒.整个命令最重要的就是最后一句了,用arrows函数画误差棒.用到的R语言如下: d ...

  8. poj 1236(强连通分量分解模板题)

    传送门 题意: N(2<N<100)个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输. 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都 ...

  9. 函数和常用模块【day06】:random模块(三)

    本节内容 1.简述 2.random模块 3.string模块 4.生成随机数 一.简述 我们经常会使用一些随机数,或者需要写一些随机数的代码,今天我们就来整理随机数模块:random模块 二.ran ...

  10. 多目标遗传算法 ------ NSGA-II (部分源码解析)目标函数 problemdef.c

    /* Test problem definitions */ # include <stdio.h> # include <stdlib.h> # include <ma ...