基于ndis protocol driver 后门 分析
样本文件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 后门 分析相关推荐
- MSDN系列 14 -- NDIS Protocol Driver 入门
日期: 2004-07-19 16:55 更新: 2004-08-17 16:23 链接: http://www.opencjk.org/~scz/windows/200408171624.txt - ...
- 基于NDIS(网络驱动接口标准)包拦截技术
看了很多提供数据包的拦截技术,其中最多的是编写IM DRIVER在NDIS中间层对MINIPORT(网卡驱动程序)和协议驱动程序之间的数据包进行拦截.但编写该过滤程序拦截程序非常的复杂,这里介绍一种更 ...
- 基于ndis的防火墙源码供大家赏析firewall c
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! #inc ...
- 基于FFmpeg的运动视频分析
本文来自英特尔资深软件工程师李忠,张华在LiveVideoStackCon 2018大会上的分享,由LiveVideoStack整理而成.分享中两位老师重点介绍了基于FFmpeg的运动视频分析技术架构 ...
- 基于Bert的微博舆论分析Web系统
基于Bert的微博舆情分析Web系统 效果演示(gif演示) 一.项目介绍 1.1 项目简介 本次项目是基于Bert模型搭建一个能够对于微博的言论进行情感分析的一个Web系统,这样人们就能够快速的通过 ...
- 基于framebuffer(fb)的驱动分析
基于framebuffer的驱动分析 framebuffer帧缓冲(简称fb)是linux内核中用代码虚拟出的一个设备,是一个platform类型设备,设备文件位于/dev/fb* 在嵌入式系统中一般 ...
- 基于itchat的个人情感分析
基于itchat的个人情感分析 昝道广 概述 前言 思考 性别分析 好友签名情感分析 地区分布 爬虫技术分析 代码解析(部分) 后记 前言 本文以迅雷不及掩耳盗铃儿响叮当机立断章取义无反顾,雄姿英发, ...
- 有源淹没分析arcgis_基于ArcGIS的洪水淹没分析与三维模拟
基于 ArcGIS 的洪水淹没分析与三维模拟 孙 君 , 奚赛英 , 尤 迪 , 郑付涛 [摘 要] 摘 要 : 洪水淹没范围的确定是洪灾损失评估和防洪决策的核心环节 . 基 于 TIN 数据 , 运 ...
- 基于linux服务器的性能分析与优化
基于linux服务器的性能分析与优化 方面:硬件系统软件网络 现象:系统不稳定相应速度慢 web无法打开打开速度慢 方案:硬件故障更换硬件或升级硬件 系统问题修改系统参数和配置 软件问题修改和升级软件 ...
最新文章
- PHP扩展开发系列01 - 我要成为一名老司机
- sql serve 数据库游标的使用
- 的写法_朋友圈文案标题的写法
- zzbower入门教程
- 八大排序算法(5)——快速排序
- 现实的复杂性与系统的复杂性
- 股票实战分析专题-金融量化初级练习使用
- 国内运营商的Sim卡在日版iPhone上的使用方法(卡贴安装方法)
- 小伙子不讲武德,竟用Python爬取了B站上1.4w条马老师视频数据来分析
- 微信公众号内下载pdf等文件,受微信所限制,安卓和IOS不同处理方式(最最最优版)
- 推荐系统3--FM和FFM
- 软件开发培训机构怎么样?靠谱吗?软件开发培训班哪个好?
- throttle在程序中的作用
- 人力资源管理的现状及发展趋势
- java-php-python-ssm猫咪伤患会诊复查医疗平台计算机毕业设计
- Microsoft Intune简介
- c++中的const关键字
- css分隔线中间带文字
- CentOS升级libzip
- 使用i标签添加简单图标