微点交流论坛
» 游客:  注册 | 登录 | 帮助

 

作者:
标题: 【sudami】保护干涉文件的玩意
点饭的百度空间
银牌会员




积分 2315
发帖 2236
注册 2007-11-30
#1  【sudami】保护干涉文件的玩意

sudami

看雪软件安全论坛 > 软件安全 > 『软件调试论坛』【原创】保护干涉文件的玩意
http://hi.baidu.com/sudami/blog/ ... 041124720eecf7.html
--------------------------------------------------------------------------------

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

睡觉咯~~

cvcvxk
没事的时候我就在想,现在人动不动就ring0,就hook 真能解决个问题么~~
唉~~
obj里那么多hook点,
HeXXX的那些Hook~~
不说了,睡觉了~~

[ Last edited by 点饭的百度空间 on 2008-9-8 at 09:36 ]

※ ※ ※ 本文纯属【点饭的百度空间】个人意见,与【 微点交流论坛 】立场无关※ ※ ※

你的微笑 is 微点的骄傲!
http://hi.baidu.com/new/micropoint
2008-9-8 09:34
查看资料  发送邮件  访问主页  发短消息   编辑帖子



论坛跳转:

可打印版本 | 推荐 | 订阅 | 收藏


[ 联系我们 - 东方微点 ]


北京东方微点信息技术有限责任公司 福建东方微点信息安全有限责任公司

闽ICP备05030815号