SG Input 软件安全分析之逆向分析
字数 1892 2025-08-29 08:32:00
SG Input 软件逆向分析与漏洞挖掘实战教程
前言
本教程将详细介绍如何对Windows程序进行安全分析,以搜狗输入法的皮肤处理功能为例,展示完整的逆向分析流程和漏洞挖掘方法。分析的软件版本为2018-10-9版本。
分析环境准备
-
工具准备:
- IDA Pro:用于静态反编译分析
- OllyDbg/Immunity Debugger:用于动态调试
- API Monitor:监控系统API调用
- Process Monitor:监控进程行为
- Dr. Memory/DynamoRIO:用于代码覆盖率分析
- 010 Editor/Binwalk:文件格式分析
-
目标软件:
- SGTool.exe:搜狗输入法皮肤处理核心组件
- 皮肤文件(.ssf):分析目标文件
攻击面探测
-
功能分析:
- 搜狗输入法支持用户自定义皮肤安装
- 皮肤文件格式有两种:
- 老版本:ZIP压缩包格式
- 新版本:自定义二进制格式
-
入口点定位:
- 通过API Monitor监控发现双击.ssf文件时执行的命令:
"C:\Program Files (x86)\SogouInput\SogouExe\SogouExe.exe" "C:\Program Files (x86)\SogouInput\9.1.0.2657\SGTool.exe" -line 0 -border --appid=skinreg -list "C:\Users\XinSai\Desktop\test.ssf"- 实际处理命令:
"C:\Program Files (x86)\SogouInput\9.1.0.2657\SGTool.exe" -line 0 -border --appid=skinreg -install -c "C:\Users\XinSai\Desktop\test.ssf" -q -ef
核心代码定位
-
命令行参数分析:
- 在IDA中搜索字符串交叉引用
- 关键函数位于0x07A04D0,根据appid参数值决定处理逻辑
-
调试技巧:
- 使用DynamoRIO进行代码覆盖率分析:
drrun.exe -t drcov -- "SGTool.exe" -line 0 -border --appid=skinreg -install -c "test.ssf" -q -ef- 发现程序采用C/S架构,主进程启动守护进程处理实际功能
-
错误信息利用:
- 通过故意触发错误(如使用非皮肤文件)获取关键字符串
- 关键字符串:"皮肤解压失败:skin.ini不存在"
- 通过交叉引用定位到关键函数0x07A72D0
皮肤文件处理逻辑分析
文件格式校验
-
函数0x914980:
- 打开文件读取前4字节判断是否为"Skin"
- 如果是"Skin"则认为是新格式,否则认为是老格式ZIP
-
老格式处理:
- 调用decompress_skin_ini(0x063F340)
- 使用ziplib.dll解压并解析skin.ini
-
新格式处理:
- 调用deal_skin(0x7A6230) → parse_skin_v3(0x63E3F0)
- 最终由decompress_skinv3(0x053B320)处理
新版本皮肤文件格式
-
文件头结构:
- 前8字节:
- 0-3字节:"Skin"标识
- 4-7字节:版本号
- 前8字节:
-
解码流程:
- 偏移8开始的数据使用自定义算法解码(函数0x0639610)
- 解码后数据偏移4开始是zlib压缩数据
- 对zlib解码后的数据进行文件提取(函数0x53bf50)
-
提取文件结构:
- 前4字节:总数据长度
- 接下来4字节:文件映射表长度(通常0x38字节)
- 映射表:每4字节表示一个文件偏移
- 文件结构:
- 4字节:文件名长度
- 文件名(Unicode编码)
- 4字节:文件数据长度
- 文件数据
漏洞分析
-
漏洞位置:
- 在自定义解码后的数据中,前4字节表示数据大小(deocded_data_size)
- 程序会将该值加8后分配内存
-
漏洞原理:
- 当deocded_data_size为0xFFFFFFFF时
- 加8会导致整数溢出(0xFFFFFFFF + 8 = 7)
- 分配小内存块导致后续操作堆溢出
-
利用条件:
- 需要构造恶意的.ssf文件
- 控制解码后的前4字节为极大值
总结与最佳实践
-
逆向分析技巧:
- 善用监控工具(API Monitor/Process Monitor)定位关键代码
- 利用错误信息字符串交叉引用快速定位关键函数
- 动态调试与静态分析结合验证猜测
-
漏洞挖掘方法:
- 重点关注文件解析过程中的内存操作
- 特别注意从文件读取的长度字段的使用
- 检查整数溢出可能性(特别是加法/乘法运算)
-
防御建议:
- 对从文件读取的长度字段进行严格校验
- 使用安全的内存分配函数
- 实现完善的错误处理机制
附录
-
相关工具下载:
- API Monitor: http://www.rohitab.com/apimonitor
- Process Monitor: https://docs.microsoft.com/en-us/sysinternals/downloads/procmon
- DynamoRIO: https://dynamorio.org/
-
参考资源:
- 皮肤编辑器下载:https://pinyin.sogou.com/skins/design.php
- 示例皮肤文件:链接已失效(原链接为百度网盘)
通过本教程,您应该掌握了Windows程序逆向分析的基本流程和漏洞挖掘的关键技巧。实际分析中需要结合多种工具和方法,耐心细致地追踪程序执行流程和数据流向,才能有效发现潜在的安全问题。