libvmi-python监控虚拟机

libvmi用起来比较复杂,真的不懂计算机的底层知识,照葫芦化瓢写了进程和模块获取:

import logging
from libvmi import Libvmi, VMIOS,  AccessContext, TranslateMechanism, PageMode
class Vmiapi(object):
    def __init__(self, vname):
        self.vname = vname
        self.vmi = Libvmi(vname)
        self.vmid = self.vmi.get_vmid()
        self.os = self.vmi.get_ostype()
    def get_offset(self):
        # init offsets values
        tasks_offset = None
        name_offset = None
        pid_offset = None
        if self.os == VMIOS.LINUX:
            tasks_offset = self.vmi.get_offset("linux_tasks")
            name_offset = self.vmi.get_offset("linux_name")
            pid_offset = self.vmi.get_offset("linux_pid")
        elif self.os == VMIOS.WINDOWS:
            tasks_offset = self.vmi.get_offset("win_tasks")
            name_offset = self.vmi.get_offset("win_pname")
            pid_offset = self.vmi.get_offset("win_pid")
        else:
            logging.info("Unknown OS")
            return 1
        return {'tasks_offset': tasks_offset, 'name_offset': name_offset, 'pid_offset': pid_offset}
    def list_process(self):
        offsets = self.get_offset()
        if self.os == VMIOS.LINUX:
            list_head = self.vmi.translate_ksym2v("init_task")
            list_head += offsets['tasks_offset']
        elif self.os ==VMIOS.WINDOWS:
            list_head = self.vmi.read_addr_ksym("PsActiveProcessHead")
        else:
            return 1
        cur_list_entry = list_head
        next_list_entry = self.vmi.read_addr_va(cur_list_entry, 0)
        processess = []
        headers = ['pid','procename', 'current_process']
        while True:
            current_process = cur_list_entry - offsets['tasks_offset']
            pid = self.vmi.read_32_va(current_process + offsets['pid_offset'], 0)
            procname = self.vmi.read_str_va(current_process + offsets['name_offset'], 0)
            Dict = dict(zip(headers,[pid, procname,
                         hex(current_process)]))
            processess.append(Dict)
            cur_list_entry = next_list_entry
            next_list_entry = self.vmi.read_addr_va(cur_list_entry, 0)

            if self.os == VMIOS.WINDOWS and next_list_entry == list_head:
                break
            elif self.os == VMIOS.LINUX and cur_list_entry == list_head:
                break
        return processess
    def list_module(self):
        os = self.os
        if os == VMIOS.LINUX:
            next_module = self.vmi.read_addr_ksym("modules")
        elif os == VMIOS.WINDOWS:
            next_module = self.vmi.read_addr_ksym("PsLoadedModuleList")
        else:
            logging.info("Unknown OS")
        list_head = next_module
        while True:
            # follow the next pointer
            tmp_next = self.vmi.read_addr_va(next_module, 0)

            # if we are back at the list head, we are done
            if list_head == tmp_next:
                break

            page_mode = self.vmi.get_page_mode(0)
            modname = None
            # print out the module name
            if os == VMIOS.LINUX:
                if page_mode == PageMode.IA32E:
                    modname = self.vmi.read_str_va(next_module + 16, 0)
                else:
                    modname = self.vmi.read_str_va(next_module + 8, 0)

            elif os == VMIOS.WINDOWS:
                if page_mode == PageMode.IA32E:
                        modname = self.vmi.read_unicode_str_va(next_module + 0x58, 0)
                else:
                    modname = self.vmi.read_unicode_str_va(next_module + 0x2c, 0)

            else:
                logging.info("Unkown OS")

            if modname is not None:
                print(modname)
            next_module = tmp_next

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值