以 Instagram SSL Pinning 绕过为例,教你把逆向经验封装成 AI 可执行的自动化流程,获取完整skill方式在文末
这篇文章不是教你怎么抓包。
我之前写过一篇 Instagram 最新版抓包的文章,核心就是绕过 SSL Pinning——在 IDA 里搜 SecTrustSetAnchorCertificates,查交叉引用,定位到核心验证函数,hook 它返回 0,搞定。
问题是,每次 ins 更新版本我都得重新来一遍。步骤是固定的,但每次都要从头走,挺烦的。
后来我就想:我现在有 IDA Pro MCP,Claude 可以直接操作 IDA。那我为什么不把这套流程写成一个 Skill,让 Claude 自己搜函数、查交叉引用、反编译、生成 Frida 脚本?
这篇文章就是教你怎么干这件事。学会以后,不光是 SSL Pinning,任何你经常重复的逆向流程都可以这样封装。
先说一下 Skill 是什么
如果你用过 Claude Code(Anthropic 官方的命令行 AI 工具),你应该知道它能帮你写代码、改代码、跑命令。
但它有个问题:它不知道你的工作习惯。
比如你每次分析 SSL Pinning 都是固定的流程,但 Claude 不知道。你每次都得从头跟它解释一遍。
Skill 就是解决这个问题的。简单说:
• 你把自己的分析流程写成一个 Markdown 文件 • Claude 读了以后,就知道该怎么一步步帮你干活 • 下次你只要说一句话,它就按你定义的流程走
Skill 的文件结构
一个 Skill 其实就是一个文件夹,里面放一个 SKILL.md。
~/.claude/skills/└── ios-ssl-pinning-bypass/ ← 你的 Skill 文件夹 └── SKILL.md ← 核心文件,就这一个放在 ~/.claude/skills/ 下面就是全局 Skill,所有项目都能用。
如果你只想在某个项目里用,也可以放在项目根目录的 .claude/skills/ 下面。
就这么简单,不需要装插件,不需要配环境,写个 Markdown 文件放对位置就行。
SKILL.md 怎么写
一个 SKILL.md 分两部分:
第一部分:头部信息(frontmatter)
用 --- 包裹,告诉 Claude 这个 Skill 叫什么、什么时候用:
---name: ios-ssl-pinning-bypassdescription: 针对 iOS App 的 SSL Pinning 绕过分析流程,自动生成 Frida 脚本metadata: short-description: iOS SSL Pinning 绕过---这里几个字段说一下:
• name:Skill 的名字,也是你用/skill名调用时的名字• description:描述,Claude 会根据这个判断什么时候自动触发这个 Skill• metadata.short-description:短描述,显示用的
第二部分:正文
正文就是你的流程,用 Markdown 写。Claude 会把这部分当作"操作手册"来执行。
这是最关键的部分,下面我用 Instagram SSL Pinning 这个真实案例来讲。
实战:Instagram SSL Pinning 绕过 → 全自动 Skill
先回顾一下手动流程
我之前那篇文章里,Instagram 抓包的核心流程是这样的:
在 IDA 里搜索
SecTrustSetAnchorCertificates→ 找到 thunk 函数 → 查交叉引用 → 定位到核心证书验证函数sub_46B8D4→ hook 它返回 0 → 抓包成功。
每次 ins 更新版本,验证逻辑不变,只是函数偏移地址变了。
现在的目标
我有 IDA Pro MCP,Claude 可以直接操作 IDA——搜函数、查交叉引用、反编译代码。
所以这个 Skill 要做到:用户只说一句"帮我分析 ins 的 SSL Pinning",Claude 通过 IDA MCP 全自动走完流程,直接输出可用的 Frida 脚本。
下面一步步拆解怎么写。
第一步:写清楚适用场景
## 适用场景用户需要对 iOS App 进行抓包但被 SSL Pinning 拦截。前提:用户已在 IDA Pro 中打开目标二进制,且 IDA MCP 已连接。注意这里写了前提条件——IDA MCP 必须连着。Claude 看到这个就知道它可以直接调用 IDA 的能力。
第二步:写 IDA MCP 自动化调用流程
这是整个 Skill 最核心的部分。
之前是写给人看的步骤:"在 IDA 里搜索 XXX,然后按 X 查交叉引用"
现在是写给 Claude 执行的 MCP 调用链:"调用 list_functions_filter("XXX"),然后调用 get_xrefs_to(地址)"
### Step 1: 搜索关键 API 函数用 IDA MCP 搜索 SSL 验证相关的系统 API:```调用顺序:1. list_functions_filter("SecTrustSetAnchorCertificates")2. 如果没找到,尝试 list_strings_filter("SecTrustSetAnchorCertificates")3. 备选:list_functions_filter("SecTrustEvaluateWithError")```预期结果:找到一个 thunk 函数,类似:```c// attributes: thunkOSStatus __cdecl SecTrustSetAnchorCertificates( SecTrustRef trust, CFArrayRef anchorCertificates){ return _SecTrustSetAnchorCertificates(trust, anchorCertificates);}```记录该函数的地址。你看,我直接写了 IDA MCP 的调用命令。Claude 看到 list_functions_filter,就知道该调用这个 MCP 工具去 IDA 里搜函数。
第三步:写交叉引用的自动追踪
### Step 2: 交叉引用,找到调用者对 Step 1 找到的函数地址做交叉引用:```调用:get_xrefs_to(Step1找到的地址)```预期结果:返回多个调用者。筛选规则:优先选 xref 数量少的那个。### Step 3: 反编译候选函数,确认核心验证函数```调用:decompile_function(候选地址)```核心验证函数的识别特征(满足越多越确定):1. 同时调用了 SecTrustSetAnchorCertificates 和 SecTrustEvaluateWithError2. 包含字符串 "Pinning validation failed"3. 包含字符串 "Certificate is revoked"4. 有循环遍历证书链的逻辑5. 有 SHA256 指纹比对逻辑6. 函数返回 0 表示成功,非 0 表示失败这段的关键在于识别特征。Claude 反编译出代码后,会根据这些特征自己判断是不是找对了函数。不对就自动继续追踪下一个 xref——这就是为什么要把特征写清楚。
第四步:写 Frida 脚本模板
### Step 5: 生成 Frida 绕过脚本方案 A(推荐):直接 hook 核心验证函数返回 0```jsInterceptor.attach( Module.findBaseAddress("{模块名}").add({偏移地址}), { onLeave: function(retval) { console.log("[*] SSL Pinning bypassed, ret:", retval); retval.replace(0x0); }});```注意模板里用了 {模块名} 和 {偏移地址} 占位符。Claude 会用前面 IDA MCP 分析出来的真实值自动替换。
第五步:写备选路径
逆向不是一条直线,所以要告诉 Claude 走不通的时候怎么换方向:
## 备选路径:字符串搜索法如果 Step 1 搜不到 SecTrustSetAnchorCertificates,换用字符串搜索:```1. list_strings_filter("Pinning validation failed")2. 对找到的字符串地址做 get_xrefs_to3. 反编译引用该字符串的函数4. 该函数大概率就是核心验证函数```这样即使主路径走不通,Claude 也知道该怎么绕。
怎么用这个 Skill
写好以后,创建文件夹,把 SKILL.md 放进去:
mkdir -p ~/.claude/skills/ios-ssl-pinning-bypass# 然后把你写好的 SKILL.md 放进去用的时候,确保 IDA Pro 已经打开了目标二进制,IDA MCP 已连接。然后:
方式 1:手动调用
/ios-ssl-pinning-bypass方式 2:自动触发
直接跟 Claude 说"帮我分析 ins 的 SSL Pinning",它会自动匹配到这个 Skill,然后通过 IDA MCP 一步步执行:搜函数 → 查交叉引用 → 反编译 → 确认特征 → 生成 Frida 脚本。
全程你只需要看着它干活就行。
写 Skill 的几个要点
写了几个 Skill 以后,我总结了一些经验:
1. 写 MCP 调用链,不要写人工操作步骤
之前我写的是"在 IDA 里搜索 XXX,然后按 X 查交叉引用"——这是写给人看的。
现在应该写"调用 list_functions_filter("XXX"),然后调用 get_xrefs_to(地址)"——这是写给 Claude 执行的。Claude 有 IDA MCP,它可以直接操作 IDA,不需要你手动点。
2. 写清楚判断条件,让 AI 能自己决策
比如反编译出来的函数,怎么判断是不是核心验证函数?你要把特征列清楚:包含什么字符串、调用了什么 API、返回值是什么含义。Claude 看到这些特征,就能自己判断对不对,不对就继续追踪下一个。
3. 写备选路径,不要只写一条线
逆向不是一条直线。主路径走不通的时候,Claude 需要知道该怎么绕。比如搜函数名搜不到,就换成搜字符串;字符串也搜不到,就逐个追踪系统 API。
4. 给模板代码,不要让 AI 从零写
你自己验证过的 Frida 脚本,直接贴在 Skill 里当模板。Claude 基于你的模板改,比它自己从零写靠谱得多。
5. 维护一个历史记录
加一个版本表格,每次成功后更新。这样你的 Skill 会越来越"聪明",积累的数据越多,后面适配越快。
6. description 要写准
description 决定了 Claude 什么时候自动触发你的 Skill。写太宽泛会误触发,写太窄又触发不了。建议写具体场景,比如"针对 iOS App 的 SSL Pinning 绕过",而不是"iOS 逆向"。
举一反三:你还能封装什么
这个思路不只是抓包能用。任何你经常重复的逆向流程,只要有 MCP 工具支持,都可以写成全自动 Skill:
• Android 脱壳流程:jadx MCP 搜索 ClassLoader → 追踪 loadClass → 定位壳入口 → 生成 dump 脚本 • 协议逆向流程:IDA MCP 搜索加密 API → 交叉引用追踪调用链 → 还原算法 → 生成复现代码 • 反调试绕过流程:IDA MCP 搜索 ptrace/sysctl → 定位检测函数 → 生成 Frida 绕过脚本 • 签名算法还原:jadx MCP 搜索 Interceptor → 追踪 sign 方法 → 提取密钥 → 生成 Python 复现
每个流程你走过一遍,就可以封装成一个 Skill。下次遇到类似的 App,Claude + MCP 全自动帮你干完。
Skill 的一些进阶用法
如果你想玩得更深一点,Skill 还支持这些:
限制工具权限
---allowed-tools: Read, Grep, Glob---这样 Skill 执行时只能读文件和搜索,不能改你的代码。适合那些只做分析不做修改的场景。
只允许手动调用
---disable-model-invocation: true---加了这个,Claude 不会自动触发,只有你手动 /skill名 才会执行。适合有副作用的操作,比如自动提交代码。
注入动态数据
## 当前环境- 分支: !`git branch --show-current`- Frida 版本: !`frida --version`!command`` 这个语法会在 Skill 执行前先跑命令,把结果注入进去。Claude 就能拿到你当前的实时环境信息。
最后
回顾一下整个思路:
1. 你手动走通一遍 Instagram SSL Pinning 的绕过流程 2. 把流程里的每一步翻译成 IDA MCP 的调用命令 3. 写清楚判断条件,让 Claude 能自己决策 4. 加上备选路径和 Frida 脚本模板 5. 打包成一个 SKILL.md,放到 ~/.claude/skills/下
以后 ins 更新版本,你只需要 IDA 打开新二进制,跟 Claude 说一句话,它就自动帮你搞定。
你提供思路,Claude 提供执行力。你走过一遍的路,它以后可以自己走。
获取完整SKILL公众号发送 ins抓包,注意大小写
END
扫码添加好友,一起探讨逆向技术、交流行业经验、共享学习资料,还能加入逆向技术同好社群

夜雨聆风