取密钥生成算法(图)itjob - 凯时娱乐

取密钥生成算法(图)itjob

2018-10-15 09:57:52 | 作者: 怀莲 | 标签: 算法,密钥,函数 | 浏览: 1427


从复制维护产品中剥取(ripping)算法通常是创立密钥生成程序的一种简略而卓有成效的办法。其思路十分简略:定位受维护程序内核算合法序列号的函数(或许不止一个函数),并将它(们)移植到你密钥生成程序中。这种办法的美好之处在于你不需要真实了解这个算法,你只需要找到生成合法序列号这个(或些)函数并想办法在自己的程序中调用它(们)。
你榜首个必需要完结的使命是定位这个crackme程序内的密钥生成算法。能够采纳的办法有许多,但有一种办法很少会失利,那就是寻觅读取你输入用户名和序列号的两个文本框的那段代码。假定KegenMe-3的主窗口是一个对话框(这一点经过查找程序初始化代码中的创立对话框的API函数就能够很容易地得到证明),很或许程序会运用GetDlgItemText函数或许向文本框发送WM_GETTEXT音讯。假定这个程序运用的是GetDlgItemText,你能够返回到OllyDbg的“Name(称号)”窗口查找调用GetDlgItemTextA或调用GetDlgItemTextW的代码。果然如此,你会发现程序调用了GetDlgItemTextA函数。翻开“Find References to Import(查找导入项的引证)”窗口,你会看到有两处代码调用了这个GetDlgItemTextA函数(不计那条直接跳转的JMP指令,它是这个函数的导入地址表中的项)。


列表11.1 KeygenMe-3中榜首个输入字符串的转化算法






列表11.1
在试着从列表11.1给出的代码中剥取出转化算法之前,让咱们先看一下在Key4.00401388处的这个函数,它明显也是算法的一部分。


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


列表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处的内存,你能够看到这个地址包含了下面这些数据:


要注意的是,这一行代码把这个地址当作一个单字节来拜访,而不是按完好的DWORD拜访,所以实践上程序只拜访了榜首字节(0x25)和第四字节(0x65)的内容。
查看列表11.1中的榜首个算法,你会发现这明显是一个将用户名转化成一个32位数的密钥生成算法(转化完结后寄存在ESI寄存器中)。那么,列表11.2中的第二个算法又在干什么呢?经过快速阅读就能够看出这段代码中没有任何杂乱的处理。它仅仅逐一查看咱们输入的序列号中的每一个数字,每查看一个都把它的值减去0x30(0x30刚好就是ASCII码中“0“的编码)并将成果重复地乘以10,直到ECX寄存器中的值变成0停止。对源串中每一个字符进行乘10运算是在一个内部循环中完结的,且乘以10的次数取决于这个数字在源串中的方位。
在调试器中单步调试这段代码,咱们会看到一些有经历的逆向工作者仅经过调查这个函数就能够取得的一些信息。这个函数实践上就是把经过参数传入的字符串转化成一个二进制的DWORD(双字),它相当于C运转库中的atoi函数,但它看上去更像是一个atoi函数的个人完成版别(atoi要略微杂乱一点,假如有相应的库文件,而且由于OllyDbg能够辨认出库函数——假如程序中用了atoi函数的话,必定会被OllyDbg辨认出来,但OllyDbg没有在KeygenMe-3中找到相关的任何信息)。
因而,如同榜首个算法(列表11.1中的算法)运用了一个专门的算法将用户名转化成32位的DWORD,而第二个算法仅仅简略地将下面的那个文本框中输入的内容转化成数字方式。下面的那个文本框中所包含的应该就是榜首个算法生成的数。依据这一头绪,如同咱们只需要把榜首个算法“剥取”出来放到咱们的密钥生成程序中,就能够让它为咱们生成序列号了。让咱们来试试看。
表11.3给出了我为密钥生成程序创立的取出来的子程序。它实践上是一个C函数(用Microsoft的C/C 编译器编译),其间是一段从OllyDbg的反汇编器中复制而来的一段直接刺进的(inline。译注:用“_asm { }”括起来的部分)汇编代码。用小写字母表明的指令是我手艺加上去的,还包含LoopStart这个称号。


列表11.3 从KeygenMe-3中取出的处理榜首个字符串的转化算法


列表11.3
我把这个函数(函数名为ComputeSerial)刺进到一个矮小的控制台方式的应用程序中(console mode application),这个程序要求用户输入用户名,并以十进制数方式显现ComputeSerial函数的返回值。这个程序所要做的仅仅调用ComputeSerial函数并以十进制数的方式显现ComputeSerial的返回值。下面是我的密钥生成程序的进口程序:


好像输入恣意一个姓名到KeygenMe-3主界面的上面的那个文本框(这个姓名应与作为参数传递给ComputeSerial函数的姓名相同),然后将ComputeSerial函数的返回值键入到KeygenMe-3主界面的第二个文本框,就能够让KeygenMe-3显现成功音讯框了。让咱们来试试看。你能够将“John Doe”作为参数传递给咱们的密钥生成程序,并记下生成的序列号。图11.9显现了密钥生成程序的输出界面。


图11.9 运转中的KeygenMe-3密钥生成程序
最终得到的序列号为580695444。运转KeygenMe-3(未做补丁的那个版别),在榜首个文本框中输入“John Doe”,在第二个文本框中输入“580695444”。又成功了!KeygenMe-3将这两个输入值作为合法的值接受了。祝贺你,你的第二节破解课程到此结束。
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯时娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章