样本文件MD5: 42f43edc9937e4aa5f985773f5ea9daa

这个样本有点老了,之前分析了一下他的命令执行部分,数据流程一直没有弄明白,现在记录一下。这个样本一上来会通过注册一个临时的 protocol driver (ndis 5.0, 差别多在xp 时代) ;注册成功后会返回一个ndis_handle 指针,然后通过这个指针加上硬编码的偏移找到 tcp/ip protocol driver 的 ndis_handle ,再挂钩(hook) 该结构中的receive 等回调函数;最后可以卸载临时的protocol driver,等待接收特定的网络包并解析。

hook 的 收包函数原型如下:

NDIS_STATUS OnReceiveStub(IN NDIS_HANDLE ProtocolBindingContext, /* our open structure */    
                                              IN NDIS_HANDLE MacReceiveContext,  
                                              IN PVOID HeaderBuffer, /* ethernet header */ 
                                              IN UINT HeaderBufferSize,  
                                              IN PVOID LookAheadBuffer, /* it is possible to have entire packet in here */ 
                                              IN UINT LookaheadBufferSize, 
                                              UINT PacketSize )

在hook 处理函数中对 HeadBuffer(相当于ethernet header),LookAheadBuffer (相当于ip+tcp/udp header+data )参数进行分析。

先判断ethernet 报文的长度是否为 14字节,在判断 ethernet frame 。分析ethernet header,如下图

从后续 ip ,tcp header ,及data 部分确认是否是特定包。先从ip header 中确定是否是tcp 协议,之后从 tcp 数据部分 的前16字节计算校验和;如果与硬编码值相等,则保留数据以进行下一步解析。 相关代码如下:

.text:00012490 GetRemoteAddress proc near              ; CODE XREF: HandleIpAndTcpHeader+A↓p
.text:00012490                 push    esi
.text:00012491                 mov     esi, ecx
.text:00012493                 cmp     esi, 14h
.text:00012496                 jnb     short loc_1249C
.text:00012498
.text:00012498 loc_12498:                              ; CODE XREF: GetRemoteAddress+16↓j
.text:00012498                                         ; GetRemoteAddress+1C↓j
.text:00012498                 xor     eax, eax
.text:0001249A                 pop     esi
.text:0001249B                 retn
.text:0001249C ; ---------------------------------------------------------------------------
.text:0001249C
.text:0001249C loc_1249C:                              ; CODE XREF: GetRemoteAddress+6↑j
.text:0001249C                 mov     cl, [eax]
.text:0001249E                 mov     dl, cl
.text:000124A0                 and     dl, 0F0h
.text:000124A3                 cmp     dl, 40h ; '@'
.text:000124A6                 jnz     short loc_12498
.text:000124A8                 cmp     byte ptr [eax+9], 6 ; 6 --->tcp
.text:000124AC                 jnz     short loc_12498
.text:000124AE                 push    edi
.text:000124AF                 mov     edi, [eax+0Ch]  ; ip->SourceAddress
.text:000124B2                 test    edi, edi
.text:000124B4                 jz      short loc_124BE
.text:000124B6                 cmp     edi, RemoteAddress
.text:000124BC                 jz      short loc_1251D
.text:000124BE
.text:000124BE loc_124BE:                              ; CODE XREF: GetRemoteAddress+24↑j
.text:000124BE                 xor     edx, edx
.text:000124C0                 mov     dh, [eax+6]
.text:000124C3                 mov     dl, [eax+7]
.text:000124C6                 movzx   edx, dx
.text:000124C9                 test    dx, 3FFFh
.text:000124CE                 jz      short loc_124D7
.text:000124D0                 test    dx, 1FFFh
.text:000124D5                 jnz     short loc_1251D
.text:000124D7
.text:000124D7 loc_124D7:                              ; CODE XREF: GetRemoteAddress+3E↑j
.text:000124D7                 and     ecx, 0Fh
.text:000124DA                 lea     edx, [eax+ecx*4]
.text:000124DD                 movzx   eax, byte ptr [edx+0Ch] ; get data offset in tcp message
.text:000124E1                 shr     eax, 4
.text:000124E4                 add     ecx, eax
.text:000124E6                 shl     ecx, 2
.text:000124E9                 sub     esi, ecx
.text:000124EB                 cmp     esi, 10h
.text:000124EE                 jb      short loc_1251D
.text:000124F0                 lea     eax, [edx+eax*4] ; get the data pointer.
.text:000124F3                 mov     ecx, [eax+8]
.text:000124F6                 xor     ecx, [eax]
.text:000124F8                 cmp     ecx, 45AB8C01h  ; compute the data checksums
.text:000124FE                 jnz     short loc_1251D
.text:00012500                 mov     ecx, [eax+0Ch]
.text:00012503                 xor     ecx, [eax+4]
.text:00012506                 cmp     ecx, 24601E69h
.text:0001250C                 jnz     short loc_1251D
.text:0001250E                 test    edi, edi
.text:00012510                 jz      short loc_1251D
.text:00012512                 xor     eax, eax
.text:00012514                 mov     RemoteAddress, edi
.text:0001251A                 inc     eax
.text:0001251B                 jmp     short loc_1251F
.text:0001251D ; ---------------------------------------------------------------------------
.text:0001251D
.text:0001251D loc_1251D:                              ; CODE XREF: GetRemoteAddress+2C↑j
.text:0001251D                                         ; GetRemoteAddress+45↑j ...
.text:0001251D                 xor     eax, eax
.text:0001251F
.text:0001251F loc_1251F:                              ; CODE XREF: GetRemoteAddress+8B↑j
.text:0001251F                 pop     edi
.text:00012520                 pop     esi
.text:00012521                 retn
.text:00012521 GetRemoteAddress endp

最后数据回发:样本执行命令产生的数据都会保存在内存中,当数据长度超过0xfa000 时,会根据之前获取的ip/port 构造网络包 经 tcp/ip protoncol driver 的 SendHandler 函数发走。

基于ndis protocol driver 后门 分析相关推荐

  1. MSDN系列 14 -- NDIS Protocol Driver 入门

    日期: 2004-07-19 16:55 更新: 2004-08-17 16:23 链接: http://www.opencjk.org/~scz/windows/200408171624.txt - ...

  2. 基于NDIS(网络驱动接口标准)包拦截技术

    看了很多提供数据包的拦截技术,其中最多的是编写IM DRIVER在NDIS中间层对MINIPORT(网卡驱动程序)和协议驱动程序之间的数据包进行拦截.但编写该过滤程序拦截程序非常的复杂,这里介绍一种更 ...

  3. 基于ndis的防火墙源码供大家赏析firewall c

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! #inc ...

  4. 基于FFmpeg的运动视频分析

    本文来自英特尔资深软件工程师李忠,张华在LiveVideoStackCon 2018大会上的分享,由LiveVideoStack整理而成.分享中两位老师重点介绍了基于FFmpeg的运动视频分析技术架构 ...

  5. 基于Bert的微博舆论分析Web系统

    基于Bert的微博舆情分析Web系统 效果演示(gif演示) 一.项目介绍 1.1 项目简介 本次项目是基于Bert模型搭建一个能够对于微博的言论进行情感分析的一个Web系统,这样人们就能够快速的通过 ...

  6. 基于framebuffer(fb)的驱动分析

    基于framebuffer的驱动分析 framebuffer帧缓冲(简称fb)是linux内核中用代码虚拟出的一个设备,是一个platform类型设备,设备文件位于/dev/fb* 在嵌入式系统中一般 ...

  7. 基于itchat的个人情感分析

    基于itchat的个人情感分析 昝道广 概述 前言 思考 性别分析 好友签名情感分析 地区分布 爬虫技术分析 代码解析(部分) 后记 前言 本文以迅雷不及掩耳盗铃儿响叮当机立断章取义无反顾,雄姿英发, ...

  8. 有源淹没分析arcgis_基于ArcGIS的洪水淹没分析与三维模拟

    基于 ArcGIS 的洪水淹没分析与三维模拟 孙 君 , 奚赛英 , 尤 迪 , 郑付涛 [摘 要] 摘 要 : 洪水淹没范围的确定是洪灾损失评估和防洪决策的核心环节 . 基 于 TIN 数据 , 运 ...

  9. 基于linux服务器的性能分析与优化

    基于linux服务器的性能分析与优化 方面:硬件系统软件网络 现象:系统不稳定相应速度慢 web无法打开打开速度慢 方案:硬件故障更换硬件或升级硬件 系统问题修改系统参数和配置 软件问题修改和升级软件 ...

最新文章

  1. PHP扩展开发系列01 - 我要成为一名老司机
  2. sql serve 数据库游标的使用
  3. 的写法_朋友圈文案标题的写法
  4. zzbower入门教程
  5. 八大排序算法(5)——快速排序
  6. 现实的复杂性与系统的复杂性
  7. 股票实战分析专题-金融量化初级练习使用
  8. 国内运营商的Sim卡在日版iPhone上的使用方法(卡贴安装方法)
  9. 小伙子不讲武德,竟用Python爬取了B站上1.4w条马老师视频数据来分析
  10. 微信公众号内下载pdf等文件,受微信所限制,安卓和IOS不同处理方式(最最最优版)
  11. 推荐系统3--FM和FFM
  12. 软件开发培训机构怎么样?靠谱吗?软件开发培训班哪个好?
  13. throttle在程序中的作用
  14. 人力资源管理的现状及发展趋势
  15. java-php-python-ssm猫咪伤患会诊复查医疗平台计算机毕业设计
  16. Microsoft Intune简介
  17. c++中的const关键字
  18. css分隔线中间带文字
  19. CentOS升级libzip
  20. 使用i标签添加简单图标

热门文章

  1. 安卓8.0-MT6763平台 st7701s-MIPI转RGB屏调试
  2. 小米官网搜索框部分详解
  3. Blender 3.5 面的操作(二)
  4. MATLAB笔记之wordcloud文字云(lib)的基本使用
  5. APP下载量成空洞,留住用户最关键
  6. 今日芯声 | 微软 Xbox 老大:关闭游戏直播平台 Mixer,我没有遗憾
  7. Illustrator国画效果
  8. uniCloud更新APP
  9. A Game of Thrones(11)
  10. 计算机学院校园文化标语,智慧校园文明宣传标语