ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

加密与解密(第四版)第5章演示版保护技术

2020-12-08 14:01:23  阅读:261  来源: 互联网

标签:用户名 函数 解密 修改 第四版 演示版 序列号 断点 注册码


序列号保护机制

  1. 将用户名等信息作为自变量,通过函数F变换之后得到注册码
    序 列 号 = F ( 用 户 名 ) 序列号=F(用户名) 序列号=F(用户名)
    破解方法:
    ①利用调试器内存中直接获取到明文注册码
    ②利用调试器提取出函数F,制作计算注册码程序
    ③直接修改比较指令跳过注册码检查
  2. 通过注册码验证用户名的正确性
    用 户 名 = F − 1 ( 序 列 号 ) 用户名=F^{-1}(序列号) 用户名=F−1(序列号)
    破解方法:
    ①通过F的逆变换,找出F,从而制作计算注册码程序
    ②给定一个用户名,利用穷举法找出满足F的序列号
    ③给定一个序列号,直接利用F的逆变换,生成一个用户名(此用户名一般不包含不可显示字符)
  3. 通过对等函数检查注册码
    F 1 ( 用 户 名 ) = F 2 ( 序 列 号 ) F1(用户名) = F2(序列号) F1(用户名)=F2(序列号)
  4. 同时将用户名和注册码作为自变量(即二元函数)
    特 征 值 = F ( 用 户 名 , 特 征 值 ) 特征值 = F(用户名,特征值) 特征值=F(用户名,特征值)

攻击序列号保护

  1. 利用数据约束性(只对用明文进行比较注册码有效)
    大多数使用明文进行注册码比较真伪过程中,真正的注册码会在某个时刻出现在内存中,大多数情况下,真正的注册码会在用户输入的注册码的内存地址-90h~+90h字节的地方
  2. 利用消息断点
    许多序列号验证时都存在一个验证按钮,当点击按钮时,将发送鼠标消息,利用此消息能够找到按钮对应的事件代码
  3. 利用提示信息
    利用输入错误的提示信息,来查找对应的验证代码处

字符串比较形式

为了防止破解者直接修改跳转指令,加密者往往会迂回的比较字符串

  1. 寄存器直接比较
  2. 函数比较a
  3. 函数比较b
  4. 串比较

制作注册机

对明码进行比较软件的攻击:
利用keymake软件,拦截程序指令,并将出现的明码直接显示出来,可以直接生成注册机

对非明码进行比较软件的攻击:
通过分析得到加密算法和逆加密算法,来编写注册机。或者通过ollydlg的Asm2Clipboard插件、IDA等工具直接将序列号算法的汇编代码提取出来,嵌入高级语言直接调用,而无需进行具体算法实现。

去除警告窗口

①将可执行文件中警告窗口的属性设置为透明或不可见
②找到创建该窗口的代码进行跳过
③利用消息断点设置断点拦截

去除时间限制

时间限制的两种方式:
①限制每次运行的时长
②每次运行的时长不限,但有总共的时间限制

程序可用的定时器函数:
SetTimer、timeSetEvent、GetTickCount、timeGetTime

程序可用的获取时间函数:
GetSystemTime、GetLocalTime、GetFileTime
或者读取系统需要频繁修改的文件(user.dat、system.dat等)的最后修改日期,然后调用FileTimeToSystemTime函数转换为系统日期格式,确定当前系统日期

破解SetTimer方法:

  1. 直接跳过SetTimer函数,不产生WM_TIMER消息
  2. 通过查找WM_TIMER消息对应的消息码0x113,定位到设置WM_TIMER处,修改消息就能取消时间限制了

去除菜单功能限制

正式版本将所有菜单全部打开,但试用版本将部分菜单隐藏置灰

菜单或窗口置灰不可用函数:
EnableMenuItem、EnableWindow

破解方法:
断点让菜单或窗口置灰不可用函数,修改传入的代表不可用或置灰的参数,修改为正常

KeyFile保护

软件采用一个包含认证信息的文件作为验证方式,当把由软件开发者发放的认证KeyFile放入软件程序目录后。软件每次启动时,检查KeyFile认证文件,从中读取数据,然后更具某种算法进行校验或处理,判断是否为正确的注册文件,如果正确,则以正式版本运行

文件相关函数:


或者通过procmon程序监视文件

网络验证

网络相关函数:
send、recv、WSASend、WSARecv

破解方法:

  1. 修改hosts文件,使域名指向本地
  2. 如果直接使用ip连接,则对inet_addr、connect设断点,将ip地址修改为本地ip
  3. 编写一个服务端程序,伪造回复认证正确的数据包

光盘验证

一些通过光盘发行的软件或游戏,在使用时需要检测光盘是否插在光驱中,如果没有则拒绝运行

一般步骤为:
先调用GetLogicalDriveString或GetLogicalDrives得到系统中安装的所有驱动器的列表,然后用GetDriveType检查每个驱动器是否为光驱,如果是再用CreateFile或FindFirstFile函数检测特定的文件是否存在,甚至进一步检测文件的属性、大小、内容等。

破解方法:
在相关函数上设置断点,找到程序启动时检测光驱的地方,修改判断指令,就可以跳过检测。
使用光盘刻录或复制工具制作多份光盘,或采用虚拟光驱模拟正版光盘

只允许一个实例

软件常用实现方法:

  1. 查找窗口法
    程序启动时,调用FindWindow、GetWindowText函数查找具有相同类名或标题名的窗口,如果找到就退出运行
  2. 使用互斥对象
    程序启动时,调用CreateMutexA函数尝试创建一个互斥对象,如果创建不了代表已经有了一个,那么就退出运行
  3. 使用共享区块
    创建一个共享区块Section,该区块拥有读取、写入、共享保护属性,让多个实例共享一个内存块,将一个代表目前运行实例的变量写入该区块

常用断点集合

标签:用户名,函数,解密,修改,第四版,演示版,序列号,断点,注册码
来源: https://blog.csdn.net/shang_cm/article/details/110868941

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有