首页
论坛
课程
招聘
[系统底层] [原创]保护干涉文件的玩意
2008-9-4 22:53 9658

[系统底层] [原创]保护干涉文件的玩意

2008-9-4 22:53
9658
今天很倒霉,电脑到中关村修了一天,最终确定是主板问题,无奈换了个主板(从此决定以后有钱一定要买个IBM THINKPOD的本本),然后很不爽的重装了系统,写的code因为电脑突然挂掉,重新打开全是乱码,弄了半天的心血一下就over了,之前也没备份,只能重写之.

      好久不写东西,这次放点儿好玩的陈旧的东西: object+keyboard+bugcheck.
       取几个关键例程(IopXX)的地址后,替换或Inline hook掉,在其中可以很强大的监控到系统的很多频繁操作,ARK来它来记录监控,以后对比分析系统中可能存在的RK,是个不错的想法. 其中一个小模块可以用来干涉文件的解析,查询,复制,打开,删除等操作.

       比如我挂钩了其中的2个函数,一个是解析文件,一个是标记文件状态,只要是我们关心的文件和文件夹, 都可以处理过滤掉. 或者流氓一点,可以让其直接蓝调(方法很多,直接来个Int 3,就OK了). 流氓用来做文件自我保护是个不错的选择. 当然对于狙剑这样没有经过文件系统,而是自己解析磁盘的,挂钩函数就不起作用了. 但一般的ARK: IS, Wsyscheck, Gmer统统无视. 为了演示效果,我把让其一碰就蓝的code注掉了,换成一碰就自动关闭当前窗口 / 最小化所有窗口 / 切换到登录状态, 即驱动模拟按键: ALT+F4, (TABLE), ENTER, ALT+ESC, WIN+M , WIN+R +"logoff"/"shutdown -l", WIN+L....

      当然注销的等待时间太长了,驱动中没有找到可以直接注销的方法,只能模拟按键; ALT+F4关闭当前窗口是个不错的选择,当然好多自我保护做的不错的软件已经屏蔽掉这个了.或者弹个messagebox; WIN+L只是切换到登录状态, 干扰用户的正常操作,效果也不是很好. 当然,若不是做流氓程序,保护文件时自然不能让其直接BSOD, 除了上面的方法,还是有其他的一些猥亵选择的,大家自己发挥想象,原理就是callback函数中一旦接受到notify,你可以立即进行处理, 设置EVENT,让R3程序来搞,或者检测到安全软件的启动,就把隐藏的进程还原出来,把恶意行为隐藏起来,等到安全软件退出时,再立马启动....

      测试了下360和微点,效果不错,嘿嘿,发点儿关键code
// 保护我们的文件
    if ( IOFILE_INDEX == ObjectIndex) {
         FileName = (PUNICODE_STRING)((UCHAR *)Object+0x030) ;
          RtlCopyMemory(Name, FileName->Buffer, FileName->MaximumLength );
         _wcsupr(Name);

        if (wcsstr(Name , L"SUDAMI") ||
             wcsstr(Name , L"360") ||
             wcsstr(Name , L"MP") ||
             wcsstr(Name , L"DOWNLOAD") ) {
            //检查是不是要保护的文件
             DbgPrint("HandleDelete: Deny\n");

            if ( TRUE == g_kb_valid )
             {
//          sendkb(0x3b, KEY_MAKE);
//          sendkb(0x3b, KEY_BREAK);

                // ALT + ESC
//          sendkb(0x38, KEY_MAKE);
//          sendkb(0x1, KEY_MAKE);
//          sendkb(0x38, KEY_BREAK);
//          sendkb(0x1, KEY_BREAK);

                // ALT + F4
                 sendkb(0x38, KEY_MAKE);
                 sendkb(0x, KEY_MAKE);
                 sendkb(0x, KEY_BREAK);
                 sendkb(0x38, KEY_BREAK);
                // enter
                 sendkb(0x1c, KEY_MAKE);
                 sendkb(0x1c, KEY_BREAK);

                // WIN + M
                 sendkb(0x5b, 2);
                 sendkb(0x, KEY_MAKE);
                 sendkb(0x, KEY_BREAK);
                 sendkb(0x5b, 3);

                /*
         //
         // 模拟注销
         //

         // WIN + r
         sendkb(0x5b, 2);
         sendkb(0x, KEY_MAKE);
         sendkb(0x, KEY_BREAK);
         sendkb(0x5b, 3);

         // shutdown -l
         sendkb(0x1f, KEY_MAKE);
         sendkb(0x1f, KEY_BREAK);
         sendkb(0x23, KEY_MAKE);
         sendkb(0x23, KEY_BREAK);
         sendkb(0x16, KEY_MAKE);
         sendkb(0x16, KEY_BREAK);
         sendkb(0x14, KEY_MAKE);
         sendkb(0x14, KEY_BREAK);
         sendkb(0x20, KEY_MAKE);
         sendkb(0x20, KEY_BREAK);
         sendkb(0x18, KEY_MAKE);
         sendkb(0x18, KEY_BREAK);
         sendkb(0x11, KEY_MAKE);
         sendkb(0x11, KEY_BREAK);
         sendkb(0x31, KEY_MAKE);
         sendkb(0x31, KEY_BREAK);
         sendkb(0x39, KEY_MAKE);
         sendkb(0x39, KEY_BREAK);
         sendkb(0xc, KEY_MAKE);
         sendkb(0xc, KEY_BREAK);
         sendkb(0x26, KEY_MAKE);
         sendkb(0x26, KEY_BREAK);

         // enter
         sendkb(0x1c, KEY_MAKE);
         sendkb(0x1c, KEY_BREAK);
         */


                // WIN + L
//          sendkb(0x5b, 2);
//          sendkb(0x26, KEY_MAKE);
//          sendkb(0x26, KEY_BREAK);
//          sendkb(0x5b, 3);
             }
   
//       ProbeForWrite(sudami,4,4); // let it BSOD.hoho~
            return ;
             DbgPrint("nerver be here~\n");
            goto skip; // nerver be here~
         }   
     }

另外,禁止文件的创建,访问,打开等操作,简单点儿的不需要FSD层面,只需挂钩一个函数 即可.微点就是这么做的.嘿嘿,放点儿关键code,大家自由发挥吧:

NTSTATUS
fake_IoCheckShareAccess(
     ACCESS_MASK DesiredAccess,
    ULONG DesiredShareAccess,
     PFILE_OBJECT FileObject,
     PSHARE_ACCESS ShareAccess,
    BOOLEAN Update
     )
{
     NTSTATUS stat ;
    WCHAR Name[300];
     PUNICODE_STRING FileName;
    BOOLEAN ReadAccess;
    BOOLEAN WriteAccess;
    BOOLEAN DeleteAccess;
   
    _asm pushad
    _asm pushfd

    /* Get access masks */
     ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)) != 0;
     WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA)) != 0;
     DeleteAccess = (DesiredAccess & DELETE) != 0;
        
     FileName = (PUNICODE_STRING)((UCHAR *)FileObject+0x030) ;
     RtlCopyMemory(Name, FileName->Buffer, FileName->MaximumLength );
     _wcsupr(Name);
     DbgPrint("%s", Name);
     if (wcsstr(Name , L"SUDAMI") /*&& (WriteAccess || DeleteAccess || ReadAccess)*/ )
     {
        //检查是不是要保护的文件
         DbgPrint("IoCheckShareAccess - Deny\n");
        
        _asm popfd
        _asm popad

         stat = 0xC0000043;
        goto skip;        
     }
   
    _asm popfd
    _asm popad
        
     stat = orig_IoCheckShareAccess(DesiredAccess, DesiredShareAccess,
                     FileObject, ShareAccess, Update);
   
skip:
    _asm nop
    return stat;
}

睡觉咯~~

第五届安全开发者峰会(SDC 2021)议题征集正式开启!

收藏
点赞0
打赏
分享
最新回复 (16)
雪    币: 8671
活跃值: 活跃值 (665)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 活跃值 10 2008-9-4 23:55
2
0
睡觉了~~

没事的时候我就在想,现在人动不动就ring0,就hook 真能解决个问题么~~
唉~~
obj里那么多hook点,
HeXXX的那些Hook~~
不说了,睡觉了~~
雪    币: 521
活跃值: 活跃值 (119)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 活跃值 14 2008-9-5 00:40
3
0
2楼是大牛,看透了,整个文件操作流程,什么地方HOOK都一样
但是对于新人来说,要看透不容易啊
雪    币: 319
活跃值: 活跃值 (10)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
DiYhAcK 活跃值 2 2008-9-5 12:27
4
0
2楼大牛,膜拜。。。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kiki 活跃值 2008-9-5 12:40
5
0
THINKPOD

???

thinkpad???(不是已经被联想给收购了??)

不过学习了
雪    币: 478
活跃值: 活跃值 (580)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-9-5 15:14
6
0
联想的thinkpad还是不错的.
可是暂时没钱买...
雪    币: 1201
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ljtt 活跃值 1 2008-9-5 16:32
7
0
都在ring0下钩得不益乐乎,不用排队买票就是好啊。头疼的可能还是做产品的,即要保证自己能钩住,还不能被人抢了位置,抢到最后只有玩些没有文档的独门必杀技了。
雪    币: 301
活跃值: 活跃值 (29)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
HSQ 活跃值 8 2008-9-5 17:38
8
0
可以钩子套钩子的
雪    币: 203
活跃值: 活跃值 (53)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
XPoy 活跃值 3 2008-9-6 01:28
9
0
大牛呵,膜拜顺便俯卧撑。

不过,LZ提供的是实践note,爱啊。共享精神值得敬仰。
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kuwaitos 活跃值 2008-9-6 13:08
10
0
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
雪    币: 8671
活跃值: 活跃值 (665)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 活跃值 10 2008-9-6 13:54
11
0
IoCheck那个可以绕过~~
要防止可怕的ARK才行~~
SBR流行了
雪    币: 295
活跃值: 活跃值 (75)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SkyJack 活跃值 2008-9-6 14:25
12
0
好文,学习ing...
雪    币: 478
活跃值: 活跃值 (580)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-9-6 15:02
13
0
嗯,IoCheckXX可以自己实现.不过好多ARK都忽略了这个函数,所以...

scsi之流还行吧.看来今后大家都得自己解析磁盘了.IRP都不敢发
雪    币: 251
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
ufphpc 活跃值 2 2008-9-8 10:44
14
0
自己解析磁盘也得发IRP吧
雪    币: 478
活跃值: 活跃值 (580)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-9-8 19:45
15
0
不用.所谓解析,就得自己分析磁盘的那些索引,簇,...然后readfile读出来,或者用LBA来稿,方法很多,自由发挥咯~
雪    币: 315
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rocketming 活跃值 2008-9-9 22:17
16
0
也没什么,很一般嘛
雪    币: 7504
活跃值: 活跃值 (215)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 活跃值 15 2009-1-22 15:24
17
0

读扇区用不用发IRP?
游客
登录 | 注册 方可回帖
返回