讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ 如何获取当前函数的修饰名(Mangled Name) _ abi 接口反混淆【进阶】

胖辰君_9275

胖辰君_9275

发布时间:2026-05-13 13:12:16

|

935人浏览过

|

来源于php中文网

原创

__cxa_demangle 不能直接反解当前函数名,因为它仅用于解码已有的 Itanium ABI 修饰名(如 _Z3fooi),而 C++ 标准不提供运行时获取函数修饰名的接口;__func__ 和 __PRETTY_FUNCTION__ 返回的是可读名或调试字符串,并非标准修饰名,需借助 dladdr + __builtin_return_address 等机制从符号表中提取,且受内联、优化、可见性等限制。

c++ 如何获取当前函数的修饰名(mangled name) _ abi 接口反混淆【进阶】

为什么 __cxa_demangle 不能直接反解当前函数名

因为 C++ 没有标准接口在运行时获取“当前函数的修饰名”,__cxa_demangle 只负责反解(demangle)已有的修饰名字符串,它不生成也不提供获取途径。你得先拿到那个以 _Z 或 _ZN 开头的原始字符串,才能喂给它。而 __FUNCTION__、__func__ 给的是可读名(如 "foo<int>"</int>),不是修饰名;__PRETTY_FUNCTION__ 虽然含模板信息,但仍是人可读格式,不是 ABI 标准的 mangled 字符串。

用 __builtin_return_address + dladdr 拿到符号地址再查名

这是 Linux/glibc 下最可行的实操路径:靠返回地址定位函数入口,再通过动态链接器查符号表。注意它查到的是“符号名”(symbol name),在未开启 -fvisibility=hidden 且未被 strip 的情况下,这个符号名通常就是修饰名。

  • dladdr 需要链接 -ldl
  • 必须传入函数的**代码地址**,__builtin_return_address(0) 是调用点地址,可能落在函数内联展开后的位置,不够稳;更可靠的是在函数开头取 &some_local_label 或用 __builtin_frame_address(0) 辅助对齐(但仍有风险)
  • 实际拿到的 dli_sname 可能为 nullptr(例如 inlined 函数、static 函数、或编译器优化丢弃了符号)
#include <dlfcn.h>
#include <iostream>

void test_func(int x) {
    Dl_info info;
    if (dladdr(__builtin_return_address(0), &info) && info.dli_sname) {
        std::cout << "Mangled symbol: " << info.dli_sname << "\n";
        // 输出类似: _Z9test_funci
    }
}

手动 mangle 的路基本走不通

不要尝试自己拼接修饰名——Itanium C++ ABI 的 mangling 规则极其复杂,涉及嵌套、模板参数折叠、decltype 推导、lambda 编号等,连 libiberty 的 cplus_demangle 都只做反解,不提供正向生成接口。GCC/Clang 内部用的是专有逻辑,未暴露 API。即使你用 abi::__cxa_demangle 的逆过程,也缺乏稳定输入(比如无法可靠获取模板实参类型在 ABI 中的编码序列)。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 没有标准库函数叫 __cxa_mangle 或类似名字
  • typeid(T).name() 返回的是实现定义的字符串,GCC 返回修饰名,MSVC 返回可读名,Clang 行为又不同,不可移植
  • 宏如 __FUNCDNAME__(MSVC)或 __PRETTY_FUNCTION__(GCC/Clang)都不是修饰名,只是调试辅助字符串

真正能落地的组合方案:编译期 + 运行期协同

如果目标是日志、调试或 profiling 场景中“尽可能拿到修饰名”,唯一稳健做法是:编译期生成、运行期引用。利用模板和 constexpr,在函数定义处把修饰名固化下来。

立即学习“C++免费学习笔记(深入)”;

  • GCC 提供 __PRETTY_FUNCTION__ 在模板函数中会展开完整签名,配合字符串字面量截取可逼近修饰名(不完全等价,但足够用于区分重载)
  • 更彻底的做法:用 build script(如 CMake + nm -C 或 readelf --symbols)在构建后扫描目标文件,提取所有函数的修饰名,生成头文件映射表
  • 运行时通过函数指针查表,避免 dladdr 的不确定性

ABI 反混淆本身不难,难的是“获取原始修饰名”这个前提——它不在语言层面,而在工具链与运行环境的交界处。多数人卡住的地方,其实是误以为存在一个“一键获取”的 C++ 标准接口。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2268

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

1039

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

447

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

347

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

426

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

600

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1429

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1237

2024.03.22

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn