C++逆向工程必备:用c++filt一键解析GCC编译后的神秘函数名(附实战案例)

C++逆向工程实战:用c++filt破解GCC函数名混淆的终极指南

1. 从崩溃日志到可读符号:逆向工程师的必备武器

当你在凌晨三点收到生产环境崩溃警报时,面对日志中_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEPKc这样的符号,是否感到绝望?这就是C++的name mangling机制在"作祟"——编译器为了支持函数重载等特性,将函数名和参数类型编码成一串晦涩的符号。但别担心,c++filt正是为此而生的瑞士军刀。

典型崩溃分析场景中的痛点

  • 核心转储文件中难以辨认的函数调用栈
  • 动态链接库中无法直观理解的导出符号
  • 跨语言调用时的链接错误
  • 第三方库调试时的符号匹配问题
# 实战示例:解析崩溃堆栈 $ cat crash.log | grep '#' | awk '{print $4}' | c++filt std::__cxx11::basic_string<char>::compare(char const*) 

2. C++ Name Mangling的底层原理揭秘

2.1 为什么C++需要名称改编

与C语言简单的符号命名不同,C++需要处理:

  • 函数重载(参数类型不同)
  • 命名空间限定
  • 类成员函数
  • 模板特化
  • 异常规范

C与C++符号对比

源代码C编译符号C++编译符号 (GCC)
void foo()foo_Z3foov
int foo(int)不适用_Z3fooi
NS::Class::method()不适用_ZN2NS5Class6methodEv

2.2 GCC的编码规则解析

GCC采用的Itanium ABI规范中,mangling规则包

Read more

爆肝 2 天,用 GLM5 开发了 OpenClaw 接入微信 bot,已开源!

这是苍何的第 493 篇原创! 大家好,我是苍何。 OpenClaw,这个 GitHub 上 18 万 Star 的怪物级开源项目,你们应该都听过了吧? 飞书能接、钉钉能接、企业微信能接、QQ 能接、Discord 能接…… 但偏偏最多人用的「微信个人号」,它不支持。 我翻遍了 GitHub、掘金、知乎,找到的方案要么是企业微信绕一圈,要么是用微信 Web 协议搞,动不动就封号。 说实话,这谁顶得住? 天天在微信上跟朋友聊天、在群里吹水,结果想接个 OpenClaw 都这么费劲? 麻了。 于是我决定自己干。 「爆肝 2 天,我把 OpenClaw 接入了微信个人号,并且已经开源了。」 地址:

By Ne0inhk
Git 用户名与邮箱配置指南

Git 用户名与邮箱配置指南

前言 在使用 Git 进行版本控制时,每一次代码提交(commit)都会记录提交者的身份信息。这些信息不仅用于追踪代码变更历史,还在团队协作、代码审查和开源贡献中发挥着重要作用。 Git 通过 用户名(user.name) 和 邮箱(user.email) 来标识开发者身份。正确配置这两项信息,是使用 Git 的第一步,也是确保提交记录清晰、可追溯的关键。 一、为什么需要设置用户名和邮箱? Git 是一个分布式版本控制系统,它不依赖中央服务器来管理用户身份。因此,每个开发者必须在本地明确声明自己的身份。Git 会在每次执行 git commit 时,自动将 user.name 和 user.email 写入提交记录。 如果没有正确设置,可能会导致: * 提交记录显示为 unknown 或默认系统用户名;

By Ne0inhk

超详细 Git 讲解(通俗易懂 + 全面覆盖)

超详细 Git 讲解(通俗易懂 + 全面覆盖) 一、先搞懂:为什么需要 Git?(5 分钟) 先从大一同学能理解的场景切入,避免一上来就讲技术: * 场景 1:写代码改来改去,想回退到昨天的版本,却找不到旧文件; * 场景 2:实验室多人合作写项目,改同一个文件互相覆盖,代码越改越乱; * 场景 3:想同时开发两个功能(比如 “登录功能” 和 “注册功能”),改了登录的代码,注册的代码就没法测试。 Git 的核心作用:版本控制 + 多人协作,解决以上所有问题 —— 它就像代码的 “时光机”+“协作神器”,能记录每一次修改,还能让多人并行开发不冲突。 二、Git 核心概念:先把 “地基” 打牢(15 分钟)

By Ne0inhk
Git 使用技巧——查看 Commit 修改文件的概要

Git 使用技巧——查看 Commit 修改文件的概要

Git 使用技巧——查看 Commit 修改文件的概要 在日常 Git 版本管理中,经常需要查询某个 Commit 修改了哪些文件,甚至每个文件的增删行数统计,本文整理了多种实用方法,覆盖不同使用场景,满足从「简洁文件列表」到「详细行数统计」的各类需求。 一、前置准备:获取 Commit ID 所有操作都需要先获取目标 Commit 的 commit-id,commit-id 是一串 40 位的哈希值,Git 支持简写前 6-8 位使用,获取方式如下: # 简洁格式查看提交历史(优先推荐,输出包含 简写commit-id + 提交说明) git log --oneline # 完整格式查看提交历史(包含完整 commit-id、作者、时间、

By Ne0inhk