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):分析目标文件

攻击面探测

  1. 功能分析

    • 搜狗输入法支持用户自定义皮肤安装
    • 皮肤文件格式有两种:
      • 老版本:ZIP压缩包格式
      • 新版本:自定义二进制格式
  2. 入口点定位

    • 通过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
    

核心代码定位

  1. 命令行参数分析

    • 在IDA中搜索字符串交叉引用
    • 关键函数位于0x07A04D0,根据appid参数值决定处理逻辑
  2. 调试技巧

    • 使用DynamoRIO进行代码覆盖率分析:
    drrun.exe -t drcov -- "SGTool.exe" -line 0 -border --appid=skinreg -install -c "test.ssf" -q -ef
    
    • 发现程序采用C/S架构,主进程启动守护进程处理实际功能
  3. 错误信息利用

    • 通过故意触发错误(如使用非皮肤文件)获取关键字符串
    • 关键字符串:"皮肤解压失败:skin.ini不存在"
    • 通过交叉引用定位到关键函数0x07A72D0

皮肤文件处理逻辑分析

文件格式校验

  1. 函数0x914980

    • 打开文件读取前4字节判断是否为"Skin"
    • 如果是"Skin"则认为是新格式,否则认为是老格式ZIP
  2. 老格式处理

    • 调用decompress_skin_ini(0x063F340)
    • 使用ziplib.dll解压并解析skin.ini
  3. 新格式处理

    • 调用deal_skin(0x7A6230) → parse_skin_v3(0x63E3F0)
    • 最终由decompress_skinv3(0x053B320)处理

新版本皮肤文件格式

  1. 文件头结构

    • 前8字节:
      • 0-3字节:"Skin"标识
      • 4-7字节:版本号
  2. 解码流程

    • 偏移8开始的数据使用自定义算法解码(函数0x0639610)
    • 解码后数据偏移4开始是zlib压缩数据
    • 对zlib解码后的数据进行文件提取(函数0x53bf50)
  3. 提取文件结构

    • 前4字节:总数据长度
    • 接下来4字节:文件映射表长度(通常0x38字节)
    • 映射表:每4字节表示一个文件偏移
    • 文件结构:
      • 4字节:文件名长度
      • 文件名(Unicode编码)
      • 4字节:文件数据长度
      • 文件数据

漏洞分析

  1. 漏洞位置

    • 在自定义解码后的数据中,前4字节表示数据大小(deocded_data_size)
    • 程序会将该值加8后分配内存
  2. 漏洞原理

    • 当deocded_data_size为0xFFFFFFFF时
    • 加8会导致整数溢出(0xFFFFFFFF + 8 = 7)
    • 分配小内存块导致后续操作堆溢出
  3. 利用条件

    • 需要构造恶意的.ssf文件
    • 控制解码后的前4字节为极大值

总结与最佳实践

  1. 逆向分析技巧

    • 善用监控工具(API Monitor/Process Monitor)定位关键代码
    • 利用错误信息字符串交叉引用快速定位关键函数
    • 动态调试与静态分析结合验证猜测
  2. 漏洞挖掘方法

    • 重点关注文件解析过程中的内存操作
    • 特别注意从文件读取的长度字段的使用
    • 检查整数溢出可能性(特别是加法/乘法运算)
  3. 防御建议

    • 对从文件读取的长度字段进行严格校验
    • 使用安全的内存分配函数
    • 实现完善的错误处理机制

附录

  1. 相关工具下载

    • API Monitor: http://www.rohitab.com/apimonitor
    • Process Monitor: https://docs.microsoft.com/en-us/sysinternals/downloads/procmon
    • DynamoRIO: https://dynamorio.org/
  2. 参考资源

    • 皮肤编辑器下载:https://pinyin.sogou.com/skins/design.php
    • 示例皮肤文件:链接已失效(原链接为百度网盘)

通过本教程,您应该掌握了Windows程序逆向分析的基本流程和漏洞挖掘的关键技巧。实际分析中需要结合多种工具和方法,耐心细致地追踪程序执行流程和数据流向,才能有效发现潜在的安全问题。

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文件时执行的命令: 实际处理命令: 核心代码定位 命令行参数分析 : 在IDA中搜索字符串交叉引用 关键函数位于0x07A04D0,根据appid参数值决定处理逻辑 调试技巧 : 使用DynamoRIO进行代码覆盖率分析: 发现程序采用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开始的数据使用自定义算法解码(函数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程序逆向分析的基本流程和漏洞挖掘的关键技巧。实际分析中需要结合多种工具和方法,耐心细致地追踪程序执行流程和数据流向,才能有效发现潜在的安全问题。