唉,老大忙着写书,其它老大忙什么就不知道了~
自己折腾了几天,这个软件对softice的检测方法还是找出来了
(driverstudio 3.10 xp sp1)
1. mov al, [unhandledexceptionfilter]
cmp al, 0xcc
je softice
比较 api函数kernel32!unhandledexceptionfilter的第一个字节是否为0xcc(int 3 ),是则表示softice 已加载
softice 加载后,为监视系统异常,把unhandledexceptionfilter的第一字节改为了int3 ,此改动不随faults off选项的关闭改变,只能手工修改
解决方法:(1)按加密解密2上反跟踪技术章节10.4.3中所说,在ntice.sys中查找kernel32!unhandledexception 改为user32!MessageBoxExW
(2)在softice 的启动命令中加上e unhandledexceptionfilter 55即可
2.使用ntdll!ntquerysysteminformation 函数枚举所有加载的驱动文件名与"NTice.sys"进行比较,如果匹配,则softice 存在
此函数原型如下
NTSTATUS NtQuerySystemInformation(
SYSTEM_INFORMATION_CLASS SystemInformationClass,
PVOID SystemInformation,
ULONG SystemInformationLength,
PULONG ReturnLength
);
当使用0xB作为第一个参数,足够大的缓冲区为第二参数,缓冲区长度为第三参数,第四参数为0,此api即返回系统中加载的所有driver的文件路径(因为网上缺乏足够文档,无法提供详细说明,对不起),当函数调用成功后,即可用NTice.sys这个字符串与缓冲区中的文件名比较,相等表示softice 加载
此函数可能等同于zwQuerySystemInformation(见加密解密II 338页)
但不限于用来检测微软自己的调试器windbg,还可用上述方法检测softice 或者trw2000(有一点不明白,是否可以修改ntice.sys中的特征字符来避过此种检测?我按加密II 10.4.3中的方法修改ntice.sys后,好像不行)
3. int3
避过方法1即可避开 int3检测
4. int1
在softice 窗口中键入idt 获得idtbase 将0xD偏移处的0xEE改为0x8E即可
些idtbase值不同系统中是不一样的,我的xp sp1为0x8003f400
可在softice 的启动命令中直接加上e 8003f40d 8e(参考加密IIp349页的详细说明)
5. 检测某些常用api如getprocaddress,loadlibrary的第一个字节是否为0xCC(int 3 )
如果这些api的第一字节为0xCC,即表示被softice 设置了断点,即可判断softice 已加载
些软件还用了经典的MeltICE方法,但已过时,对driverstudio 2.x以后的版本已经不起作用了,就不说了
希望能对大家有所帮助,不过现在用softice 的人越来越少了,大家都用olydbg了,不过我有点用不惯
如果还有其它新的检测softice的方法,还望大大们指点~
有说得不对的地方,大家就当我放屁好了~