首页
社区
课程
招聘
[原创]保护干涉文件的玩意
发表于: 2008-9-4 22:53 11295

[原创]保护干涉文件的玩意

2008-9-4 22:53
11295

今天很倒霉,电脑到中关村修了一天,最终确定是主板问题,无奈换了个主板(从此决定以后有钱一定要买个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;
}

睡觉咯~~


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (16)
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
睡觉了~~

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

???

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

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

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

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

读扇区用不用发IRP?
2009-1-22 15:24
0
游客
登录 | 注册 方可回帖
返回
//