逆向破解之160个CrackMe —— 001(下)

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");
}

 


posted @ 2020-03-06 20:08  自己的小白  阅读(799)  评论(0编辑  收藏  举报