跳转至

软件保护基础

我们遇到过哪些侵害软件知识产权的行为?

  • 软件盗版行为是指任何未经软件著作权人许可,擅自对软件进行复制、传播,或以其他方式超出许可范围传播、销售和使用的行为

本章知识点: • 序列号保护 • 警告窗口 • 时间限制 • 菜单功能限制 • KeyFile保护

重点:各种保护技术的实现机理与脆弱性

序列号保护

序列号的验证 - 验证用户名和序列号之间的数学映射关系

序列号检查的4种基本方法: • 将用户名等信息作为自变量,通过函数F变换之后得到注册码 • 通过注册码验证用户名的正确性 • 通过对等函数检查注册码 • 同时将用户名和注册码作为自变量(即采用二元函数)

通过用户名生成序列号

将用户名作为自变量,通过函数F变换之后得到注册码 • 将计算出的注册码和用户输入的注册码进行比较,以确定用户是否为合法用户 • 序列号=F(用户名)

序列号的脆弱性

序列号是以明文形式存储在内存中 • 序列号很容易被逆向分析出来,不安全 • 注册码泄漏 • 注册机:映射函数F的泄漏,构造注册机 • 破解版:修改注册码的比较指令,通过注册码检查

通过注册码验证用户名

生成注册码的公式:序列号=F(用户名) • 检查注册码,是利用F的逆变换\(F^{-1}\) • 用户名=\(F^{-1}\)(序列号)

相对来说,比上面的那种方法更加安全: • 生成注册码的函数F 没有直接出现在软件代码中 • 注册码的明文没有出现在内存中

破坏注册码的验证过程

破坏注册码的验证过程 • 因为\(F^{-1}\)在软件中的,通过\(F^{-1}\)找出F • 给定一个序列号,利用公式得出一个用户名,从而得到一个正确的用户名/序列号对

对等函数验证注册码

验证公式:F1(用户名)= F2(序列号) • 内存中不出现注册码的明文

二元函数

之前的3种注册码验证函数都是一元函数 • 二元函数:同时将用户名和注册码作为自变量 • 验证公式: 特定值= F3(用户名、序列号)

  • 用户名与序列号之间的关系不再清晰
  • 必须维护用户名与序列号之间的唯一性

序列号面临的安全问题(脆弱性)

• 破解版:修改判断序列号之后的跳转指令 • 注册机:逆向用户信息和序列号的映射关系,构造注册机

警告窗口

警告(Nag)窗口是软件设计者用来提醒用户购买正式版本的弹出窗口

去除警告窗口常用方法 • 修改程序的资源 • 静态分析 • 动态分析

修改程序的资源

• 将警告窗口的属性修改成透明或不可见 • 完全去掉Nag,需要定位窗口的创建代码

静态分析

• 资源分析发现启动画面窗口的ID是121(79h) • 通过ID 79h找到“Dialog: DialogID_0079” 就是Nag

去除警告窗口

• 跳过警告窗口代码 • 修改开始位置push,变成jmp,直接到结束之后 • 使用主对话框的参数修改Nag的DialogBoxParam函数的参数

时间限制

软件的安装日期的修改

• RegMon、FileMon等监控软件可以找到日期的存储位置 • 删除时间,破除时间限制保护 • 将软件的安装日期存储在多个位置

修改最近一次运行的系统时间

攻击者可以通过修改系统时间绕过软件的时间限制保护 • 在软件打开、退出的时候都要进行日期检查 • 使用多种方式获得系统时间 • 常用的API:GetSystemTime、GetLocalTime • 读取被频繁修改的系统文件的最后修改日期

菜单功能限制

通常试用版的软件,菜单或窗口中的部分选项是 灰色的,无法使用。 • 这种功能受限的程序有两种 • 试用版和正版软件是完全两个不同的文件(推荐使用) • 试用版和正版软件是同一个文件

将软件菜单和窗口变灰(不可用状态),可以使用如下函数 • EnableMenuItem函数 • EnableWindow函数

KeyFile保护

实现机理

KeyFile也叫注册文件,是一种利用文件来注册软件的保护方式,包含加密或者未加密的数据。试用版的软件一般没有KeyFile,用户向作者付费后,会收到作者提供的KeyFile。 • 将KeyFile放入指定的目录就可以完成注册

增强KeyFile安全性的几个方法: • 采用较大的KeyFile文件 • 加入垃圾信息,干扰逆向分析 • KeyFile的合法性检查分成几部分,分散在软件的不同模块中进行 判断 • KeyFile数据处理也要尽可能采用复杂的运算 • 可以让注册文件中的部分数据和软件中的关键代码或数据发生关联,使软件无法被暴力破解

脆弱性

KeyFile是一个文件,因此,所有与Windows文件操作有关的API函数都可作为动态跟踪破解的断点。

• 在调试器中,对CreateFileA函数设断点 • 对ReadFile函数设断点 • 分析传递给ReadFile函数的文件句柄和缓冲区地址 • 逆向分析程序对KeyFile的判断过程

• 用Process Monitor等工具,监视软件对文件的操作,以找到 KeyFile的文件名。 • 伪造一个KeyFile文件。用十六进制工具,编辑和修改KeyFile