标 题: 【原创】ixer 0.11开源版-一款手工杀毒/Anti-rootkit工具
作 者: Chinghoi
时 间: 2013-06-15, 19:05:21
链 接:
http://bbs.pediy.com/showthread.php?t=173653 主要功能:
进程、线程、进程Dll模块的枚举与检测,杀进程、杀线程、卸载模块等功能
内核驱动枚举与检测,定位、删除驱动文件等
SSDT的检测和恢复
Shadow SSDT的检测和恢复
消息钩子的枚举和卸载
注册表枚举和删除
文件枚举和删除
网络端口枚举、终止进程
此作品不仅能够用于个人电脑上作为手工查杀的辅助工具,还能作为计算机安全人员研究rootkit的参考工具,本工具为作者学习windows内核驱动安全编程写的工具,内心功能大都是用内核驱动实现的。实现了Anti-rootkit部分功能模块,作为ARK工具尚欠完善,但可作学习参考研究,高手请飘过。为了发扬开源精神,广交好友,作品工程项目面对所有网友开源! 希望能够帮助到像作者一样热衷于windows内核安全的刚起步的晚辈们,在研究参考或开发过程中有遇到技术瓶颈可以联系作者研究学习讨论,作者也很期待能广交各路豪友。
开发环境:
界面:
MFC(C/C++) /Microsoft Visual C++ 6.0
驱动:
C、汇编 /Microsoft Visual Studio 2008 + WDK 7600.16385.1
运行环境:
Windows XP sp2、sp3
工具&作品源码下载地址:
ixer0.11.rar
联系信息:
作者:Chinghoi(谭正海)
Email:chinghoi@vip.qq.com
Blog:
http://blog.csdn.net/Chinghoi
界面预览:
主界面->进程管理
主界面->进程标签->线程与DLL模块管理双开
主界面->驱动模块标签
主界面->ssdt标签
主界面->ShadowSsdt标签
主界面->网络端口标签
进程:
进程枚举:
用ZwQuerySystemInformation函数的SystemProcessesAndThreadsInformation参数功能,函数返回一个指向PSYSTEM_PROCESS_INFORMATION的缓冲区,此缓冲区为一条链表的结构,结构的NextEntryOffset成员指向下一个结构,遍历此链表即可现实常规的进程枚举。
进程的检测:
PspCidTable枚举结果与ZwQuerySystemInformation枚举结果对比检测隐藏进程,步骤如下:
1.获取PspCidTable地址
特征码搜索定位PsLookupProcessByProcessId函数里调用PspCidTable的Call地址 获取PspCidTable地址。
2.用ExEnumHandleTable枚举句柄表
ExEnumHandleTable函数是ntoskrnl.exe导出函数,声明即可引用。原型如下:
NTKERNELAPI
BOOLEAN
ExEnumHandleTable (
__in PHANDLE_TABLE HandleTable,
__in EX_ENUMERATE_HANDLE_ROUTINE EnumHandleProcedure,
__in PVOID EnumParameter,
__out_opt PHANDLE Handle );
ExEnumHandleTable参数:
一个指向PHANDLE_TABLE的指针,传入CidHandleTable地址即可
EnumHandleProcedure参数:
该参数为EX_ENUMERATE_HANDLE_ROUTINE类型,是一个回调例程,该回调原型如下:
typedef BOOLEAN (*EX_ENUMERATE_HANDLE_ROUTINE)(
IN PHANDLE_TABLE_ENTRY HandleTableEntry,
IN HANDLE Handle,
IN PVOID EnumParameter );
HandleTableEntry参数:
传递给我们的一个指向PHANDLE_TABLE_ENTRY类型指针,HandleTableEntry->Object指向对象。
函数返回FALSE则继续,TRUE终止,可以判断EnumParameter参数是否等于 HandleTableEntry做终止条件。
PsActiveProcessList枚举进程与上2步中做比较。
结束进程:
用PspTerminateThreadByPointer结束进程
线程枚举:
通过传入的EPROCESS地址+ThreadListHead偏移地址得到线程链表头遍历线程链。
DLL枚举:
传入一个进程ID,通过PsLookupProcessByProcessId得到进程EPROCESS,EPROCESS->Peb->Ldr->LdrHeader然后遍历LDR链。
用ZwUnmapViewOfSection卸载Dll
驱动:
驱动枚举:
ZwQuerySystemInformation函数的SystemModuleInformation参数
函数返回缓冲区的缓冲区的前4个字节是已加载的内核模块总数记为N,后面是共有N个元素的SYSTEM_MODULE_INFORMATION_ENTRY内核模块信息数组,用一个for循环N次即可遍历整条链。
驱动检测:
遍历PsLoadedModuleList与ZwQuerySystemInformation结果做比较
ssdt、shadow ssdt表hook的检测与恢复:
ssdt:
从 ntoskrnl**.exe内核PE文件中查找原始的ssdt表函数地址,从ntdll.中查找函数名称。
Shadow ssdt:
系统线程KTHREAD->KTHREAD.ServiceTable中获取Shadow ssdt表的当前地址、函数名,从微软服务器下载符号文件pdb解析原始的函数地址、函数名。
消息钩子的枚举:
遍历所有进程的线程从ETHREAD中检测消息钩子信息。
注册表的枚举:
使用ZwOpenKey,ZwQueryKey,ZwClose,ZwEnumerateKey,ZwEnumerateValueKey来枚举。
文件:
文件的枚举与检测:
使用传说中icesword的Raw FSD I/O概念思路,即直接填充构造irp的各个域发往FSD文件系统(ntfs.sys/fastfat.sys):
Irp = IoAllocateIrp(x, x) //分配一个irp结构
//填充各个域..
MajorFunction=IRP_MJ_DIRECTORY_CONTROL;
MinorFunction=IRP_MN_QUERY_DIRECTORY;
..
status = IxIoCallDriver( pDevObject, irp ); //自实现的将irp下发到下级设备上
文件的删除:
文件的删除也使用了send Irp packet,直接填充构造irp的各个域发往FSD文件系
统删除文件。
网络端口:
IoBuildDeviceIoControlRequest分别向Tcpip.sys所创建的TCP设备对象和UDP设备对象发送IRP,在输出缓冲区中将返回端口、IP、状态、PID等信息。
源码下载:
ixer0.11.rar
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
上传的附件: