gOSINT代码原理剖析正则表达式、OCR识别与API调用的实现细节【免费下载链接】gOSINTOSINT Swiss Army Knife项目地址: https://gitcode.com/gh_mirrors/go/gOSINTgOSINT是一款用Go语言编写的开源OSINT工具被称为OSINT瑞士军刀能够通过正则表达式、OCR识别和多种API调用完成邮箱收集、子域名枚举、数据泄露查询等情报搜集任务。本文将以internal目录下的源码为核心深入剖析gOSINT代码原理带你理解它如何用正则解析网页、用OCR破解验证码以及如何封装GitHub、Shodan等第三方API非常适合想学习OSINT工具开发原理的入门开发者。gOSINT是什么一款用Go语言编写的OSINT瑞士军刀gOSINT全称为 Open Source INTelligence Swiss Army Knife定位是开源情报瑞士军刀把所有常见的OSINT侦查手段集成到一个命令行工具中。它的核心能力包括从Git仓库的提交记录中提取邮箱和用户名查询PGP密钥服务器上的邮箱、别名与KeyID检查邮箱是否出现在haveibeenpwned数据泄露库中抓取Telegram公开群组的完整消息历史使用crt.sh证书透明日志枚举子域名根据手机号反查机主姓名通过Shodan查询主机信息反向Whois查询域名归属所有模块都由 Go 实现跨平台支持 Windows、Linux 和 macOS安装只需 Go 环境加一个 tesseract-ocr 依赖非常适合作为学习Go网络编程与OSINT工具开发的参考项目。模块化目录结构一张图看懂代码组织gOSINT的源码采用清晰的分层结构所有功能模块都放在internal目录下每个子目录对应一个独立的情报搜集能力internal/axfr/基于crt.sh的子域名枚举模块internal/git/Git仓库邮箱提取支持GitHub API与本地clone两种方式internal/hibp/haveibeenpwned数据泄露查询internal/pgp/PGP密钥服务器搜索internal/pni/电话号码归属地查询含OCR识别验证码internal/shodan/Shodan主机扫描与查询internal/telegram/Telegram公开群组历史消息爬虫internal/reversewhois/反向Whois域名查询internal/utils/公共工具函数HTTP请求、配置文件读写、日志输出这种一模块一目录的设计让代码职责单一、易于扩展想新增一个OSINT数据源只需仿照已有模块在internal下新建目录即可。所有模块共享utils包中的RetrieveRequestBody发送GET请求和GetConfigValue读取配置等基础能力避免了重复代码。正则表达式实战crt.sh子域名枚举的实现原理子域名枚举模块的源码位于internal/axfr/axfr.go它的工作流程非常典型请求证书透明日志接口 → 正则提取域名 → 去重 → 可选验证存活状态。核心逻辑是拼接crt.sh的JSON查询URLquerystring : https://crt.sh/?q%. report.Domain outputjson由于crt.sh返回的JSON格式并不规范作者选择用一行正则表达式直接提取域名re : regexp.MustCompile(name_value:([^\*\.][^]))这条正则以name_value:开头锚定JSON字段捕获组([^\*\.][^])匹配不以*或.开头的域名内容正好过滤掉泛解析记录。提取结果放入map[string]bool自动去重如果开启了--verify参数还会用http.Client逐个请求子域名并记录HTTP状态码帮你判断哪些子域名真正在线。这个案例展示了OSINT工具中正则表达式的经典用法当上游接口的数据格式不稳定时正则是最快速、最灵活的兜底方案。Telegram历史消息抓取正则表达式的高阶组合Telegram模块internal/telegram/telegram.go是gOSINT中正则使用密度最高的部分它通过构造https://t.me/群组/消息ID?embed1这样的嵌入式页面URL逐个递增消息ID抓取群组历史。由于Telegram的网页版没有开放公共API给未授权用户gOSINT只能解析HTML页面中的关键标记消息正文classtgme_widget_message_text dirauto(.*)/div图片地址image:url\((https:\/\/[\w.\/-])语音消息voice\ssrc(https:\/\/[\w.\/-])视频地址video?\ssrc(https:\/\/[\w.\/-])服务消息message_media_not_supported_label回复对象reply\shrefhttps:\/\/t.me\/[\w/]getTelegramMessage函数先用一个正则拿到正文再组合getTelegramMedia系列函数把图片、语音、视频、文档标记拼接进消息体getMessageRepliedAuthor则负责识别回复场景下的被回复人昵称。每条消息还会用getTelegramUsername和getTelegramMessageDateTime提取发送者与时间戳最终通过html2text库把HTML格式转成纯文本输出。值得学习的设计是grace容错机制如果连续若干条消息都抓取为空说明可能遇到了被删除的消息或已经到达群组末尾程序会记录已删除消息计数并在恢复有效消息时补写[MESSAGE REMOVED]占位符保证消息序号连续。配合--dump参数还能把抓取进度写入本地dump文件下次运行自动断点续爬。OCR识别破解验证码电话号码归属地查询原理PNI模块internal/pni/pni.go是gOSINT最有趣的实现之一它展示了如何用OCR识别技术绕过网站的图形验证码原理完全透明。查询流程是这样的发送GET请求到https://sync.me/search/?number号码模拟Android手机浏览器UA用正则var\scaptchaURL\s\s...从返回页面中提取验证码图片的URL下载验证码图片交给tesseract-ocr 引擎识别文字把识别结果作为g-recaptcha字段POST回服务器再次POSTactionsearch获取JSON格式的机主信息OCR识别的核心代码只有短短几行ocr : gosseract.NewClient() ocr.SetWhitelist(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789) ocr.SetImageFromBytes(challenge) text, _ : ocr.Text()gosseract是Go语言对Tesseract的封装SetWhitelist把识别字符限定为字母和数字能显著提升验证码识别准确率。这就是为什么项目依赖中必须安装tesseract-ocr、libtesseract-dev和libleptonica-dev——OCR引擎是整个模块的地基。整个流程还通过cookiejar保持会话Cookie、伪造移动端User-Agent和Referer模拟真实的浏览器行为体现了API调用中请求头伪装与会话管理的实战技巧。PGP密钥服务器与反向Whois正则解析的细节打磨internal/pgp/pgp.go负责查询pgp.mit.edu密钥服务器它用一条复杂的正则同时捕获KeyID、姓名和邮箱re : regexp.MustCompile(search(0x[0-9A-F])[^]*\s*([^])lt;([^])[^]/a\s*([^])?)这里利用HTML实体lt;即来定位邮箱字段配合strings.TrimSpace清理空白字符。一个PGP实体往往有多个别名extractAliases函数再用多行模式正则(?m)^\s*(.*) lt;([^])把别名列表逐个拆分最终输出每个人的KeyID、姓名、邮箱及全部别名。反向Whois模块internal/reversewhois/reversewhois.go的思路类似它请求viewdns.info的反向Whois页面用正则/trtrtd([^\s])/tdtd(\d{4}-\d{2}-\d{2})/tdtd(.*)/td从HTML表格行中提取域名、创建日期和注册商然后以结构化JSON输出。这两个模块证明了一个重要结论正则表达式的目标不是看懂整个HTML而是精准定位你关心的那一段特征文本学习OSINT开发时多练习HTML特征正则收益很大。API调用实现细节GitHub、Shodan与HIBP的封装方式除了直接解析网页gOSINT也大量使用官方SDK封装第三方API代码风格更优雅。GitHub APIinternal/git/github.go通过go-github官方库列出用户的全部仓库和提交记录。支持在gosint.toml配置文件中写入ghtoken有Token时用oauth2.StaticTokenSource走OAuth认证提升速率限制没有Token则匿名调用。分页处理是重点——ListCommitsOptions每次拉取100条通过判断resp.NextPage是否为零来循环翻页直到取完所有提交。Shodan APIinternal/shodan/shodan.go使用go-shodanSDK从配置文件读取shodanapikey支持两种模式StartShodanScan查询单个主机的开放端口、服务等信息StartShodanQuery则执行自定义搜索查询还能通过--new-scan触发一次付费扫描。HIBP数据泄露查询internal/hibp/hibp.go借助goPwned库调用 haveibeenpwned 的公开接口查询邮箱出现在哪些数据泄露事件中配合--get-passwords参数还能获取泄露的密码列表。代码里特别加入了time.Sleep(2s)的防封禁限速逻辑避免连续请求触发对方接口的反爬策略。这些API调用共同遵循一个模式配置密钥集中管理utils包的viper封装、请求限速防封禁、统一JSON输出这套模式可以直接复用到你自己的信息搜集工具开发中。总结从gOSINT源码中能学到什么纵观gOSINT的代码实现最值得新手学习的三点经验是正则表达式是OSINT工具的第一生产力——面对HTML、JSON等非结构化数据一行精妙的正则往往比写完整解析器更快更稳OCR识别是绕过图形验证码的通用方案——tesseract配合字符白名单就能自动化原本需要人工干预的验证步骤第三方API要统一封装——密钥集中配置、分页循环、限速容错这些细节决定了工具在真实环境中的可用性。如果你正在学习Go网络编程、研究OSINT自动化或者想给安全工具加入信息搜集能力不妨clone一份gOSINT源码逐个模块阅读internal目录下的实现再自己动手扩展一个数据源你会对情报搜集工具是如何炼成的有最直观的理解。【免费下载链接】gOSINTOSINT Swiss Army Knife项目地址: https://gitcode.com/gh_mirrors/go/gOSINT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考