ZNKKeygenme#1逆向分析小结

本文详细介绍了ZNKKeygenme#1的破解过程,包括合法性检查、序列号算法和生成序列号的方法。通过分析汇编代码,揭示了程序如何验证输入序列号的合法性,以及序列号生成的逻辑。最终,通过理解算法,成功输入序列号完成破解。
摘要由CSDN通过智能技术生成

1 破解文件

文件名:ZNKKeygenme#1.exe

ZNKKeygenme#1_Readme:

         Hi all,

         This is my first Keygenme, written in ASM.

         _ Find the solution

         _ make a keygen

         _ And submit a tuto

         tested on WinXP SP2 but should work on SP1 and Win2K.

         Good work !

         Znycuk

文件下载地址:https://tuts4you.com/download/get/3152/

2 合法性检查

图1 WIN32窗口消息事件响应函数

单步跟踪可以看出该程序是一个用汇编语言编写的标准WIN32窗口程序,当输入序列号并点击Serial me按钮之后,触发窗口消息事件,通过单步跟踪找到窗口消息事件的响应函数入口地址0x76C0FB86,如图1所示。根据经验推测:程序应该先从窗口获取输入的序列号字符串,对序列号字符串做长度等合法性检查,再根据Key值计算出期望的序列号,最后与用户输入的序列号进行比对以判断是否校验通过。

图2 获取用户输入序列号

                                              图3 获取用户输入序列号

图2中0x76C0FBDA处调用user32.76C0616A函数从窗口获取序列号字符串并存储到0x004030D8地址内存中,并在004012DA(如图3)处取得用户输入的序列号字符串长度为0x13。

图4 序列号合法性检查

如图4所示,0x004012EC处调用函数ZNKKeyge.00401679对用户输入的序列号进行合法性检查,该函数进去之后直接从0x0040167F跳转到0x00401697执行了一个do while操作。0x00401682处以bl为0作为while循环的退出条件,进而退出函数。如图5,地址0x00401686地址处repne scas指令很明显是一个字符串扫描判断操作,repne重复操作的退出条件是字符串中包含ah(0x2D即’-’分隔符)中的字符,0x004016A4处置bl为3,因此可以推测合法的序列号应该类型以’-’分隔符的四组字符串;而0x0040168F处指令则可能暗示减去本次循环已经判断过的字符数(4个有效字符加上一个分隔符’-’),0x00401697处则表示总共需要检查的序列号字符数量,于是尝试输入xxxx-yyyy-zzzz-kkkk并跟踪函数 ZNKKeyge.00401679,0x004012F1检查函数返回值成功,即序列号字符串合法性检查通过。事实上,序列号应该总共有19位,以’-’分割只需要检查前三组是否每组为4个字符,如果满足条件则最后一组一定是只有4个字符,所以0x00401697处指定0xE判断前三组即可。

图5 序列号合法性检查

图6 合法性检查结果

3 序列号算法

当序列号经过基本的合法性检查之后程序将会生成一个0~3的随机值index,并对第index组字符组进行比对,如果比对失败则不需要对全部的4组字符序列进行检查。如图8所示:

图8 检查随机序列号组字符组是否一致

如果随机检查的一组字符与期望的该组字符一致,则将对其余三组字符也进行一致性检查,即图9所示的4组字符从前到后的顺序循环检查,如果4组检查通过则表明用户输入的序列号正确则执行0x00401342处指令,即:调用ZNKKeyge.0040149A在窗口界面上显示序列号正确的提示信息字符串“G00D J0B ! Now write your solution...”。

图9 序列号生成算法

前文已经确认正确的序列号为“xyzw-abcd-efgh-lnmp” 形式,在验证序列号是否一致时,是将序列号以“-”分为4组且以组为单位进行校验。如图9所示,函数ZNKKeyge.004015ED就是序列号组生成函数,该函数以key字符串中第x(x为字符组的索引值0~3)个字符为基准计算出一个全局数组gseed元素的索引值jndex,并取出该数组元素作为种子计算出该字符组的期望值,如下图所示:

0040121C push ZNKKeyge.0040341D ; /Text = "26fA" 32 36 66 41
004030D8 序列号 1234-5678-ABCD-EFGH
0040341D 存放key WcA7->57 63 41 37
00403050 存放的错误提示信息
0040133D ASCII "G00D J0B ! Now write your solution..."
7584FB86 ; 收到窗口事件消息

0018FAA8  01 00 00 00 44 FB 18 00 00 00 00 00 D4 16 40 00  ...D?.....?@.
0018FAB8  DA 12 40 00 94 02 07 00 D8 30 40 00 00
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值