评论:抓取算法从一个
复制保护的产品通常是一个简单而有效的方式来
创建一个密钥生成
程序。想法很简单:找到计算保护程序序号的
功能(可能不止一个
函数),并将它移植到你的密钥生成程序。这种
方法的优点是你没有真正理解的算法,你只需要
剥离(抓取)从受版权保护的产品的算法通常是一种简单有效的方法来创建一个密钥生成器。想法很简单:找到计算保护程序序号的功能(可能不止一个函数),并将它移植到你的密钥生成程序。这种方法的好处是你不需要真正理解这个算法。您只需要找到生成合法序列号的函数,并尝试在自己的程序中调用它。
你要做的第一项
任务是找出密钥生成算法在crackme程序。有很多方式可以采取,但有一种方法,很失败。
发现两个
文本框中的代码,你
输入用户名和序列号。假设kegenme-3主窗口是一个对话框。这很容易通过在代码中创建对话框的API函数来进行验证。它是可能的,程序将使用getdlgitemtext功能或发送wm_gettext
消息文本框。假设这个程序是用getdlgitemtext,你可以回到姓名(名称)OllyDbg找到的代码调用getdlgitemtexta或调用getdlgitemtextw窗口。正如你看到的,你会发现程序调用getdlgitemtexta功能打开查找引用进口(寻找进口项目的
参考)的窗口,你会看到两码称为GetDlgItemTextA函数(不包括直接跳转JMP指令,这是该函数的入口
地址表)。
在清单11.1 keygenme-3第一输入字符串的
转换算法
表11.1
在试图从清单11.1中给出的代码
删除变换算法,我们把这个功能一看key4.00401388第一,这显然也是算法。
在清单11.2 keygenme-3二输入字符串的转换算法
表11.2
看这个代码,你可以清楚地看到,如果有两段代码包含密钥生成算法。第一节是清单11.1中的key4.0040130b部分和第二部分,清单11.1中的代码列表11.2.the部分给出整个函数生成的值在ESI的登记,并清单11.2中的函数将返回值EAX登记。比较两个值,如果两个值相等,程序将
报告的验证成功(即我们刚刚修复)。
我们开始从代码片段在key4.0040130b确定什么样的数据输入要接收。此代码第一个字符串在ECX登记已存储(输入框输入字符串的长度,从文本上)开始的代码和字符串的地址出现后(40303f)和硬编码一个未知地址(40351f)。首先要注意的是代码而不是一个一个字符串中的每个字符。相反,它读取一个字符串的前四个字符,将它们作为一个双字。移植这些代码到你自己的密钥生成器,你必须首先弄清楚什么存储在40351f。首先,你可以看到这个地址总是添加到值在EAX登记之前我T参考。在第一次迭代的登记,eax的值为1,所以访问实际的地址是403520。在下一次迭代中,eax的值总是4,所以你现在应该看看403524地址。读OllyDbg 403520的
内存,你可以看到这个地址包含以下数据:
应该指出的是,这行代码以地址为单字节访问,而不是一个完整的DWORD的访问,所以事实上,程序只访问的第一个字节的内容(0x25)和第四字节(0x65)。
查看清单11.1中的第一个算法,您会发现这显然是一个32位密钥生成算法(在ESI寄存器完成转换之后)的
用户名转换算法。那么,清单11.2中的第二个算法是什么呢通过快速
浏览,你可以看到,这段代码有没有复杂的
处理。它只是
检查我们的编号每一个号码,并从0x30每检查值减去其价值(0x30正是ASCII码的编码0)并将结果通过10直到在ECX登记的值变为0。10每个字符在源字符串的乘法是在内部循环,和10倍的数量取决于源字符串中数字的
位置。
我们可以通过一步一步的调试器调试代码。我们会看到一些信息,一些有经验的反工人只能通过观察这个函数,这个函数实际上是字符串通过
参数转换为二进制的DWORD(双字),它在
运行时的atoi函数相当于C,但它看起来更像是个人版(atoi函数实现atoi稍更复杂的是,如果有相应的库
文件,因为OllyDbg可以
识别库函数:如果程序中使用的函数atoi,OllyDbg将确定的,但OllyDbg没有找到任何的keygenme-3相关信息)。
因此,看来,第一种算法(清单11.1中的算法)使用了专门的算法,将用户的
名字32位DWORD,而第二算法简单地将输入的内容转换成数字形式的下一个文本框,文本框应包含以下数是由第一种算法产生的。根据这线索,似乎我们只需要剥离出的第一算法和把它纳入我们的密钥生成程序,使我们能够为我们生成序列号。让我们试一试。
表11.3给出了子程序,我创建的密钥生成程序。它实际上是一个C函数(与微软编译器的C / C编译器),这是一份由OllyDbg反汇编程序直接插入(内联。_asm {}包围的部分)的汇编代码,小写字母的指令
都是手工添加,和LoopStart的名字也包括。
清单11.3转换算法的keygenme-3第一个字符串处理
表11.3
我把这个函数(函数名computeserial)到一个短的
控制台
应用程序(控制台
模式的应用),这就要求用户输入用户名和computeserial十进制形式
显示函数的返回值。这个节目是叫computeserial函数在一个十进制数形式显示的computeserial的返回值。以下是我的关键发电机输入程序:
输入任意名称的主要keygenme-3接口箱上面的文字(名称应为参数的同名computeserial功能通过),然后computeserial型keygenme-3到第二文本框的主要接口的返回值,你可以让keygenme-3显示成功的消息框。让我们试一试你可以把某个身份不明的人作为一个参数,我们的密钥生成器,并写下生成的序列号。图11.9显示的密钥生成器的输出接口。
的keygenme-3密钥生成程序图11.9运行
最后的序列号是580695444。运行keygenme-3(版本尚未修补),在第一个文本框中输入John Doe,进入580695444第二文本框。和成功!keygenme-3接受两个输入值作为一个合法的价值。恭喜你,你的第二节打破课程结束。