逆向破解之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.先用Exeinfo PE工具查看下001程序(打开工具,将程序拖拽进去即可查看),得到信息如下图,可知该程序没有加壳,而且是用Delphi语言编写的。

2.Delphi所编写的代码与VC++所编写的代码有所不同,最明显的两点区别如下:

  • 函数调用时传参的方式主要用寄存器,一般将参数1放入eax寄存器,参数2放入edx寄存器,参数3放入ecx寄存器,多余的也是通过压栈的方式传入

  • 字符串的处理,Delphi字符串处理函数与VC++是不同的,其字符串的首地址减去4后,所取出的4个字节就是此字符串的长度。分析的时候要注意。

3.接下来我们运行程序,首先会弹出一个提示窗口,大概意思是欢迎你破解他,这个软件由ACiD BuRN制作

4.现在我们知道这个软件制作者是谁呢,不想每次运行都弹出这个对话框来提醒我制作者是谁,那么我们有了第一个目标,让提示窗口不显示。点击《确定》按钮,发现有两种验证机制,一种是用户名与序列号验证,另一种只需要序列号。所以我们又获得两个新任务,由易到难,我们第二个目标是只需要序列号验证的,最后攻克用户名与序列号验证

5.目标一:去掉烦人的提示对话框(一般软件设计者用来提醒用户购买正式版本的窗口),要完全去除提示窗口,只需要找到创建该窗口的代码并将其跳过。显示窗口的常用函数有:

  • MessageBoxA(W)

  • MessageBoxExA(W)

  • DialogBoxParamA(W)

  • ShowWindow

  • CreateWindowExA(W)

6.我们用OD打开,然后用Ctrl+G跳转到上面常用函数处

7.或者用命令bp MessageBoxA在指定函数处下断,bp表示下断点,后面跟着要下断点的函数名,(bp与函数名之间有个空格)

8.下完断点后,按F9让程序运行起来,发现程序会在函数MessageBoxA处断下,观察栈区,会发现就是我们要去除的窗口信息,即此时MessageBoxA函数执行完,就会弹出提示窗口,我们转到调用这个函数的位置(方法见下图2)

9.本来我们只要nop掉调用MessageBoxA的代码就可以实现目标一,不过后面验证后的结果提示窗口也会调用此处,所以我们还要继续向上找

10.终于来到最终的关键处,此时我们采用第二种,直接将push 0x0改为retn(有兴趣的两种都可以试试)

11.直接选择要修改的那行,按空格键,输入改后的指令,然后保存修改好后的程序,选择覆盖原程序,会在原程序目录下生成个.bak文件,其实就是修改前的文件改了后缀。

12.今天就到这里,明天完成第二个目标

猜你喜欢

转载自www.cnblogs.com/ndyxb/p/12412064.html