初始化VMI_init()
block_end_cb()回调函数,探测OS
handle_funds_c()中调用每个OS的find函数,找到可能的操作系统
find方法中调用probe_windows()
get_kpcr(),得到KPCR地址
从虚拟地址0x80000000开始扫描,因为KPCR结构在系统空间
当前扫描地址偏移0x1c处的值就是当前的扫描地址
当前扫描地址偏移0x020和0x120处的值相同
探测到OS后,调用对应的初始化函数win_vmi_init(),其中主要包括
tlb_call_back()实现新进程创建的检测
find_new_process(),用于从KPCR找到每个进程
利用KPCR找到KDBG
XP系统中,KPCR的基址加上偏移0x34得到KdVersionBlock成员,它指向DBGKD_GET_VERSION64结构
DBGKD_GET_VERSION64结构的偏移0x20处,即为指向DBGKD_DEBUG_DATA_HEADER64结构指针的DebuggerDataList成员
得到DBGKD_DEBUG_DATA_HEADER64结构的指针,从而得到DBGKD_DEBUG_DATA_HEADER64结构的地址,即为KDBG结构的地址
然后KDBG包含了指向所有Active进程的链表, 每个进程结构“EPROCESS”有LIST_ENTRY ActiveProcessLinks
get_new_modules(),用于找到一个进程所有模块
update_kernel_modules(),利用内核态KPRCB中包含了PsLoadedModuleList,来列出所有内核模块
update_loaded_user_mods_with_peb(),通过PEB得到一个进程加载的模块
最后的retrieve_missing_symbols()取得模块的每个输出函数
extract_PE_info()取得PE头部信息
extract_export_table()取得PE头部的符号信息,得到大部分代码在哪个进程哪个模块
check_procexit()定时实现对退出进程的检测