本帖最后由 我形我塑 于 2015-11-16 19:23 编辑
破解目的:学习交流 使用工具: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[20]={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); }
|