当你好不容易弄出来一个木马(具体可参考这里)的时候,却被杀毒软件轻易的就检测出来了,那一切岂不是白费了。Win10中的windows defender基于流量检测很容易把常见的木马程序检测出来,那怎么绕过这些检测?

对于此问题,打算开一个专题进行木马免杀的分析,先从最最重要的PE文件说起,要攻击Windows系统,如果不懂PE文件,面对杀毒软件,则只能束手就擒了。

PE文件

PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任何扩展名

PE全称是Portable Execute,实际上,这种文件格式没有做到Portable Execute,只能用在Windwos。

基本结构

32位PE的基本结构如下,64位的大同小异。
如下是qq的16进制打开后解析出相应的字段,和上图是匹配的。

Dos文件头和Dos块
typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE headerWORD   e_magic;                     // Magic numberWORD   e_cblp;                      // Bytes on last page of fileWORD   e_cp;                        // Pages in fileWORD   e_crlc;                      // RelocationsWORD   e_cparhdr;                   // Size of header in paragraphsWORD   e_minalloc;                  // Minimum extra paragraphs neededWORD   e_maxalloc;                  // Maximum extra paragraphs neededWORD   e_ss;                        // Initial (relative) SS valueWORD   e_sp;                        // Initial SP valueWORD   e_csum;                      // ChecksumWORD   e_ip;                        // Initial IP valueWORD   e_cs;                        // Initial (relative) CS valueWORD   e_lfarlc;                    // File address of relocation tableWORD   e_ovno;                      // Overlay numberWORD   e_res[4];                    // Reserved wordsWORD   e_oemid;                     // OEM identifier (for e_oeminfo)WORD   e_oeminfo;                   // OEM information; e_oemid specificWORD   e_res2[10];                  // Reserved wordsLONG   e_lfanew;                    // File address of new exe header} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

对于PE文件来说,有用的是最后一个字段,这个字段指出了真正的PE头在文件中的位置。

PE文件头

typedef struct _IMAGE_NT_HEADERS {DWORD Signature;IMAGE_FILE_HEADER FileHeader;IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

Signature是00004550h,也就是字符’P’和’E’。对于OptionalHeader尽管按照字面的理解是可选的,实际上在每一个PE文件中都是需要的。
每个结构体的具体信息如下:

  1. IMAGE_FILE_HEADER 最后一个字段Characteristics代表文件的属性。如果是PE文件,这个字段的值是010fh,如果是dll文件,这个字段的值是210eh。

  2. IMAGE_OPTIONAL_HEADER32

  • AddressOfEntryPoint指出文件被执行时的入口地址,这个地址是RVA(稍后会介绍)。如果像在程序运行前执行一段程序,那么可以把这个入口地址指向你想执行的程序。
  • ImageBase指出文件优先载入的地址,一般exe默认优先装入的地址是400000h,而dll是10000000h
  • SectionAlignment指定了节被装入内存后的对齐单位,FileAlignment指定了节存储在磁盘文件时的对齐单位
  • DataDirectory 很重要的结构,由16个相同的IMAGE_DATA_DIRECTORY结构组成。其中有导入表、导出表、资源表数据块。

节表和节

Windows装载器在装载DOS部分,PE文件头部分和节表头部分不进行任何处理,而装载节的时候根据节的属性做不同的处理。下图展示了PE文件到内存的映射。

  1. 节表
  • VirtualAddress指出节被装载到内存后的偏移位置
  • PointerToRawData指出节在磁盘文件中所处的位置

RVA和文件偏移的转换

RVA应该时PE文件相关最重要的概念了,导入表导出表等的定位都需要用到RVA。


下图展示了RVA的含义:

相关计算:

msf中巧妙调用ReflectiveLoader

在msf中,反射dll注入使用的非常普遍。这段代码后续会详细讲解,这是msf远程控制最核心的一段代码,“小马”(stager)拉"大马"(stage)得以实现,基于的就是这段代码。

  def asm_invoke_dll(opts={})asm = %Q^; prologuedec ebp               ; 'M'pop edx               ; 'Z'call $+5              ; call next instructionpop ebx               ; get the current location (+7 bytes)push edx              ; restore edxinc ebp               ; restore ebppush ebp              ; save ebp for latermov ebp, esp          ; set up a new stack frame; Invoke ReflectiveLoader(); add the offset to ReflectiveLoader() (0x????????)add ebx, #{"0x%.8x" % (opts[:rdi_offset] - 7)}call ebx              ; invoke ReflectiveLoader(); Invoke DllMain(hInstance, DLL_METASPLOIT_ATTACH, config_ptr)push edi              ; push the socket handlepush 4                ; indicate that we have attachedpush eax              ; push some arbitrary value for hInstancemov ebx, eax          ; save DllMain for another callcall ebx              ; call DllMain(hInstance, DLL_METASPLOIT_ATTACH, socket); Invoke DllMain(hInstance, DLL_METASPLOIT_DETACH, exitfunk); push the exitfunk value onto the stackpush #{"0x%.8x" % Msf::Payload::Windows.exit_types[opts[:exitfunk]]}push 5                ; indicate that we have detachedpush eax              ; push some arbitrary value for hInstancecall ebx              ; call DllMain(hInstance, DLL_METASPLOIT_DETACH, exitfunk)^end

其中 add ebx, #{"0x%.8x" % (opts[:rdi_offset] - 7)} 用来获取ReflectiveLoader的虚拟地址。rdi_offset获取的是ReflectiveLoader的RVA地址。这段代码翻译过来就是ebx-7 = 基址,然后再加上RVA就得到了ReflectiveLoader的虚拟地址。

公众号

更多内容,欢迎关注我的公众号:无情剑客。

黑客攻击-木马免杀之PE文件相关推荐

  1. 「钓鱼攻击」免杀钓鱼上线捆绑利器

    前言 钓鱼攻击在现在的演练活动中逐渐成为很重要的打点方式,那么投递我们的诱饵需要对落地的文件进行一些处理或者说伪装,C系列的语言写出的文件捆绑释放容易被AV所检测,毕竟释放一个PE文件怎么样都是敏感的 ...

  2. 木马免杀原理及方法(超全)

    灰鸽子免杀 概况 免杀意为免除被杀毒 软件杀掉的软件. 灰鸽子免杀简介:本工具为纯绿色工具,软件采用独特的查杀技巧可完全查杀灰鸽子全系列(VIP2005.vip2006.免杀处理) 木马,本软件已经过 ...

  3. 0x06 木马免杀篇、0x07应急与响应、0x08 安全防御篇、0x09 其他问题篇

     来源如下图:(微信公众号:0x00实验室) 0x06 木马免杀篇         免杀可以先fuzz 定位出被查杀的语句,然后对被查杀那部分进行一波操作,像是加密啊.编 码啊.动态执行啊什么的,或者 ...

  4. 052 木马免杀全攻略

    木马免杀全攻略 转载自:a1pass.blog.163.com 2007-12-07 14:02:24| 分类: 思绪燃星火--技 | 标签:黑客 杂志刊物 作者:A1Pass 出处:http://a ...

  5. Kali木马免杀,权限提升(kali本地木马免杀)

    由于现在版本的木马查杀工具更新之快,木马在计算机上基本是裸奔的,再好的免杀技术也逃不过工具的查杀,下面是我研究很久的本地木马免杀,基本都是网上的百度总结,把可以是实现免杀的木马生成进行了总结. 免杀成 ...

  6. 木马免杀之汇编花指令技巧

    木马免杀之汇编花指令技巧 作者: 逆流风(发表于<黑客X档案>07.07,转载注明出处)        相信很多朋友都做过木马免杀,早期的免杀都是加壳和改特征码,现在免杀技术已经发展到花指 ...

  7. cobalt strike木马免杀

    0x001-针对powershell免杀 工具:Invoke-Obfuscation 操作实例: 1.利用CS生成powershell木马 2.进入invoke-Obsfuscation文件,使用po ...

  8. 渗透测试-木马免杀的几种方式

    木马免杀的几种方式 文章目录 木马免杀的几种方式 前言 1.裸奔马的尝试 2.部署一下kali上的apache服务,令目标机器能够访问下载我们生成的木马 2.1.kali中是自带有apache的,启动 ...

  9. 木马免杀原理详解(一)

    木马免杀原理详解 首先来简单了解一下杀毒软件查杀病毒的原理,当前杀毒软件对病毒的查杀主要有特征代码法和行为监测法.其中前一个比较方法古老,又分为文件查杀和内存查杀,杀毒软件公司拿到病毒的样本以后,定义 ...

最新文章

  1. 从零开始一起学习SLAM | SLAM有什么用?
  2. java 代码效率_Java效率
  3. 全球有多少 C/C++ 程序员?Java 和 Python 又有多少?
  4. 我也确实很向往深圳这种拼搏的精神
  5. 基坑监测日报模板_深基坑支护施工安全技术措施
  6. c++ floor 赋值_C++之floor函数
  7. Fade To Black《消失在黑暗中》BY Metallica [转]
  8. Kepware KEPServerEX连接Cimplicity OPC UA Server
  9. 改变音质效果,均衡器、cd播放器、数字解码器哪个更好?为什么?
  10. 长截图、识别图片里的文字,不用装其它软件!
  11. vue项目启动时 chatroom@1.0.0 dev: `webpack-dev-server --inline --progress --config build/webpack.dev.c...
  12. mysql每五分钟取一次数据_mysql – 给定时间内每5分钟的平均数据
  13. minecraft崩溃java,je1.7.10,进入世界就崩溃,解决一下
  14. 苹果应用商店审核指南
  15. jquery 表格分页等操作实现代码(pagedown,pageup)
  16. 关于GR/IR—业务流程篇
  17. 斐波纳契数列(Fibonacci Sequence)
  18. FPGA驱动OLED Verilog代码 (五)------ 动态显示字符
  19. linux打通任督二脉百度网盘,廖阅鹏催眠CD-催眠打通任督二脉
  20. python用turtle画月亮_使用Python的turtle画小猪乔治和哆啦 A 梦

热门文章

  1. 微信和业务平台绑定项目和业务
  2. 亚商投资顾问 早餐FM/1125氢燃料电池汽车发展驶入快车道
  3. 图书馆计算机书籍入门,数字化阅读空间 | 想要从零开始学电脑,却不知道该从哪入手?...
  4. redis 发布订阅、geo、bitmap、hyperloglog
  5. 泛微Ecology9鉴权API说明
  6. IDS相机内部函数学习
  7. 电脑上设置对眼睛友好的绿豆沙色
  8. flyme禁止系统更新_Flyme系统更新最新版本
  9. Android安装Xposd框架(从刷机开始)
  10. 基于5G/4G边缘网关的建筑机器人应用