|
  
- UID
- 225241
- 积分
- 174
- 金元
- 1098 JY
- 金分
- 26697 JF
- 活跃度
- 402

|
6楼
发表于 2008-7-26 15:57
| 只看该作者
对内核模块基址的获取,只考虑ntoskrnl.exe,这与病毒Ring3程序原来的办法是不吻合的,而且也没有考虑到内核模块是ntkrnlpa.exe的情况,而你的GetModuleBase函数使用了之后,又没有检查返回值是否为0,这样在内核模块是ntkrnlpa.exe的情况下恐怕直接就BSOD了。
我可以理解你这里使用GetModuleBase,是因为它可以同样在获得atapi.sys基址的使用,但是这里获得系统内核基址的更一般的作法,的确是用NtQuerySystemInformation(SystemModuleInformation),但是应该是直接取第一个内核模块的基址。
有一些地方采用的结构体成员偏移量没有明确标出其意义,看起来明显是在IDA里F5之后修改而成的。
比如
imagebase=*(ULONG*)((ULONG)base+*(ULONG*)((ULONG)base+0x3C)+13*4);
以及其他一些涉及到IMAGE_DOS_HEADER、IMAGE_PE_HEADER、IMAGE_SECTION_HEADER等结构的操作,都直接用偏移量来做了,这样让不了解这个步骤的读者看不清它们的结构及语句的意义,当然我理解这是因为C里面类型转换起来太麻烦了。
PE=(ULONG)buf;
for(i=0;i<0x1000;i++){
if(!_stricmp((const char*)PE,"pe"))
break;
PE++;
}
我不知道为什么要用暴力搜索"PE"的方法来定位PE头,如果你明白上面那条式子,从IMAGE_DOS_HEADER结构0x3C偏移处获得PE头偏移是明摆着的事情,为什么反而要用暴搜呢?
ZwQuerySystemInformation(11, pbuftmp, n, NULL);
我觉得还是应该ZwQuerySystemInformation(11, pbuftmp, n, &n);更好一点
最后,从病毒样本看得出来,病毒样本驱动应该是用汇编写的,而楼主使用了C来模拟其代码,免不了一些代码面貌会不一样,比如多次的RtlInitUnicodeString,对用kmdkit来写的病毒样本驱动来说,只需要CCOUNTED_UNICODE_STRING就可以直接在编译时定义了。
另外搜索了一下,貌似网上这段代码已经满天飞了,至少一个月前就差不多有代码出来了,现在过了一个月,楼主才把它贴在这里并标为原创,这有点太迟了。 |
|