2020.04.06-2020.04.12

菜单功能限制

相关函数

要将软件菜单和窗口变得不可用,可用以下函数

  1. EnableMenultem()
    允许或进制指定的菜单条目
    参数:菜单句柄、目标菜单条目的标识符、控制标志(允许、灰化、禁止等)
    返回值:返回菜单以前的状态
  2. 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()等

破解网络验证的一般思路

如果验证的数据包内容固定,可以抓取数据包,写一个本地服务端模拟服务器
如果不固定则需要找出相应的算法

  1. 分析发送的数据包
    在od中对send()之类的函数设断,分析加密的位置和方式
  2. 分析接收的数据包
    客户端程序使用recv()之类的函数接收数据,然后进行解密。对解密后数据存放的地址下内存读断点
  3. 解除网络验证
    编写一个服务端,模拟服务器来接收和发送数据
    如果软件用域名登陆服务器,可以修改hosts,使域名指向本地
    如果软件用ip地址连接服务器,可以用inet_addr或connect等设断,将ip地址修改为本地ip地址,或用代理软件将ip地址指向本地

网络验证的关键是数据包分析

常用断点设置

加密算法

单向散列算法

即hash算法,是将任意长度的消息压缩到某一固定长度的函数(不可逆)
因为是不可逆算法,只能使用hash函数作为加密的一个中间步骤。如,对用户名进行hash变换,再用这个结果进行可逆的加密变换,生成注册码

MD5算法

MD5消息摘要算法
对任意长度的消息进行运算,产生128位的消息摘要

算法原理

  1. 数据填充
    填充消息,使消息长度(bit)对512求余的结果等于448【比512的倍数小64位】(本身满足了也要)。方法是:附一个1在后面,然后用0来填充。
  2. 添加长度
    在结尾用64位记录原文长度,最终消息长度是512的整数倍
  3. 初始化变量
    MD5的结果按32位一组分成4组,由4个寄存器(A、B、C、D)进行演变得到
    寄存器初始值为:
1
2
3
4
5
6
7
8
9
10
原本应为:
A=0x01234567
B=0x89ABCDEF
C=0xFEDCBA98
D=0x76543210
为了在内存中也长那样↑,所以要调整成:
A = 0x67452301;
B = 0xEFCDAB89;
C = 0x98BADCFE;
D = 0x10325476;
  1. 数据处理
    4个辅助函数:
1
2
3
4
F(X, Y, Z) =(X&Y) | ((~X) & Z)
G(X, Y, Z) =(X&Z) | (Y & (~Z))
H(X, Y, Z) =X^Y^Z
I(X, Y, Z)=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:有个表
  1. 输出

分析

用peid插件krypto analyzer分析,得知程序含有md5的迭代常数,可以猜测使用了md5算法
输入的注册码后进行长度等的判断以及数据初步处理:

上图call的地址里的代码,通过mov的4个数判断在进行md5初始化:
再根据后续出现的md5算法的正弦函数表(如D76AA478)中的元素可以判断为md5算法

SHA算法

只看了一点,就放到下周的周报上了