-
-
[原创]R3层硬盘格式化的防护
-
发表于:
2017-11-16 20:58
4154
-
1.项目概述
本项目主要是实现在R3层对硬盘格式化的防护,如何防护,首先必须知道用户在操作时,是如何格式化硬盘的。由于是在R3层,所以肯定不如R0层那么保险,但是要比R0层考虑的多。
程序主要分为两部分,一部分是对R3层API的处理,另一部分是对bat的处理。因为,用户在R3层格式化,无非就是使用着两种方法来格式化硬盘。
2.开发平台与开发工具
目标运行平台:Windows 2008 32位
开发平台:Windows 10
开发工具:WDK、VS2013、VMware(虚拟机)
3.R3层格式化的分析
当我们要格式化硬盘,一般是如何进行的嘞?主要有2大类方法:一类是使用API来格式化,另一类是使用format.com写好BAT脚本来格式化。
先说说使用API来格式化,使用API如何格式化,使用什么API?这是本节要讨论的问题。格式化最常用的做法是,在硬盘上右键,然后选择格式化,弹出一个对话框,选好选择,然后点击格式化,那么此硬盘就会被格式化。另外也比较常用的格式是自己写一个小程序,然后运行,格式化。那么,无论哪种,最终使用的都是调用系统API来实现的。一般格式使用到的API有两个(一个是微软公开的,另一个是微软为公开的),分别是SHFormatDrive和FormatEx。使用SHFormatDrive比较容易,而且资料很多,直接写一个小程序调用即可(如果不做处理,调用此API也会和在硬盘上右键格式化,弹出一个对话框,根据网友经验,如果句柄设为空,格式化是不会弹框。当然还有另一种方法,在调用后,再给此窗口发送一消息,自动点击对话框,实现不弹窗的功能)。对于FormatEx来格式化,资料比较少,但是这个API的确好用,直接调用,然后再回调函数中返回执行的格式化进度。知道了使用这两个API,那么如何不让他们执行或者说不让用户格式化?最常用的莫过于HOOK了,对于HOOK,读者可自行度娘,同时本文也提供相应的源代码,读者可自行阅读。本文的做法是,HOOK这两个函数,然后让其执行自己的函数,从而达到保护硬盘。
当然,由于是在R3层,R3层格式硬盘的方法仅仅通过HOOK,是无法到达正真的保护目录,用户还可以通过CMD来格式化,使用CMD如何格式?前面提过,主要是使用format.com。对如使用format.com,我们改如何防护?有两种方法,一直是逆向format.com,找到format.com使用如何方式来格式化的;另一种,也是比较简单的一种方法,本文采用此方法,方法是不让用户使用format.com,如何不让用户使用format.com?我们的做法是改名字,对就是该名字,将format.com更改为format.com_bak或其他名字,是用户不能使用format.com。
说到这,读者应该知道本文在R3层保护硬盘格式化的主要思想了,知道了思想,做起来就容易多 了。
4.模块设计与划分
本程序主要有两部分,一部分是HOOK格式化API,另一部分是修改format.com。对应HOOK,当我们HOOK了API,还需将其注入到对应的进程中,这样才能达到保护的目的,对改怎么注入,有两种方法:一种是注入到explorer.exe中,注入到此进程中,可到达用户操作界面右键格式化,另一种是注入到用户进程中,达到保护防止用户调用API来格式磁盘。对应注入,也有两种方法,一种是使用全局钩子,但是此方法只实用与有窗口的进程。另一种是遍历所有进程或可能会调用格式磁盘API的进程,然后注入。
对于修改format.com名字,那可就容易多了,只需使用微软提供的API:MoveFileEx。此函数很强大,它的第上参数,如果设置为MOVEFILE_DELAY_UNTIL_REBOOT,能修改所有的文件文件名,对于正在运行的或在进入桌面后保护起来的文件及一些恶意软件的文件,使用此函数,然后重启,即可达到更改文件名的目的。
本程序模块分为两部分,一部分是用于注入的DLL,另一部分是注入DLL的方法和修改format.com的方法。
附录
由于本文只是在R3层用来保护磁盘不被格式的,所以不着重讲解技术,但是,所有技术,完全在代码中,读者可以直接分析与使用。对于HOOK,最揪心的莫过于堆栈平衡,一般函数定义为__stdcall,对于大部分都没问题,但是对于有回调的函数,可能就还得用户自己平衡堆栈,如果平衡堆栈?我在此就献一下丑。
首先在调用函数出,下断点,右键,转到汇编(此处以CS2013为例)会看到如下图数据:
其中,红色部分就是判断堆栈平衡,由于执行的是自己的函数,执行完成后,将两个寄存器数据相减,如果不相等,说明堆栈未平衡,反之即可得到需平衡的平衡数,然后再HOOK中自己的函数中写下如下代码(ret 返回数需自己根据情况而定):
_asm
{
pop edi
pop esi
pop ebx
add esp, 0E4h
mov esp, ebp
pop ebp
xor eax, eax
ret 0x1C
}
将DLL注入explorer.exe,右键磁盘,格式化,即可拦截。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)