Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
dumpulator — 一个易于使用的模拟内存转储的库。适用于恶意软件分析(config extraction、unpacking)和一般的动态分析(sandboxing)。 | Kitploit
工具/GitHubGitHub/mrexodia/dumpulator
动态分析 (沙盒)逆向工程恶意软件分析二进制分析
GitHubmrexodia/dumpulator

dumpulator

一个易于使用的模拟内存转储的库。适用于恶意软件分析(config extraction、unpacking)和一般的动态分析(sandboxing)。

查看仓库
8775252年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

dumpulator

注意:这是一个正在开发中的原型,请视其如此。欢迎提交 Pull Request!您可以从 good first issues 开始入手。

一个易于使用的库,用于模拟 minidump 文件中的代码。以下是一些使用 dumpulator 的帖子/视频链接:

  • 与 OALabs 的介绍视频:Dumpulator - Using Binary Emulation To Automate Reverse Engineering
  • Emulating malware with Dumpulator
  • Emotet x64 Stack Strings Config Emulation | OALabs Research
  • Native function and Assembly Code Invocation
  • Guloader string decryption (VEH)
  • Rhadamanthys | OALabs Research
  • [Case study] Decrypt strings using Dumpulator

欢迎提交 Pull Request 将您的文章添加到这里!

示例

调用函数

下面的示例打开 StringEncryptionFun_x64.dmp(在此下载副本 here),分配一些内存,并调用 0x140001000 处的解密函数来解密 0x140017000 处的字符串:

root@kitploit:~
from dumpulator import Dumpulator

dp = Dumpulator("StringEncryptionFun_x64.dmp")
temp_addr = dp.allocate(256)
dp.call(0x140001000, [temp_addr, 0x140017000])
decrypted = dp.read_str(temp_addr)
print(f"decrypted: '{decrypted}'")

StringEncryptionFun_x64.dmp 是在 tests/StringEncryptionFun 示例的入口点收集的。您可以从 here 获取 StringEncryptionFun 的编译二进制文件。

跟踪执行

root@kitploit:~
from dumpulator import Dumpulator

dp = Dumpulator("StringEncryptionFun_x64.dmp", trace=True)
dp.start(dp.regs.rip)

这将创建 StringEncryptionFun_x64.dmp.trace,包含执行的指令列表以及在切换模块等时的一些有用指示。请注意,跟踪会显著降低仿真速度,主要用于调试。

读取 UTF-16 字符串

root@kitploit:~
from dumpulator import Dumpulator

dp = Dumpulator("my.dmp")
buf = dp.call(0x140001000)
dp.read_str(buf, encoding='utf-16')

运行一段代码片段

假设您有以下函数:

root@kitploit:~
00007FFFC81C06C0 | mov qword ptr [rsp+0x10],rbx       ; prolog_start
00007FFFC81C06C5 | mov qword ptr [rsp+0x18],rsi
00007FFFC81C06CA | push rbp
00007FFFC81C06CB | push rdi
00007FFFC81C06CC | push r14
00007FFFC81C06CE | lea rbp,qword ptr [rsp-0x100]
00007FFFC81C06D6 | sub rsp,0x200                      ; prolog_end
00007FFFC81C06DD | mov rax,qword ptr [0x7FFFC8272510]

您只想执行序言并设置一些寄存器:

root@kitploit:~
from dumpulator import Dumpulator

prolog_start = 0x00007FFFC81C06C0
# 我们希望在序言之后停止执行
prolog_end = 0x00007FFFC81C06D6 + 7

dp = Dumpulator("my.dmp", quiet=True)
dp.regs.rcx = 0x1337
dp.start(begin=prolog_start, end=prolog_end)
print(f"rsp: {hex(dp.regs.rsp)}")

quiet 标志会抑制有关已加载 DLL 和已设置内存区域的日志(用于脚本中减少日志噪音)。

自定义系统调用实现

您可以使用 @syscall 装饰器(重新)实现系统调用:

root@kitploit:~
from dumpulator import *
from dumpulator.native import *
from dumpulator.handles import *
from dumpulator.memory import *

@syscall
def ZwQueryVolumeInformationFile(dp: Dumpulator,
                                 FileHandle: HANDLE,
                                 IoStatusBlock: P[IO_STATUS_BLOCK],
                                 FsInformation: PVOID,
                                 Length: ULONG,
                                 FsInformationClass: FSINFOCLASS
                                 ):
    return STATUS_NOT_IMPLEMENTED

所有系统调用函数原型可以在 ntsyscalls.py 中找到。那里也有许多关于如何使用 API 的示例。

要 hook 一个现有的系统调用实现,可以执行以下操作:

root@kitploit:~
import dumpulator.ntsyscalls as ntsyscalls

@syscall
def ZwOpenProcess(dp: Dumpulator,
                  ProcessHandle: Annotated[P[HANDLE], SAL("_Out_")],
                  DesiredAccess: Annotated[ACCESS_MASK, SAL("_In_")],
                  ObjectAttributes: Annotated[P[OBJECT_ATTRIBUTES], SAL("_In_")],
                  ClientId: Annotated[P[CLIENT_ID], SAL("_In_opt_")]
                  ):
    process_id = ClientId.read_ptr()
    assert process_id == dp.parent_process_id
    ProcessHandle.write_ptr(0x1337)
    return STATUS_SUCCESS

@syscall
def ZwQueryInformationProcess(dp: Dumpulator,
                              ProcessHandle: Annotated[HANDLE, SAL("_In_")],
                              ProcessInformationClass: Annotated[PROCESSINFOCLASS, SAL("_In_")],
                              ProcessInformation: Annotated[PVOID, SAL("_Out_writes_bytes_(ProcessInformationLength)")],
                              ProcessInformationLength: Annotated[ULONG, SAL("_In_")],
                              ReturnLength: Annotated[P[ULONG], SAL("_Out_opt_")]
                              ):
    if ProcessInformationClass == PROCESSINFOCLASS.ProcessImageFileNameWin32:
        if ProcessHandle == dp.NtCurrentProcess():
            main_module = dp.modules[dp.modules.main]
            image_path = main_module.path
        elif ProcessHandle == 0x1337:
            image_path = R"C:\Windows\explorer.exe"
        else:
            raise NotImplementedError()
        buffer = UNICODE_STRING.create_buffer(image_path, ProcessInformation)
        assert ProcessInformationLength >= len(buffer)
        if ReturnLength.ptr:
            dp.write_ulong(ReturnLength.ptr, len(buffer))
        ProcessInformation.write(buffer)
        return STATUS_SUCCESS
    return ntsyscalls.ZwQueryInformationProcess(dp,
                                                ProcessHandle,
                                                ProcessInformationClass,
                                                ProcessInformation,
                                                ProcessInformationLength,
                                                ReturnLength
                                                )

自定义结构体

自 v0.2.0 起,支持轻松声明您自己的结构体:

root@kitploit:~
from dumpulator.native import *

class PROCESS_BASIC_INFORMATION(Struct):
    ExitStatus: ULONG
    PebBaseAddress: PVOID
    AffinityMask: KAFFINITY
    BasePriority: KPRIORITY
    UniqueProcessId: ULONG_PTR
    InheritedFromUniqueProcessId: ULONG_PTR

要实例化这些结构体,您必须使用 Dumpulator 实例:

root@kitploit:~
pbi = PROCESS_BASIC_INFORMATION(dp)
assert ProcessInformationLength == Struct.sizeof(pbi)
pbi.ExitStatus = 259  # STILL_ACTIVE
pbi.PebBaseAddress = dp.peb
pbi.AffinityMask = 0xFFFF
pbi.BasePriority = 8
pbi.UniqueProcessId = dp.process_id
pbi.InheritedFromUniqueProcessId = dp.parent_process_id
ProcessInformation.write(bytes(pbi))
if ReturnLength.ptr:
    dp.write_ulong(ReturnLength.ptr, Struct.sizeof(pbi))
return STATUS_SUCCESS

如果您将指针值作为第二个参数传递,则结构体将从内存中读取。您可以使用 myptr: P[MY_STRUCT] 声明指针,并使用 myptr[0] 解引用它们。

收集转储

有一个简单的 x64dbg 插件可用,名为 MiniDumpPlugin 自 2022-10-10 起,minidump 命令已集成到 x64dbg 中。要创建转储,请暂停执行并执行命令 MiniDump my.dmp。

安装

从 PyPI(最新 release):

root@kitploit:~
python -m pip install dumpulator

从源代码安装:

root@kitploit:~
python setup.py install

为开发环境安装:

root@kitploit:~
python setup.py develop

相关工作

  • Dumpulator-IDA:该项目是一个小型 POC 插件,用于在 IDA 中启动 dumpulator 仿真,通过上下文菜单传递 IDA 视图中的地址。
  • wtf:分布式、代码覆盖率引导、可自定义、跨平台的基于快照的模糊器,设计用于攻击 Microsoft Windows 上的用户和/或内核模式目标。
  • speakeasy:基于 unicorn 的 Windows 沙箱。
  • qiling:基于 unicorn 的二进制仿真框架。
  • Simpleator:基于 Hyper-V 平台 API 的用户模式应用程序仿真器。

dumpulator 与 speakeasy 和 qiling 等沙箱的不同之处在于,完整的进程内存是可用的。这提高了性能,因为您可以在不离开 unicorn 的情况下仿真恶意软件的大部分内容。此外,只需要仿真系统调用即可提供真实的 Windows 环境(因为实际上一切都是合法的进程环境)。

致谢

  • herrcore 启发我制作这个项目
  • secret club
  • JetBrains 提供免费的 PyCharm 许可证!
  • Image by GraphiqaStock on Freepik
下载工具