Sinowal Bootkit 分析-中国红客网络技术联盟 - Powered by Discuz!_bootkit 0x9f400_wrmsr的博客-程序员秘密

技术标签: Sinowal Bootkit 分析  逆向  

(一)模块组成
        感染过Sinowal的电脑,Sinaowal在硬盘中的分布如下图:
; Sector                 Offset                 Size                          Name
; ----------------------------------------------------------------------------------------------------------------------
; 0                         0000h             512             Bootloader
; 60                       7800h             512             Ntldr Hook Code
; 61                       7A00h             512             Kernel Code
; 62                       7C00h             512             Original Bootloader
(二)Bootloader 分析
     (a)  Bootloader 的主要功能。
首先将sinowal的其他部分读入内存,然后Hook int 13h ,最后将原始的BootLoader 载如内存 0x7c00处,执行原始代码。
内存映像为:
| 0x9f400 - 0x9f600   |  0x9f600 -0x9f800  | 0x9f800 -0x9fa00 |
; ----------------------------------------------------------------------------------------------------------------------
|Bootloader               |  Ntldr Hook Code    | NtosHookCode   |
(b)int 13hook 函数的执行逻辑
     在读入的数据流中搜索特征码 8B F0 85 F6 74 21 80 3D 这段特征码对应的代码如下:
.text:00422A6A      call    [email protected] ;
.text:00422A6F      mov    esi, eax                    ;8bf0
.text:00422A71      test     esi, esi                  ;85f6
.text:00422A73      jz      short loc_422A96           ;7421
.text:00422A75      cmp    _BlRebootSystem, 0          ;80 3D F8 AE 43 00 00
定位到特征码后,进行第一次Hook  将8B F0 85 F6 74 21 的6个字节替换为ff 15 fc f5 09 00 即 call  dword  ptr  [0x9f5fc], Hook后的代码如下:
.text:00422A6A       call    [email protected]
.text:00422A6F       call     dword  ptr  [0x9f5fc]        ;注:[0x9f5fc]保存的地址是 0x9f600,为Ntldr Hook Code
.text:00422A75       cmp    _BlRebootSystem, 0;
(三)Ntldr Hook Code 分析
     (a) 保存现场环境
mov esi,eax
test eax,eax
pushf
jnz Hook_Handler
add [esp+4],dword 21h
Hook_Handler:
pushad
mov edi,[esp+24h]
and  edi,0FFF00000h
          *** *** ***
     (b)搜索全局变量 BlLoaderBlock
      将函数函数的返回地址按4kb对齐,然后在Ntldr代码区搜索特征码 C7 46 34 00 40 ,该特征码对应的代码为:
.text:00415914                 mov     dword  ptr [esi+34h], 4000h     ; C7 46 34 00 40
.text:0041591B                 mov     word  ptr [esi+38h], 1          ; 66 C7 46 38 01 00
.text:00415921                 mov     eax,   _BlLoaderBlock           ;  A1 C4 82 46 00     注 :C4 82 46 00 为地址部分
         由此可定位到 BlLoaderBlock,其类型为PLOADER_PARAMETER_BLOCK,。在BlLoadBootDrivers调用以后,所有Boot型的驱动都会被                                  加入到内存中,相关信息,如地址,名称,大小等都会保存到链表 BlLoadBootDrivers中。
      (c)定位系统初始化时IoInitSystem的调用点
        根据上一步骤获取到的BlLoadBootDrivers可定位到NtosKernel的ImageBase 和SizeOfImage,然后搜获特征码6A 4B 6A 19 E8 * * * * E8 * * * *
         此处对应的代码为:
INIT:005ACEC9          push    4Bh                                         ;6a 4b
INIT:005ACECB          push    19h                       ;6a 19
INIT:005ACECD          call    [email protected]  ; E8 **
INIT:005ACED2          push    dword ptr [ebp-470h]
INIT:005ACED8          call    [email protected]             ; E8 **
         由此可搜索到IoInitSystem  将IoInitSystem地址 和 Ntoskenel 基址保存在 0x9f800 + 4 和 0x9f800 + 0xc处
         将0x9f800 —0x9fa00处共512字节的代码挪至Ntoskenel 尾部(0x8068)
         将 call  [email protected] 替换成 call 0x8068 完成对NtOskernel的hook
(四)Kernel Code  Hook
       根据之前保存的Ntoskenel 基址,搜索到ExAllocatePool 申请一片内存(分页内存池和非分页内存池都已初始化完毕),将代码挪个窝
       然后调用 原始IoInitSystem,调用完成后,windows执行体函数大多可以使用了。
       可搜索ZwCreateKey,ZwClose创建“Registry\Machine\System\BootKit”
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wrmsr/article/details/24778559

智能推荐

Vue中extend基本用法_vue.extend_小铁匠95的博客-程序员秘密

1.Vue.extend(options)参数:{Object} options用法:使用基础Vue构造器,创建一个"子类"。参数是一个包含组件选项的对象。data选项是特例,需要注意,在Vue.extend()中它必须是函数。<html> <head> <title>Vue.extend 用法</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue

系统架构设计师论文范文_zhmq_top的博客-程序员秘密

论混合软件架构的设计摘要:2007年3月,我所在的公司组织开发了一套完整的变电综合信息管理系统,在这个项目中,我担任系统架构设计师职务,主要负责软件架构和网络安全体系架构设计的工作。该系统包括变电运行所需的运行记录、图形开票、安全生产管理、生产技术管理、行政管理、总体信息管理、技术台帐管理、班组建设、学习培训、系统维护等各个业务层次模块。本文首先简单地分析了C/S架构和B/S架构各自的优缺点,然后说明了混合C/S架构和B/S架构的必要性,分析了“内外有别”和“查改有别”两种混合模型,并以变电综合信息管

python直方图拟合曲线,用python拟合直方图_weixin_39636609的博客-程序员秘密

I have a histogramH=hist(my_data,bins=my_bin,histtype='step',color='r')I can see that the shape is almost gaussian but I would like to fit this histogram with a gaussian function and print the value o...

python3 opencv 视频格式转换_python opencv视频类型转换_李亮_sdu的博客-程序员秘密

python3 opencv 视频格式转换:import cv2 #获得视频的格式 videoCapture = cv2.VideoCapture('ad3.avi') #获得码率及尺寸 fps = videoCapture.get(cv2.cv.CV_CAP_PROP_FPS) size = (int(videoCapture.get(cv2.cv.CV_C...

女朋友的预算python_哈哈哈哈喽呀的博客-程序员秘密

while 1: sum_price = int(input("请输入预算:")) print(sum_price) if sum_price>10000: print("超出预算") else: goods = input("物品的价格:") goods = goods.strip(" ").split(" "..

万剑归宗—架构设计中的抽象思维与具象思维_NeilHappy的博客-程序员秘密

新项目上线,用户量不断增加,工作中继续不断发现问题,解决问题。花一点时间来总结一下自己对架构设计的理解。 小小的打个广告。这篇文章是发布在neil的微信公众号上。neil的文章都会第一时间发布在微信公众号上。欢迎小伙伴们关注。                      微信公众号:互联网与作曲家   武侠小说中的“万剑归宗”---

随便推点

java有final和static修饰的调用顺序_final和static顺序_qq_42569136的博客-程序员秘密

1.被static final修饰的变量分为两种,一种是不带new,另一种带new,不带new的一开始就加载,带new的有没有final调用顺序都和static调用顺序一样。如://第一种,会在一开始的时候就放入常量池。并且直接引用的时候不会加载所在类的任何其它静态方法或函数public static final String name = "张三"//第二种,有new的,会像普通stat...

golang 借助于内置sort.slice包实现排序_汤姆和杰瑞1234的博客-程序员秘密

golang使用内置sort包实现排序使用sort.Slice()方法实现数组的排序操作系统和开发环境sort.Slice()介绍实现(直接上代码了)运行结果截图使用sort.Slice()方法实现数组的排序使用内置的sort.slice接口实现数组的排序是我目前所知的比较简单的一种排序方式,可以很快的实现数组的排序,个人比较推崇。我所知道的另外一种基于sort包的排序,需要首先写一个结构体...

RAM,SRAM,SDRAM工作原理(很长)_Phenixyf的博客-程序员秘密

存储原理:  为了便于不同层次的读者都能基本的理解本文,所以我先来介绍一下很多用户都知道的东西。RAM主要的作用就是存储代码和数据供CPU在需要的时候调用。但是这些数据并不是像用袋子盛米那么简单,更像是 图书馆中用有格子的书架存放书籍一样,不但要放进去还要能够在需要的时候准确的调用出来,虽然都是书但是每本书是不同的。对于RAM等存储器来说也是一样的,虽然存储的都是代表0和1的代码,但是不同的组...

POI 通用 读取excle xls xlsx 文件_poi 用什么读取xls_Yweir的博客-程序员秘密

格式要求:文件中第一行必须是标题 全文不能有合并单元格例如:姓名性别张三男xlsx 文件读取 /** * 读取xlsx文件 * @param inputStream * @return * @throws IOException */ public static List<List<String>> getXlsxList(InputStream inputStream) throws IOException { /** 对

golang编程之获取命令行参数及环境变量_golang flag包 环境变量_blade2001的博客-程序员秘密

http://blog.chinaunix.net/uid-24774106-id-3990722.html  我们写习惯了C代码,都知道了解析输入参数argc argv,获取环境变量env,常见的C语言main函数有:    int main(int argc,char* argv[],char** envp)    我们首先给出C语言的获取命令行参数和环

MWeb 更新程序员秘密_没文艺的少年的博客-程序员秘密

首先自然是下载安装Mweb,这个不多说。直接切入正题。1.在偏好设置里面设置发布服务,直接上图: 选择Metaweblog API,然后填入博客网址(http://blog.csdn.net/用户名) 、账号、密码,api网址按上图填入,点击验证,如果在博客名称一栏自动生成了谁谁谁的博客就对了,否则就是没填对以上信息。2.发布博客 做了上面那一步就可以发布博客了,以

推荐文章

热门文章

相关标签