竞赛应该以技术交流为目的,我放出这题自己做的答案和思路

这题我感觉,没有完美的答案,就像杀软一样,没有哪个能事先彻底防御最新出来的病毒木马

这题可以用以下几种方式来解决
1,debug方式
2,hook方式
3,虚拟执行的方式
4,以上几种综合


虚拟执行方式太慢了,而且环境虚拟不真实很容易被anti,我首先放弃了
hook方式要避免被检查hook
debug方式,要避免被anti


我的思路是debug方式,利用CPU的Last Branch Record,来记录程序执行的流程,用这个方式,判断出程序跳出自己镜像的地址,通过地址来找出dll的导出函数


流程大致是这样的

加载驱动,创建进程(暂停模式),把进程主线程设置单步,尝试找出进程的主模块地址和模块大小,以及第一个api的地址,然后把它们传给驱动,驱动hook int1,更改DEBUGCTLA MSR,将单步指令改成单步分支,监控程序分支流程。驱动int1捕获单步后,将From和To进行过滤,从程序主模块跳出去的才发给ring3,ring3去判断第一次api还是第二次,如果是第二次,通过api地址,找到dll模块,以及导出函数名,打印出来


优点:
1,用ring0 hook int1的方式来调试,没有使用windows的调试机制,全部自己通信,检测调试模式 无效
2,利用CPU的功能将单步指令改成了单步分支,降低调试部分代码执行次数
3,ring0过滤EIP,减少ring0 ring3通信次数
4,没用调试寄存器,检查dr0 - dr7 无效
5,ring3无任何hook,检查hook 无效
6,没有使用int3或int1断点,api代码检查 无效
6,兼容win2000 - win7(只需要cpu支持即可)

缺点:
1,无法避免单步状态检测
2,多核情况下,int1处理得不好,会出现异常(代码设置了亲和性,避免了这个问题)

上传的附件 3.1.rar