x64dbg SizeofType 命令详解:查询类型位宽并驱动脚本自动化 📅 发布时间:2026/9/19 23:07:23 👁 浏览次数: x64dbg SizeofType 命令详解查询类型位宽并驱动脚本自动化【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbgSizeofType是 x64dbg 类型Types命令族中的查询类命令用于获取当前类型数据库中任意类型原始类型、别名、结构体、联合体、枚举、函数指针的位宽bit size并将结果写入脚本变量$result供后续脚本逻辑直接使用。本指南以 docs/commands/types/SizeofType.md 为核心结合 types.cpp 与 cmd-types.cpp 的源码实现说明命令的语法、结果语义、底层查找逻辑与典型应用场景。读完本文你将能在脚本与命令行中准确获取任意自定义类型的尺寸并理解位宽以 bit 计这一关键语义。命令概览SizeofType是类型操作命令族见 docs/commands/types/index.rst中的一员与AddType、AddStruct、AddUnion、AddMember、AppendMember、AddFunction、AddArg、AppendArg、VisitType、ClearTypes、RemoveType、EnumTypes、LoadTypes、ParseTypes同组注册在 x64dbg.cpp 中通过dbgcmdnew(SizeofType, cbInstrSizeofType, false)挂载到命令系统。语法SizeofType arg1参数参数含义arg1要查询的类型名称type name例如int32、duint、自定义结构体名等结果命令执行成功后会将类型尺寸写入脚本变量$result单位是bit位而非字节byte。若类型不存在或无法解析命令会打印SizeofType failed并返回失败$result不会被更新。基本用法与示例在 x64dbg 命令行或脚本中直接执行SizeofType int32日志区输出sizeof(int32) 32随后在脚本中即可通过$result取用该值SizeofType duint // x64 构建下输出 sizeof(duint) 64$result 被置为 64再结合类型定义命令使用可对自定义结构体求尺寸。例如先用AddStruct/AddMember定义一个结构体AddStruct MY_STRUCT AddMember MY_STRUCT int32 field_a AddMember MY_STRUCT uint8 field_b SizeofType MY_STRUCT由于结构体尺寸是成员尺寸的累加见下文实现解析$result将得到40即32 8bit。这类查询非常适合在自动化脚本中动态计算缓冲区大小、结构体长度或做内存布局校验。源码实现深度解析1. 命令处理函数SizeofType的命令处理函数位于 cmd-types.cppbool cbInstrSizeofType(int argc, char* argv[]) { if(IsArgumentsLessThan(argc, 2)) return false; auto size SizeofType(argv[1]); if(!size) { dputs(QT_TRANSLATE_NOOP(DBG, SizeofType failed)); return false; } dprintf_untranslated(sizeof(%s) %d\n, argv[1], size); varset($result, size, false); return true; }关键逻辑有三点参数不足少于 2 个参数即缺类型名直接失败调用全局 APISizeofType返回值为 0 视为类型不存在/解析失败打印SizeofType failed成功时以sizeof(类型) 数值格式输出并通过varset($result, size, false)写入$result脚本变量。2. 全局 API 与线程安全全局函数SizeofType定义于 types.cpp它通过SHARED_ACQUIRE(LockTypeManager)以共享锁方式读取类型管理器避免与并发的类型增删操作冲突int SizeofType(const std::string type) { SHARED_ACQUIRE(LockTypeManager); return typeManager.Sizeof(type); }该函数在 types.h 中声明可被插件等其他模块直接调用。内部核心实现是TypeManager::Sizeof见 types.cpp。3. 核心查找逻辑TypeManager::SizeofTypeManager::Sizeof按以下顺序解析类型并返回位宽类型形态返回值说明指针类型类型名以*结尾primitiveSizes[Pointer] * 8返回指针本身大小即sizeof(void*)对应的位数x64 下为 64x86 下为 32与指向的目标类型无关Typedef / 别名递归调用Sizeof(alias)别名指向的类型继续解析直到基础类型枚举Enumenum.sizeBits枚举自身的位宽结构体 / 联合体Struct/Unionstruct.sizeBits累加结构体或取最大值联合体后的位宽函数FunctionprimitiveSizes[Pointer] * 8函数类型按函数指针大小处理其他 / 未找到0触发命令失败分支需要特别注意的是所有sizeBits均以 bit 为单位存储。原始类型在初始化时即做了换算t.sizeBits primitiveSizes[primitive] * 8见 types.cpp因此SizeofType int32返回 32 而非 4。4. 原始类型尺寸表类型管理器的构造函数types.cpp注册了全部内建原始类型及其别名这是SizeofType能够直接查询的基础类型别名尺寸bitint8_t, int8, char, byte, bool, signed char8uint8_t, uint8, uchar, unsigned char, ubyte8int16_t, int16, wchar_t, char16_t, short16uint16_t, uint16, ushort, unsigned short16int32_t, int32, int, long32uint32_t, uint32, unsigned int, unsigned long32int64_t, int64, long long64uint64_t, uint64, unsigned long long64dsintsizeof(void*) * 8duint, size_tsizeof(void*) * 8float32double, long double64ptr, void*sizeof(void*) * 8char*, const char*sizeof(char*) * 8wchar_t*, const wchar_t*sizeof(wchar_t*) * 8可见dsint/duint/size_t等与指针宽度相关的类型其尺寸会随构建架构x64/x86自动变化SizeofType因此也可以用来在脚本中探测当前调试器是 64 位还是 32 位。5. 结构体尺寸的累积规则SizeofType对结构体返回的位宽来自结构体定义过程中实时维护的sizeBits字段结构体struct每添加一个成员s.sizeBits m.sizeBits累加types.cpp联合体union取所有成员的最大值if(typeSize s.sizeBits) s.sizeBits typeSize;types.cpp数组成员typeSize Sizeof(type) * arraySize按元素个数放大types.cpp位域成员尺寸取位域声明的sizeBits但不能超过成员类型位宽见 types.cpp显式偏移当成员指定了超出当前布局的bitOffset时会通过AppendStructPadding自动插入填充位types.cpp这些填充同样计入最终位宽。因此SizeofType反映的是类型数据库中的逻辑布局尺寸与 C 编译器在目标架构上的实际对齐规则可能不完全一致使用时需结合具体场景判断。与类型命令族的协作SizeofType的典型工作流是先定义、再查询手工定义用AddType/AddStruct/AddUnion/AddMember/AddFunction/AddArg逐个构建类型对应文档见 AddType、AddStruct、AddMember、AddFunction 等批量导入用ParseTypes解析 C 风格声明、或LoadTypes从文件/JSON 加载类型见 ParseTypes、LoadTypes查询校验用SizeofType获取位宽配合EnumTypesEnumTypes枚举全部类型、VisitType/dtVisitType展示成员布局形成完整的类型管理与检视闭环脚本消费把$result用于条件分支、循环或内存操作例如在脚本中先SizeofType再据此分配缓冲区或计算遍历步长。边界情况与注意事项类型不存在时返回 0任何有效类型的位宽至少为 8 bit因此 0 被安全用作未找到的哨兵值命令会打印SizeofType failed且不修改$result。指针类型返回指针宽度对以*结尾的类型名如MY_STRUCT*返回的是指针大小而非所指结构体的大小types.cpp。若要查询结构体本身的尺寸请去掉末尾的*。单位是 bit所有返回值均为位宽。若脚本需要字节数应自行除以 8。不依赖调试会话SizeofType只读取调试器内部的类型数据库无需附加或启动被调试进程即可执行可在任意时刻用于脚本初始化。总结SizeofType虽然语法简单却是 x64dbg 类型系统中连接类型定义与脚本逻辑的关键查询入口。理解其$result返回值语义bit 单位、别名递归解析、指针/枚举/结构体/函数的差异化处理以及0 表示未找到的失败约定能帮助你在逆向分析与自动化脚本中更精确地利用自定义类型体系。相关实现与测试可进一步查阅 types.cpp、types.h 与 cmd-types.cpp。【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考