ywledoc 发表于 2011-4-7 19:09:52

半成品之----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;
}

ywledoc 发表于 2011-4-7 22:05:15

找不到一个快速的方法来得到AtapiStartIo的地址。

马大哈 发表于 2011-4-8 08:45:39

WPON/WPOFF

WP=weapon...??;P

ywledoc 发表于 2011-4-8 09:29:29

回复 马大哈 的帖子

{:1_109:}
找不到好方法啊~

乔丹二世 发表于 2011-4-8 09:42:06

回复 ywledoc 的帖子

您能解释一下这玩意有什么用吗?

ywledoc 发表于 2011-4-8 10:09:00

回复 乔丹二世 的帖子

别的没什么,防止底层的,特定扇区的读写~

马大哈 发表于 2011-4-8 10:34:33

文件保护?

ywledoc 发表于 2011-4-8 11:45:23

本帖最后由 ywledoc 于 2011-4-8 11:51 编辑

回复 马大哈 的帖子

比文件系统更底层的文件保护~文件的读写,迟早要换成磁盘的读写,在磁盘(atapi.sys)的扇区层面上~做保护~
360用这个来防mbr读写,以前的穿还原也是在这层做手层。

马大哈 发表于 2011-4-8 14:53:30

我K,越做越底层了......到最后不会直接拦到硬盘指令级别去吧......

干脆做个硬件插在硬盘上,这下彻底过滤了,哈哈.

ywledoc 发表于 2011-4-8 15:02:32

回复 马大哈 的帖子

小哨兵还原卡好像曾经也被人穿过~

ywledoc 发表于 2011-4-10 00:56:29

回复 naylon 的帖子

drvExt?
大牛~你想说什么呢?

Tesla.Angela 发表于 2011-4-11 12:15:59

回复 ywledoc 的帖子

naylon不是大牛,是神童哦,人家还木有成年呢。。。
还有一个核心会员叫xiaoly99,那个人更神了,小学还没有毕业就写了一大堆驱动了!!!
每逢我想到这里,都感到压力很大。。。

ywledoc 发表于 2011-4-11 12:18:27

回复 Tesla.Angela 的帖子

naylon是神童我知道~
但是xiaoly99,小学还没毕业?!!!我去啊!!!!
他那边小学都是读20年的吧!

Tesla.Angela 发表于 2011-4-11 12:19:29

回复 ywledoc 的帖子

xiaoly真的小学没有毕业,12岁。。。

ywledoc 发表于 2011-4-11 12:25:37

本帖最后由 ywledoc 于 2011-4-11 12:25 编辑

回复 Tesla.Angela 的帖子

你也让我的压力也大起来了~我小学电脑还不知道~

Tesla.Angela 发表于 2011-4-11 17:00:29

回复 ywledoc 的帖子

我小学时会用VBS。。。

ywledoc 发表于 2011-4-11 19:23:38

回复 Tesla.Angela 的帖子

小学电脑都没摸过~家人对我玩电脑严防死打,就怕上瘾~

ywledoc 发表于 2011-4-14 18:52:36

回复 naylon 的帖子

生病三天了,终于好点了~不是跟DrvExt里的StartIo不一样~

jiedengye 发表于 2011-5-18 13:57:35

这大家都什么人呢 我小学不知道电脑为何物

kk1025 发表于 2013-4-10 21:18:21

真的要好好研究一下。
页: [1]
查看完整版本: 半成品之----AtapiStartIo