我形我塑 发表于 2015-11-16 18:36

160个Crackme #33

本帖最后由 我形我塑 于 2015-11-16 19:23 编辑

破解目标:Crackme #33破解目的:学习交流使用工具:OD破解过程:一、查壳,无壳,汇编语言。二、试运行,单击Help项弹出菜单,选择Register子菜单,随意输入用户名及注册码,然后点OK。结果如图:      
三、OD载入,在反汇编窗口右键弹出菜单中选“中文搜索引擎à智能搜索”,来到这里:
      
      知道为什么要试运行程序了吧?能找到这个就好办多了。点选其中任意一行(我更喜欢Good work,mate!这样的话),双击或回车,返回反汇编窗口。代码如下:
             咦?怎么没有跳到这里的跳转语句啊?老革命遇到新问题了!“路曼曼其修远兮,吾将上下以求索”,“求之不得,寤寐思服”。四、“山重水复疑无路,柳暗花明又一村”。这是什么?         点选0040134D这行,反汇编窗口下显示:Localcall from 0040124C。右键菜单选Go to CALL from 0040124C,如图:
      
       看到了吧?00401243处的JE是破解的关键。在这下个F2断点,F9运行,输入用户名       假码,点OK,断在这里了。如果要爆破,右键点这行,选“汇编”,把JE改成JMP,然后“复制到可执行文件”->“保存文件”,试试效果吧!五、分析算法。      如果要JE跳向成功,EAX与EBX的值必须相等;EAX的值来自0040122D处的调用(根据跟踪分析,它实现的是将用户名变为大写,将每个字母的ASCII值进行累加,然后与0x5678异或),EBX的值来自 00401238处的调用(将假码字符串转换为数值,再与0x1234异或)。有兴趣的可以在这两个调用处下断点,F7步入,F8单步跟一下。

   最后附上注册机代码: #include "stdafx.h"#include <windows.h>voidCrackme33();int_tmain(int argc, _TCHAR* argv[]){   Crackme33();   return 0;}voidCrackme33(){   char szUser={0};   printf("\n\n\t用户名 ");   scanf("%s",szUser);    char *ptr=strupr(szUser);   int nUserVal=0;   while(*ptr)      nUserVal+=*ptr++;   nUserVal=nUserVal^0x1234^0x5678;   itoa(nUserVal,szUser,10);    printf("\t注册码 %d\n\n",nUserVal);}

我形我塑 发表于 2015-11-23 20:04

感谢大神的鼓励
页: [1]
查看完整版本: 160个Crackme #33