逆向破解之160个CrackMe —— 001(下)
前置知识介绍:
-
160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合,一共160个待逆向破解的程序
-
CrackMe:一些公开给别人尝试破解的小程序,制作crackme的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位cracker,想挑战一下其它cracker的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破。
-
CrackMe简称CM,cracker是以破解各种加密或有限制的商业软件为乐趣的人。
编号 | 作者 | 保护方式 |
---|---|---|
001 | Acid burn | Name/Serial,Serial |
工具:
-
ollyDbg(简称OD)
-
Exeinfo PE
开始破解:
1.今天完成最后一个任务,用户名与序列号验证机制,打开程序,点击Serial/Name按钮,来到用户名与序列号验证窗口,同样随意输入一组用户名与序列号进行验证,弹出验证结果窗口
2.用OD打开程序,前面两篇分别用了常用函数下断法,字符串定位法,今天用F12暂停法(原理是当我们点击OD中的暂停按钮或按F12时,OD会将当前的堆栈状态保存起来,并暂停当前窗体的线程执行。我们可以在OD暂停时得到一些有价值的东西),让程序运行起来(F9),然后同第一步一样,输入一组用户名与序列号进行验证(为了与本实验一致,用户名需大于等于4位),会弹出一个提示窗口,此时不要点击确定或关闭它,返回OD暂停(F12),然后点击堆栈-K小图标(Ctrl+K),如下图:
3.右键->显示调用
4.我们在上面返回处下断点(F2),然后F9让程序运行起来,关掉提示窗口,重新验证,程序停在了我们的断点处,不过程序现在处在系统领空,我们要运行到用户领空,可以按快捷键Alt+F9
5.如果你对第一目标完成过程还有印象就会发现这和通过MessageBoxA函数直接搜到的是同一个地方,后面向上继续找方法也是一样,在这段代码开始处下断点,重新运行程序,然后通过右下角栈区找到返回地址
6.右键->反汇编窗口中跟随或者按回车键
7.向上翻很快就能发现关键跳转,在调用比较函数处(0x42FAFE)下断点,重新运行验证(用户名需大于等于4位)
8.程序停到0x42FAFE处,观察EAX与EDX的值,可以发现此时EAX的值看上去像是一个正确的序列号,我们验证下,用户名不变,序列号换成EAX的值,OK,完全正确。
9.所以在这个call之前程序已经将用户名对应的序列号算出来了,然后和我们输入的序列号通过这个call对比,最终给出提示。那么我们向上继续观察,不远处就发现了算法,同时知道了用户名长度必须大于等于4位:
取用户名的第一个字符对应的ASCII的值,然后用它乘以0x29,再乘以2,得到一个数字并将其转换为10进制,在前加上CW-,后面加上-CRACKED,就组成了用户名对应的注册码
10.知道了算法,就可以写出注册机,下面是用C++写的
#include <stdio.h> #include <stdlib.h> int main() { printf("请输入用户名:\r\n"); //取用户名的第一个字符 int nName = getchar(); nName *= 0x29; nName *= 2; printf("序列号:CW-%4d-CRACKED\r\n", nName); system("pause"); }