2020.04.06-2020.04.12
菜单功能限制
相关函数
要将软件菜单和窗口变得不可用,可用以下函数
- EnableMenultem()
允许或进制指定的菜单条目
参数:菜单句柄、目标菜单条目的标识符、控制标志(允许、灰化、禁止等)
返回值:返回菜单以前的状态 - EnableWindow()
允许或禁止指定窗口
参数:窗口句柄、true/false
返回值:0表示失败,非0表示成功
拆解菜单限制保护
修改控制标志或true/false
KeyFile保护
付费后将作者提供的注册文件keyfile放到指定目录下可用让软件成为正版
软件每次启动时都会读取该文件,然后利用某种算法进行处理,以此判断结果是否正确
相关api函数
api函数 | 作用 |
---|---|
FindFirstA | 确定文件是否存在 |
CreateFileA、_lopen | 确定文件是否存在;打开文件获得其句柄 |
GetFileSizeA、GetFileEx | 获得文件的大小 |
GetFileSize、GetFileAttributesExA | 获得文件的属性 |
SetFilePointer、GetFilePointerEx | 移动文件指针 |
ReadFile | 读取文件内容 |
网络验证
思路是拦截服务器返回的数据包,分析程序是如何处理数据包的
相关函数
常用的有send()、recv()【这两个是socket(套接字,计算机之间进行通信的一种约定或一种方式)函数】、WSASend()、WSARecv()等
破解网络验证的一般思路
如果验证的数据包内容固定,可以抓取数据包,写一个本地服务端模拟服务器
如果不固定则需要找出相应的算法
- 分析发送的数据包
在od中对send()之类的函数设断,分析加密的位置和方式 - 分析接收的数据包
客户端程序使用recv()之类的函数接收数据,然后进行解密。对解密后数据存放的地址下内存读断点 - 解除网络验证
编写一个服务端,模拟服务器来接收和发送数据
如果软件用域名登陆服务器,可以修改hosts,使域名指向本地
如果软件用ip地址连接服务器,可以用inet_addr或connect等设断,将ip地址修改为本地ip地址,或用代理软件将ip地址指向本地
网络验证的关键是数据包分析
常用断点设置
加密算法
单向散列算法
即hash算法,是将任意长度的消息压缩到某一固定长度的函数(不可逆)
因为是不可逆算法,只能使用hash函数作为加密的一个中间步骤。如,对用户名进行hash变换,再用这个结果进行可逆的加密变换,生成注册码
MD5算法
MD5消息摘要算法
对任意长度的消息进行运算,产生128位的消息摘要
算法原理
- 数据填充
填充消息,使消息长度(bit)对512求余的结果等于448【比512的倍数小64位】(本身满足了也要)。方法是:附一个1在后面,然后用0来填充。 - 添加长度
在结尾用64位记录原文长度,最终消息长度是512的整数倍 - 初始化变量
MD5的结果按32位一组分成4组,由4个寄存器(A、B、C、D)进行演变得到
寄存器初始值为:
1 | 原本应为: |
- 数据处理
4个辅助函数:
1 | F(X, Y, Z) =(X&Y) | ((~X) & Z) |
将ABCD的副本abcd中的3个经过运算后与第四个相加,再加上两个常数,并将所得的值循环左移s位,最后将所得结果加上abcd之一,回送至ABCD(一次子循环)
- 执行的函数和次数:
先执行16次F,再执行16次G…共64次(每次主循环)
主循环次数:原文长度/512(全部消息) - 相加的两个常数:
一个是利用第2步的原文,将其等分成16份(每份长度为32位),循环使用其中一份。
另一个是4^32*abs(sin(i))得到的整数部分,在第i步中,i用弧度表示。目的是用正弦函数和幂函数消除变换中的线性 - 循环左移位数s:有个表
- 输出
分析
用peid插件krypto analyzer分析,得知程序含有md5的迭代常数,可以猜测使用了md5算法
输入的注册码后进行长度等的判断以及数据初步处理:
上图call的地址里的代码,通过mov的4个数判断在进行md5初始化:
SHA算法
只看了一点,就放到下周的周报上了