游乐游手机版
首页/网络安全/文章详情

取密钥生成算法图解原理步骤实例与实现

时间:2026-07-23 06:33
从拷贝保护产品中剥取(ripping)算法,通常是创建密钥生成程序最直接、也最有效的方法之一。思路很朴素:先找到受保护程序内部负责计算合法序列号的函数(可能不止一个),然后把它移植到自己的密钥生成程序中。这样做的好处在于,你根本不需要真正理解这个算法——只需要找到生成合法序列号的代码,再想办法在自己

从拷贝保护产品中剥取(ripping)算法,通常是创建密钥生成程序最直接、也最有效的方法之一。思路很朴素:先找到受保护程序内部负责计算合法序列号的函数(可能不止一个),然后把它移植到自己的密钥生成程序中。这样做的好处在于,你根本不需要真正理解这个算法——只需要找到生成合法序列号的代码,再想办法在自己的程序里调用它就行。

首要任务很明确:先定位KeygenMe程序内部的密钥生成算法在哪里。办法其实不少,但有一种方法几乎百试百灵:追踪读取用户名和序列号两个文本框输入的代码。如果KeygenMe-3的主窗口是个对话框(从初始化代码里调用的创建对话框的API函数就能确认这一点),那么它大概率会使用GetDlgItemText函数,或者向文本框发送WM_GETTEXT消息。假设它用的是GetDlgItemText,就可以回到OllyDbg的Name窗口中,查找调用了GetDlgItemTextAGetDlgItemTextW的地方。果不其然,程序调用了GetDlgItemTextA。打开Find References to Import窗口,能看到两处代码调用了这个函数(那条直接跳转的JMP指令不算在内,它只是函数导入地址表里的一个条目)。

取密钥生成算法(图)500)this.width=500" title="点击这里用新窗口浏览图片" />

列表11.1 KeygenMe-3中第一个输入字符串的转换算法

取密钥生成算法(图)500)this.width=500" title="点击这里用新窗口浏览图片" />

取密钥生成算法(图)500)this.width=500" title="点击这里用新窗口浏览图片" />

取密钥生成算法(图)500)this.width=500" title="点击这里用新窗口浏览图片" />

列表11.1

在尝试从列表11.1的代码中提取转换算法之前,先看看位于Key4.00401388处的这个函数,它显然也是整个算法的一部分。

500)this.width=500" title="点击这里用新窗口浏览图片" />

列表11.2 KeygenMe-3中第二个输入字符串的转换算法

取密钥生成算法(图)500)this.width=500" title="点击这里用新窗口浏览图片" />

列表11.2

浏览这段代码,可以明显看出似乎有两段代码包含了密钥生成算法。第一段是列表11.1中Key4.0040130B部分,第二段是列表11.2给出的整个函数。列表11.1的代码生成了ESI寄存器中的值,而列表11.2的函数将返回值赋给了EAX寄存器。随后程序会比较这两个值,如果相等,就报告验证成功(也就是之前手动修补过的位置)。

现在从Key4.0040130B这处代码片段开始,搞清楚它到底接收什么输入数据。这段代码开始之前,ECX寄存器已经存放了第一个输入字符串(来自上方文本框)的长度,接着代码中间出现了该字符串的地址(40303F),以及一个未知的硬编码地址(40351F)。需要留意的是,这段代码并没有逐个处理字符串中的每个字符,而是只读取前四个字符,把它们当作一个双字来对待。要把这些代码移植到自己的密钥生成程序中,必须先弄清楚40351F里存了什么。可以看到,这个地址在引用之前,总是先与EAX寄存器的值相加。第一次迭代时EAX是1,所以实际访问的地址是403520。后续迭代中EAX变成了4,这时应该查看403524这个地址。在OllyDbg中读出403520处的内存,能看到这个地址包含以下数据:

500)this.width=500" title="点击这里用新窗口浏览图片" />

这里要注意,403520是按单字节访问的,而不是完整的DWORD,所以程序实际上只取了第一字节(0x25)和第四字节(0x65)。

再看列表11.1中的第一个算法,这明显是一个将用户名转换为32位数的密钥生成算法(转换结果存放在ESI寄存器中)。那么列表11.2中的第二个算法又在做什么呢?快速扫一眼就能发现,这段代码没有任何复杂的操作:它只是逐个检查我们输入的序列号中的每个数字,每次减去0x30(ASCII码中字符'0'的编码),然后反复乘以10,直到ECX寄存器的值归零。对源字符串每个字符进行乘10运算,是在一个内部循环里完成的,且乘10的次数取决于该数字在字符串中的位置。

在调试器中单步执行这段代码,能观察到一些有经验的逆向工程师仅靠看函数就能获得的信息。这个函数实际上就是把传入参数中的字符串转换成二进制DWORD(双字),类似C运行库里的atoi函数,但看上去更像是个个人实现的atoi(标准atoi要稍微复杂一些,而且如果程序真的用到了这个库函数,OllyDbg通常能识别出来——但它在KeygenMe-3中并没有找到相关线索)。

所以,第一个算法(列表11.1)使用专门的算法将用户名转换成32位的DWORD,而第二个算法只是简单地把下方文本框输入的内容转换成数字形式。下方文本框里应该放的就是第一个算法生成的数。顺着这个思路,似乎只需要把第一个算法“剥取”出来,放到自己的密钥生成程序里,就能让它生成序列号了。来试试看。

表11.3给出了我为密钥生成程序编写的一个提取后的子程序。它其实是一个C函数(用Microsoft的C/C++编译器编译),其中包含从OllyDbg反汇编器中抄过来的一段内联汇编代码(用_asm { }括起来的部分)。小写字母表示的指令是我手动添加的,还包括LoopStart这个标号。

取密钥生成算法(图)500)this.width=500" title="点击这里用新窗口浏览图片" />

列表11.3 从KeygenMe-3中取出的处理第一个字符串的转换算法

取密钥生成算法(图)500)this.width=500" title="点击这里用新窗口浏览图片" />

列表11.3

将这个函数(命名为ComputeSerial)嵌入到一个短小的控制台模式程序中,程序要求用户输入用户名,并以十进制数形式显示ComputeSerial的返回值。它要做的只有这些:调用ComputeSerial函数,然后输出它的值。下面是我的密钥生成程序的入口代码:

取密钥生成算法(图)500)this.width=500" title="点击这里用新窗口浏览图片" />

看起来,只要在KeygenMe-3主界面上方文本框里输入任意一个名字(与传给ComputeSerial函数的名字相同),再把ComputeSerial的返回值填入下方文本框,KeygenMe-3就会弹出成功消息框。来验证一下。以“John Doe”作为参数传递给密钥生成程序,记录下生成的序列号。图11.9展示了密钥生成程序的输出界面。

取密钥生成算法(图)500)this.width=500" title="点击这里用新窗口浏览图片" />

图11.9 运行中的KeygenMe-3密钥生成程序

最终得到的序列号是580695444。运行未经补丁的KeygenMe-3版本,在第一个文本框输入“John Doe”,第二个文本框输入“580695444”。又成功了!KeygenMe-3把这两组输入认定为合法值。恭喜,第二节破解课程到此结束。

来源:https://www.jb51.net/hack/5060.html
上一篇小米MIUI系统漏洞致数据泄露及修复指南 下一篇Linux系统密码破解的全面方法技巧与工具大全
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
零基础Python网络安全学习指南,包住宿实战培训
网络安全 · 2026-07-25

零基础Python网络安全学习指南,包住宿实战培训

先抛出几个核心判断:网络安全人才缺口确实已经超过70万。这个数字不算夸张,各大招聘网站上安全岗位的薪资涨幅和需求增长都是实实在在的。但实话实说,行业真正缺的是能上手干活的人,不是只懂几个理论概念的新手。因此,一套扎实且成体系的训练方案,对于零基础转行或进阶提升就显得格外关键。 从零基础到能够独立应对

网络安全定义与核心概念详解
网络安全 · 2026-07-25

网络安全定义与核心概念详解

谈到网络安全,不同组织与标准体系对其定义虽有差异,但核心目标高度统一:保护信息与系统不受威胁侵害。以下梳理几种主流定义—— 什么是网络安全? 国际标准化组织(ISO)在ISO-74982文献中将安全定义为:最大程度地降低数据和资源遭受攻击的可能性。该定义虽简短,却精准点出安全的本质——即风险控制。

IIS 7.0网站漏洞利用与修复方法指南
网络安全 · 2026-07-25

IIS 7.0网站漏洞利用与修复方法指南

先来聊聊当前网络安全领域比较流行的一种实战技巧——以PHP环境为例,详细讲解图片马合并与解析漏洞利用的具体操作步骤。整个过程并不复杂,但细节往往决定成败,大家跟着流程逐步操作即可。 合并一张PHP一句话图片马 首先,我们需要将一句话木马脚本与一张正常图片合并,生成一个看似无害的图片文件。合并方式主要

织梦管理系统后台查找功能教程
网络安全 · 2026-07-25

织梦管理系统后台查找功能教程

通过SQL注入漏洞获取织梦CMS(DedeCMS)管理员密码后,满怀期待地准备进入后台,却发现怎么也找不到登录入口——这种情况其实相当常见。别着急,这里有一个实用的技巧值得尝试。 直接在网站地址后面添加以下路径: include dialog select_media php?f=form1 mur

微软IE浏览器BrowseDialog类(ccrpbds6.dll)拒绝服务安全漏洞深度分析
网络安全 · 2026-07-25

微软IE浏览器BrowseDialog类(ccrpbds6.dll)拒绝服务安全漏洞深度分析

BrowseDialog Class (ccrpbds6 dll) 导致 Internet Explorer 拒绝服务漏洞分析 该漏洞的PoC(概念验证代码)实现极为直接——触发浏览器崩溃的条件简单得令人意外。测试环境采用Windows XP Professional SP2(已安装全部补丁)并运行