半成品之----AtapiStartIo
采用了点硬编码,只是实验性质的,目前正在弄,半成品别的没什么,防止底层的,特定扇区的读写~
要防删除文件什么的,还要再把MFT保护起来#include <wdm.h>
#include <srb.h>
#include <windef.h>
NTSTATUS
DriverEntry( PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegisterPath);
#pragma alloc_text(INIT, DriverEntry)
////////////////////////////////////////
//global
///////////////////////////////////////
char jmpcode = { 0xE9, 0x00, 0x00 , 0x00, 0x00};
char origcode = { 0};
ULONG g_orig_addr = 0xf97a197e;
///////////////////////////////////////
//function
///////////////////////////////////////
VOID WPON()
{
__asm{
mov eax,cr0
or eax,0x10000
mov cr0,eax
STI
}
}
VOID WPOFF()
{
__asm{
cli
mov eax, cr0
and eax,not 0x10000
mov cr0,eax
}
}
VOID
DriverUnload( PDRIVER_OBJECT DriverObject )
{
KIRQL oldIrql;
WPOFF();
oldIrql = KeRaiseIrqlToDpcLevel();
RtlCopyMemory( (BYTE*)g_orig_addr, origcode, 5 );
KeLowerIrql(oldIrql);
WPON();
}
__declspec(naked)
NTSTATUS
orig_AtapiStartIo( PVOID devext_addr_ach,
struct _SCSI_REQUEST_BLOCK* srb
)
{
__asm
{
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
}
}
BOOLEAN
fake_AtapiStartIo( PVOID devext_add_ach,
struct _SCSI_REQUEST_BLOCK* srb
)
{
ULONG max,min;
max = 4868496+57;
min = 4868496;
if( srb->QueueSortKey <= max &&
srb->QueueSortKey >= min)
{
KdBreakPoint();
}
return orig_AtapiStartIo(devext_add_ach, srb);
}
VOID
InlineHook( ULONG orig_addr,
ULONG fake_addr)
{
ULONG distance;
KIRQL oldIrql;
char jmp_orig_code = {0xEA, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00 };
distance = fake_addr-orig_addr-5;
RtlCopyMemory( origcode, (BYTE*)orig_addr, 5);
RtlCopyMemory( jmpcode+1, (BYTE*)&distance, 4);
WPOFF();
oldIrql = KeRaiseIrqlToDpcLevel();
RtlCopyMemory( (BYTE*)orig_AtapiStartIo, (BYTE*)origcode, 5);
*( (ULONG*)(jmp_orig_code + 1) ) = (ULONG)((BYTE*)orig_addr + 5);
RtlCopyMemory( (BYTE*)orig_AtapiStartIo+5, jmp_orig_code, 7);
RtlCopyMemory( (BYTE*)orig_addr, jmpcode, 5);
KeLowerIrql(oldIrql);
WPON();
KdPrint(("\nthe inline hook has done!\n"));
KdBreakPoint();
return;
}
NTSTATUS
DriverEntry( PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegisterPath)
{
NTSTATUS status;
DriverObject->DriverUnload = DriverUnload;
InlineHook( g_orig_addr, (ULONG)fake_AtapiStartIo);
status = STATUS_SUCCESS;
return status;
} 找不到一个快速的方法来得到AtapiStartIo的地址。 WPON/WPOFF
WP=weapon...??;P 回复 马大哈 的帖子
{:1_109:}
找不到好方法啊~ 回复 ywledoc 的帖子
您能解释一下这玩意有什么用吗? 回复 乔丹二世 的帖子
别的没什么,防止底层的,特定扇区的读写~ 文件保护? 本帖最后由 ywledoc 于 2011-4-8 11:51 编辑
回复 马大哈 的帖子
比文件系统更底层的文件保护~文件的读写,迟早要换成磁盘的读写,在磁盘(atapi.sys)的扇区层面上~做保护~
360用这个来防mbr读写,以前的穿还原也是在这层做手层。 我K,越做越底层了......到最后不会直接拦到硬盘指令级别去吧......
干脆做个硬件插在硬盘上,这下彻底过滤了,哈哈. 回复 马大哈 的帖子
小哨兵还原卡好像曾经也被人穿过~ 回复 naylon 的帖子
drvExt?
大牛~你想说什么呢?
回复 ywledoc 的帖子
naylon不是大牛,是神童哦,人家还木有成年呢。。。
还有一个核心会员叫xiaoly99,那个人更神了,小学还没有毕业就写了一大堆驱动了!!!
每逢我想到这里,都感到压力很大。。。 回复 Tesla.Angela 的帖子
naylon是神童我知道~
但是xiaoly99,小学还没毕业?!!!我去啊!!!!
他那边小学都是读20年的吧! 回复 ywledoc 的帖子
xiaoly真的小学没有毕业,12岁。。。 本帖最后由 ywledoc 于 2011-4-11 12:25 编辑
回复 Tesla.Angela 的帖子
你也让我的压力也大起来了~我小学电脑还不知道~ 回复 ywledoc 的帖子
我小学时会用VBS。。。 回复 Tesla.Angela 的帖子
小学电脑都没摸过~家人对我玩电脑严防死打,就怕上瘾~ 回复 naylon 的帖子
生病三天了,终于好点了~不是跟DrvExt里的StartIo不一样~ 这大家都什么人呢 我小学不知道电脑为何物 真的要好好研究一下。
页:
[1]