• 逆向破解之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("请输入用户名:
    ");
        
        //取用户名的第一个字符
        int nName = getchar();
    
        nName *= 0x29;
    
        nName *= 2;
    
        printf("序列号:CW-%4d-CRACKED
    ", nName);
    
        system("pause");
    }
    
    
    直面挫折,顽强生长
  • 相关阅读:
    图片切换的练习
    固定定位
    绝对定位
    相对定位
    全局作用域 变量声明
    3种循环语句 JS基础
    解除绑定事件 和 封装兼容性addEvent 来处理针对于不同浏览器的兼容方法
    插入排序法 猴子选大王 检索的数组 验证身份证号码 练习
    [z]JSONP例子
    ireport related
  • 原文地址:https://www.cnblogs.com/ndyxb/p/12430517.html
Copyright © 2020-2023  润新知