第十七章-序列号生成算法分析-Part2 首先我们来解决上一章留下的mexcrk1.zip这个CrackMe,很简单。首先用OD加载它,断在入口点处。 首先看看程序中使用了哪些字符串,单击鼠标右键: 可以看到以下字符串。 我们可以在正确字符串上面或者错误字符串上面双击来到关键代码附近。 我们看到这里有一个CALL指令决定后面的JE指令是跳转到”Thanks you made it”代码处,还是直接显示后面的”Wrong Code DUDE”。我们在42D534地址处设置一个断点,然后运行起来。 我们在Enter Serial#下面的编辑框中随便输入一个序列号。 这里我输入Narvajita。 如果你跟进这个CALL,你会发生时我们输入的错误序列号”Narvajita”在于”Benadryl”进行比较。 好了,我们现在达到了比较指令处,”Benadryl”就是正确的序列号,我们删除之前设置的断点,运行程序。 这里我们可以看到,显示”Thanksyou made it”提示序列号正确的字样。 好了,接下来我们分析Canasta5.0这个CrackMe。 该CrackMe属于那种OK按钮开始不可用,当用户输入的用户名与序列号相匹配的时候才可以单击的例子。 我们首先安装程序,然后打开About对话框。 提示20美元,确切是说是19.95美元。 我们单击Enter License按钮。 提示说只有当用户输入的用户名和序列号组合正确时OK按钮才会变为可用。 用OD加载该程序。 我们断在了入口点处。 好,我们来看看API函数列表以及字符串列表。 由于OK按钮不可用,所以我们不能通过单击OK按钮来获取错误提示是什么,嘿嘿。 我们运行起来,然后打开注册窗口,我们运用一些方法来攻击这种保护。 我们输入用户名,假设该程序对用户名没有限制,接在我们输入6个字母的序列号。例如:WMYXSZ。首先单击W。 接着按M键。 现在我们在内存中搜索刚刚输入的两个字母。 我们单击工具栏中的M按钮,打开内存窗口,查找WM字符串。 这里,我们勾选上区分大小写。 找到了一个,我们继续按CTRL+L查找看看还有没有其他地方有该字符串。提示未找到其他条目,说明这就是我们刚刚输入的序列号。 我们在数据窗口中定位到给字符串。 我们输入刚刚找到的这个地址,由于该地址是字母c开头,所以我们要在前面加上0,不然OD不认识。 可以用户输入的序列号就保存在这里,我们输入“WMYXSZ”接下来一个字母Y。 继续转到数据窗口查看,发现字母Y加被保存进来了。然后对0C35DF9开始的连续六个字节内存单元设置内存访问断点。 现在运行起来。 输入字母’X’。 现在将保存该字母了。 这里如果按F8键,ESI将保存到EDI中。 这里拷贝我们前面输入的4个字节。 按F8键,这4个字节将被拷贝到12E79C起始的内存单元中。 既然我们已经设置过内存访问断点,那我们就来设置硬件访问断点。 我们继续跟,就可以看到我们输入的用户名也被保存到了堆栈中。 我们输入的用户名长度为0E,与0做比较。 如果用户名长度不为零,程序将继续执行。 然后判断是不是黑名单中的名称,也就是说不能是TNO,afdad等,嘿嘿。 继续运行。 断在了比较指令处,我们可以看到是我们输入的序列号在与另一个字符串进行比较。 我们可以看到”354910”就是正确的序列号,我们删除所有断点。 输入正确的序列号以后,OK按钮就变为可用状态了,嘿嘿。两一种解决方法这里就不再赘述了,也不是很复杂,就利用我们每按下一个键就发产生WM_KEYUP消息,显得比较麻烦,但也很直接。 好了,我们休息一下,下一章,我们来看看别的例子。
本系列文章汉化版转载看雪论坛
感谢原作者:RicardoNarvaja(西班牙人)
感谢热心翻译的朋友: 1~3章译者:BGCoder 4~58章译者:安于此生
全集配套程序下载地址:
|