executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
re-cpp-abi现代 C++ 二进制逆向:RTTI/异常/虚表恢复、ABI 识别、mangling 解码。 触发词:C++逆向、RTTI、虚表恢复、异常处理、C++ ABI、mangling、C++反编译。
Independent GitHub snapshot · Automated classification · Original documentation governs
apt install binutils llvm / dnf install binutils llvm / pacman -S binutils llvmbrew install llvm(binutils 部分 macOS 自带)readelf --version、llvm-objdump --versionc++filt(binutils 自带);Windows: undname(VS 工具链)echo '_ZN3foo3barEv' | c++filt(输出 foo::bar())按顺序执行,每步产物存档(路径 + sha256,见 [[re-triage]])。
ABI 识别:
readelf -s sample | grep -E '_ZN|_ZTV|_ZTI' | head # Itanium(GCC/Clang)
strings sample | grep -E '^\?\?_' | head # MSVC
_ZN(函数)、_ZTV(虚表)、_ZTI(RTTI 类型信息)??_7(vftable)、??_R(RTTI)(strip 后 ??_ 在符号表而非字符串区——补查导入表 __CxxFrameHandler / msvcp 特征辅助判断)RTTI 重建(Itanium):
readelf -s sample | grep _ZTI | head
# _ZTI<类名> 指向 typeinfo:起始为 vptr(指向 _ZTVN10__cxxabiv1... 类型信息虚表),
# 下一 pointer-sized 槽为 __type_name;64 位通常 +0/+8、32 位 +0/+4
# 解析前先定 ELF class / 指针宽度;__si_class_type_info / __vmi_class_type_info 同样按目标 ABI 对齐与字段宽度解析
typeinfo → __class_type_info 派生链 → 每个类的完整继承路径??_R0<类名> TypeDescriptor 符号 + _RTTICompleteObjectLocator(COL)遍历重建继承图虚表恢复:
readelf -s sample | grep _ZTV | head
_ZTV<类名> 指向 vtable 起点(虚函数指针数组);vtable 前缀两槽位(32 位 8 字节 / 64 位 16 字节):offset to top + typeinfo 指针(Itanium ABI)call *reg)无法静态定名 → 用调用点上下文(参数/返回值使用)缩小候选异常处理表:
readelf -S sample | grep -E 'eh_frame|gcc_except' # ELF:.eh_frame(readelf 不解析 PE,PE 走下方命令)
llvm-readobj --coff-unwind-info sample.exe # PE:.pdata/.xdata(或 objdump -h / pefile)
.pdata 的 RUNTIME_FUNCTION(Begin/End/UnwindInfo)→ .xdata 展开数据 → 异常处理器(__CxxFrameHandler3).eh_frame 的 FDE/CIE → 展开规则与 LSDA(.gcc_except_table)→ 异常处理函数模板/lambda 识别:
<...> 参数(Itanium mangling 中展开为长串);实例化爆炸时按调用模式聚类_ZTI 既不能排除也不能反推 lambda(typeid 等 ODR-use 时可有对应 RTTI)。识别优先用 Itanium 的 _ZZ<作用域>ENK... / operator() mangling、捕获成员布局与调用点,MSVC 的 <lambda_...>mangling 解码(批量):
readelf -s sample | grep -E '_ZN|_ZTV|_ZTI' | awk '{print $8}' | c++filt | head -20
undname 或在线等价工具_Z...;原因——模板实例化;对策——按调用模式聚类、过滤标准库符号(libstdc++/STL 前缀)_ZTI 既不能排除也不能反推;对策——按 _ZZ<作用域>ENK... / operator() mangling、捕获成员布局与调用点识别,不硬找 RTTI(typeid 等 ODR-use 时可另有 RTTI)call *reg 全是间接调用;原因——虚分派;对策——结合 vtable 槽位与调用点证据缩小候选,不猜