自动爬 GitHub定期更新混淆词库:一套可落地的 iOS 混淆方案

张开发
2026/5/18 15:40:58 15 分钟阅读
自动爬 GitHub定期更新混淆词库:一套可落地的 iOS 混淆方案
在做 iOS 混淆尤其是符号混淆时一个很现实的问题是❗ 混淆词库要“像人写的”但又不能重复、不能被特征识别很多项目一开始用的是随机字符串a1b2c3❌固定词表很快被识别 ❌手写词库维护成本极高 ❌更好的方案是✅自动从 GitHub 抓真实项目命名 → 清洗 → 构建混淆词库 → 定期更新这篇文章就讲清楚一套完整落地方案。一、整体架构先看结构核心流程GitHub API / 仓库爬取 ↓ 代码解析提取函数名 / 类名 / 变量名 ↓ 命名清洗过滤无效 / 垃圾命名 ↓ 词库存储本地 JSON / DB ↓ 混淆工具使用 ↓ 定时任务更新cron二、GitHub 数据获取核心1. 使用 GitHub API推荐GitHub 提供搜索 APIhttps://api.github.com/search/repositories?qlanguage:Objective-Csortstars获取热门项目然后进一步拉代码https://api.github.com/repos/{owner}/{repo}/contents/Python 示例importrequests GITHUB_TOKENyour_tokenheaders{Authorization:ftoken{GITHUB_TOKEN}}defget_repos():urlhttps://api.github.com/search/repositoriesparams{q:language:Objective-C,sort:stars,per_page:10}returnrequests.get(url,headersheaders,paramsparams).json()defget_repo_files(owner,repo):urlfhttps://api.github.com/repos/{owner}/{repo}/git/trees/main?recursive1returnrequests.get(url,headersheaders).json()2. 直接 clone更稳定gitclone--depth1https://github.com/xxx/xxx.git优点不受 API 限制可本地批量处理三、命名提取重点目标提取“像人写的命名”1. 提取 Objective-C / Swift 符号Objective-C[A-Za-z_][A-Za-z0-9_]更精准一点[-]\s*\([^)]\)\s*([A-Za-z_][A-Za-z0-9_]*)提取方法名-(void)loadUserData;得到loadUserDataSwiftfunc\s([A-Za-z_][A-Za-z0-9_]*) class\s([A-Za-z_][A-Za-z0-9_]*)2. Python 解析示例importredefextract_names(code):patterns[rfunc\s([A-Za-z_][A-Za-z0-9_]*),rclass\s([A-Za-z_][A-Za-z0-9_]*),r[-]\s*\([^)]\)\s*([A-Za-z_][A-Za-z0-9_]*)]names[]forpinpatterns:namesre.findall(p,code)returnnames四、词库清洗关键直接抓下来的数据是“脏的”必须过滤。1. 过滤规则❌ 无意义命名tmp test aaa bbb foo bar❌ 太短长度 3❌ 系统 API避免冲突viewDidLoad init dealloc2. 语义过滤推荐可以用简单规则defis_valid(name):iflen(name)3:returnFalseblacklist[test,tmp,aaa,demo]ifname.lower()inblacklist:returnFalseifname.startswith(_):returnFalsereturnTrue3. 命名风格分类提升真实度将词库分为类型示例动词load, fetch, update名词user, config组合loadUserData后续混淆可以组合生成random.choice(verbs)random.choice(nouns)五、词库存储设计推荐 JSON{class:[UserManager,NetworkService],method:[loadUserData,fetchConfig],property:[userName,isEnabled]}六、混淆工具接入生成 mappingoriginal_symbol - new_symbol示例loginUser - fetchAccountInfo getData - loadConfig生成代码importrandomdefgenerate_mapping(symbols,word_pool):mapping{}forsinsymbols:mapping[s]random.choice(word_pool)returnmapping七、定期更新机制核心价值如果词库不更新很容易被识别。1. 使用 cron03* * * python update_dict.py每天凌晨更新拉新 repo更新词库去重覆盖旧词库2. 增量更新策略避免全量重建old_setset(old_words)new_setset(new_words)mergedold_set.union(new_set)3. 版本控制推荐dict_v1.json dict_v2.json方便回滚gitdiff八、优化点实战经验1. 避免重复used_wordsset()defget_unique_word(pool):whileTrue:wrandom.choice(pool)ifwnotinused_words:used_words.add(w)returnw2. 加入“行业词”比如网络request / responseUIlayout / render数据cache / storage提升“真实性”3. 混合策略推荐真实词库 自生成组合例如fetch Manager → fetchManager九、效果对比❌ 随机字符串aB3xYz✅ GitHub词库loadUserProfile updateCachePolicy fetchNetworkConfig差异非常明显✔ 更像真实代码✔ 更难被规则识别✔ 更符合逆向干扰目标

更多文章