pop eax
mov [esp],retaddr ;把目标函数的返回地址改成自己的代码空间的返回地址,使其返回后能接手继续的处理
jmp _orgdestfunction ;跳到原目标函数中
retaddr:
pushad ;原函数处理完后保存寄存器
call _hookdestfunction@0 ;再hook
popad ;回复寄存器
jmp ds:_orgret ;跳到系统调用目标函数的下一条指令。
_mykireadythread@0 endp
在实现了hook过后在当调用原来的函数时(jmp _orgdestfunction),这个时候所以寄存器的值和堆栈信息和没hook的时候一样。在返回到系统的时候(jmp ds:_orgret),这个时候的堆栈信息和寄存器的值和没有hook的时候也是一样。就说是中间hook层对下面和上面都是透明的。
2. 检测隐藏进程
在线程调度抢占的的时候会调用kireadythread,它的原型为:
void fastcall kireadythread (in prkthread thread);
在进入kireadythread时,ecx指向thread。所以完全可以hook kireadythread 然后用ecx的值得到但前线程的进程信息。kireadythread没被ntosknrl.exe导出,所以通过硬编码来。在2000sp4中地址为0x8043141f。
void cfunc (void)
{
ulong pkheader=0;
__asm
{
mov pkheader,ecx //ecx寄存器是kireadythread中的prkthread参数
}
resumedestfunction(); //恢复头5个字节
if ( pkheader != 0 )
{
displayname((pkthread)pkheader);
}
}
cfun是hook函数调用用来得到当前线程抢占的进程信息的。
void displayname(pkthread thread)
{
pkprocess process = thread->apcstate.process;
peprocess peprocess = (peprocess)process;
dbgprint("imagefilename = %s \n",peprocess->imagefilename);
}
void hookdestfunction() //设置头个字节为一个跳转指令,跳到自己的函数中去
{
disablewriteprotect(&orgcr0);
memcpy((char*)orgdestfunction,jmpmycode,5);
enablewriteprotect(orgcr0);
}
void resumedestfunction() //恢复头5个字节
{
disablewriteprotect(&orgcr0);
memcpy((char*)orgdestfunction,orgcode,5);
enablewriteprotect(orgcr0);
}
除了kireadythread其他还可以hook其他内核函数,只有hook过后能得到线程或者是进程的ethread或者是eprocess结构头地址。其hook的方法都是一样的。hook kireadythread基本原来说明了,详细实现可以见我的另外一篇文章《内核级利用通用hook函数方法检测进程》。
结论
以上对内核级进程隐藏和侦测做了一个总结和对每一种方法的原理进行的详细阐述,并给出了核心的实现代码。
信息安全将是未来发展的一个重点,攻击和侦测都有一个向底层靠拢的趋势。进程隐藏和侦测只是信息安全中的很小的一个部分。未来病毒和反病毒底层化是一个不可逆转的事实。通过对系统系统底层分析能更好的了解病毒技术,从而能够有效的进行查杀。为以后从事信息安全方面的研究奠定一个好的基础
<< 上一页 [11] [12] [13] [14]