VMI原理

VMI原理

  • 初始化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()定时实现对退出进程的检测

猜你喜欢

转载自blog.csdn.net/dmbjzhh/article/details/80688476
今日推荐