转载自:OllyDbg入门教程

我们先来运行一下这个 crackme(用 PEiD 检测显示是 Delphi 编的),界面如图:

这个 crackme 已经把用户名和注册码都输好了,省得我们动手^_^。我们在那个“Register now !”按钮上点击一下,将会跳出一个对话框:

好了,今天我们就从这个错误对话框中显示的“Wrong Serial, try again!”来入手。启动 OllyDBG,选择菜单 文件->打开 载入 CrackMe3.exe 文件,我们会停在这里:

我们在反汇编窗口中右击,出来一个菜单,我们在 查找->所有参考文本字串 上左键点击:

当然如果用上面那个 超级字串参考+ 插件会更方便。但我们的目标是熟悉 OllyDBG 的一些操作,我就尽量使用 OllyDBG 自带的功能,少用插件。好了,现在出来另一个对话框,我们在这个对话框里右击,选择“查找文本”菜单项,输入“Wrong Serial, try again!”的开头单词“Wrong”(注意这里查找内容要区分大小写)来查找,找到一处:

在我们找到的字串上右击,再在出来的菜单上点击“反汇编窗口中跟随”,我们来到这里:

见上图,为了看看是否还有其他的参考,可以通过选择右键菜单查找参考->立即数,会出来一个对话框:

分别双击上面标出的两个地址,我们会来到对应的位置:

00440F79 |. BA 8C104400 MOV EDX,CrackMe3.0044108C ; ASCII "Wrong Serial,try again!"

00440F7E |. A1 442C4400 MOV EAX,DWORD PTR DS:[442C44]

00440F83 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]

00440F85 |. E8 DEC0FFFF CALL CrackMe3.0043D068

00440F8A |. EB 18 JMP SHORT CrackMe3.00440FA4

00440F8C |> 6A 00 PUSH 0

00440F8E |. B9 80104400 MOV ECX,CrackMe3.00441080 ; ASCII "Beggar off!"

00440F93 |. BA 8C104400 MOV EDX,CrackMe3.0044108C ; ASCII "Wrong Serial,try again!"

00440F98 |. A1 442C4400 MOV EAX,DWORD PTR DS:[442C44]

00440F9D |. 8B00 MOV EAX,DWORD PTR DS:[EAX]

00440F9F |. E8 C4C0FFFF CALL CrackMe3.0043D068

我们在反汇编窗口中向上滚动一下再看看:

00440F2C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

00440F2F |. BA 14104400 MOV EDX,CrackMe3.00441014 ; ASCII "Registered User"

00440F34 |. E8 F32BFCFF CALL CrackMe3.00403B2C ; 关键,要用F7跟进去

00440F39 |. 75 51 JNZ SHORT CrackMe3.00440F8C ; 这里跳走就完蛋

00440F3B |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]

00440F3E |. 8B83 C8020000 MOV EAX,DWORD PTR DS:[EBX+2C8]

00440F44 |. E8 D7FEFDFF CALL CrackMe3.00420E20

00440F49 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

00440F4C |. BA 2C104400 MOV EDX,CrackMe3.0044102C ; ASCII "GFX-754-IER-954"

00440F51 |. E8 D62BFCFF CALL CrackMe3.00403B2C ; 关键,要用F7跟进去

00440F56 |. 75 1A JNZ SHORT CrackMe3.00440F72 ; 这里跳走就完蛋

00440F58 |. 6A 00 PUSH 0

00440F5A |. B9 3C104400 MOV ECX,CrackMe3.0044103C ; ASCII "CrackMe cracked successfully"

00440F5F |. BA 5C104400 MOV EDX,CrackMe3.0044105C ; ASCII "Congrats! You cracked this CrackMe!"

00440F64 |. A1 442C4400 MOV EAX,DWORD PTR DS:[442C44]

00440F69 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]

00440F6B |. E8 F8C0FFFF CALL CrackMe3.0043D068

00440F70 |. EB 32 JMP SHORT CrackMe3.00440FA4

00440F72 |> 6A 00 PUSH 0

00440F74 |. B9 80104400 MOV ECX,CrackMe3.00441080 ; ASCII "Beggar off!"

00440F79 |. BA 8C104400 MOV EDX,CrackMe3.0044108C ; ASCII "Wrong Serial,try again!"

00440F7E |. A1 442C4400 MOV EAX,DWORD PTR DS:[442C44]

00440F83 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]

00440F85 |. E8 DEC0FFFF CALL CrackMe3.0043D068

00440F8A |. EB 18 JMP SHORT CrackMe3.00440FA4

00440F8C |> 6A 00 PUSH 0

00440F8E |. B9 80104400 MOV ECX,CrackMe3.00441080 ; ASCII "Beggar off!"

00440F93 |. BA 8C104400 MOV EDX,CrackMe3.0044108C ; ASCII "Wrong Serial,try again!"

00440F98 |. A1 442C4400 MOV EAX,DWORD PTR DS:[442C44]

00440F9D |. 8B00 MOV EAX,DWORD PTR DS:[EAX]

00440F9F |. E8 C4C0FFFF CALL CrackMe3.0043D068

大家注意看一下上面的注释,我在上面标了两个关键点。有人可能要问,你怎么知道那两个地方是关键点?其实很简单,我是根据查看是哪条指令跳到“wrong serial,try again”这条字串对应的指令来决定的。如果你在 调试选项->CPU 标签中把“显示跳转路径”及其下面的两个“如跳转未实现则显示灰色路径”、“显示跳转到选定命令的路径”都选上的话,就会看到是从什么地方跳到出错字串处的:

我们在上图中地址 00440F2C 处按 F2 键设个断点,现在我们按 F9 键,程序已运行起来了。我在上面那个编辑框中随便输入一下,如 CCDebuger,下面那个编辑框我还保留为原来的“754-GFX-IER-954”,我们点一下那个“Register now !”按钮,呵,OllyDBG 跳了出来,暂停在我们下的断点处。我们看一下信息窗口,你应该发现了你刚才输入的内容了吧?我这里显示是这样:

堆栈 SS:[0012F9AC]00D44DB4, (ASCII "CCDebuger")

EAX00000009

上面的内存地址 00D44DB4 中就是我们刚才输入的内容,我这里是 CCDebuger。你可以在 堆栈 SS:[0012F9AC]00D44DB4, (ASCII "CCDebuger") 这条内容上左击选择一下,再点右键,在弹出菜单中选择“数据窗口中跟随数值”,你就会在下面的数据窗口中看到你刚才输入的内容。而 EAX00000009 指的是你输入内容的长度。如我输入的 CCDebuger 是9个字符。如下图所示:

现在我们来按 F8 键一步步分析一下:

00440F2C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 把我们输入的内容送到EAX,我这里是“CCDebuger”

00440F2F |. BA 14104400 MOV EDX,CrackMe3.00441014 ; ASCII "Registered User"

00440F34 |. E8 F32BFCFF CALL CrackMe3.00403B2C ; 关键,要用F7跟进去

00440F39 |. 75 51 JNZ SHORT CrackMe3.00440F8C ; 这里跳走就完蛋

当我们按 F8 键走到 00440F34 |. E8 F32BFCFF CALL CrackMe3.00403B2C 这一句时,我们按一下 F7 键,进入这个 CALL,进去后光标停在这一句:

我们所看到的那些 PUSH EBX、 PUSH ESI 等都是调用子程序保存堆栈时用的指令,不用管它,按 F8 键一步步过来,我们只关心关键部分:

00403B2C /$ 53 PUSH EBX

00403B2D |. 56 PUSH ESI

00403B2E |. 57 PUSH EDI

00403B2F |. 89C6 MOV ESI,EAX ; 把EAX内我们输入的用户名送到 ESI

00403B31 |. 89D7 MOV EDI,EDX ; 把EDX内的数据“Registered User”送到EDI

00403B33 |. 39D0 CMP EAX,EDX ; 用“Registered User”和我们输入的用户名作比较

00403B35 |. 0F84 8F000000 JE CrackMe3.00403BCA ; 相同则跳

00403B3B |. 85F6 TEST ESI,ESI ; 看看ESI中是否有数据,主要是看看我们有没有输入用户名

00403B3D |. 74 68 JE SHORT CrackMe3.00403BA7 ; 用户名为空则跳

00403B3F |. 85FF TEST EDI,EDI

00403B41 |. 74 6B JE SHORT CrackMe3.00403BAE

00403B43 |. 8B46 FC MOV EAX,DWORD PTR DS:[ESI-4] ; 用户名长度送EAX

00403B46 |. 8B57 FC MOV EDX,DWORD PTR DS:[EDI-4] ; “Registered User”字串的长度送EDX

00403B49 |. 29D0 SUB EAX,EDX ; 把用户名长度和“Registered User”字串长度相减

00403B4B |. 77 02 JA SHORT CrackMe3.00403B4F ; 用户名长度大于“Registered User”长度则跳

00403B4D |. 01C2 ADD EDX,EAX ; 把减后值与“Registered User”长度相加,即用户名长度

00403B4F |> 52 PUSH EDX

00403B50 |. C1EA 02 SHR EDX,2 ; 用户名长度值右移2位,这里相当于长度除以4

00403B53 |. 74 26 JE SHORT CrackMe3.00403B7B ; 上面的指令及这条指令就是判断用户名长度最少不能低于4

00403B55 |> 8B0E MOV ECX,DWORD PTR DS:[ESI] ; 把我们输入的用户名送到ECX

00403B57 |. 8B1F MOV EBX,DWORD PTR DS:[EDI] ; 把“Registered User”送到EBX

00403B59 |. 39D9 CMP ECX,EBX ; 比较

00403B5B |. 75 58 JNZ SHORT CrackMe3.00403BB5 ; 不等则完蛋

根据上面的分析,我们知道用户名必须是“Registered User”。我们按 F9 键让程序运行,出现错误对话框,点确定,重新在第一个编辑框中输入“Registered User”,再次点击那个“Register now !”按钮,被 OllyDBG 拦下。因为地址 00440F34 处的那个 CALL 我们已经分析清楚了,这次就不用再按 F7 键跟进去了,直接按 F8 键通过。我们一路按 F8 键,来到第二个关键代码处:

00440F49 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 取输入的注册码

00440F4C |. BA 2C104400 MOV EDX,CrackMe3.0044102C ; ASCII "GFX-754-IER-954"

00440F51 |. E8 D62BFCFF CALL CrackMe3.00403B2C ; 关键,要用F7跟进去

00440F56 |. 75 1A JNZ SHORT CrackMe3.00440F72 ; 这里跳走就完蛋

大家注意看一下,地址 00440F51 处的 CALL CrackMe3.00403B2C 和上面我们分析的地址 00440F34 处的 CALL CrackMe3.00403B2C 是不是汇编指令都一样啊?这说明检测用户名和注册码是用的同一个子程序。而这个子程序 CALL 我们在上面已经分析过了。我们执行到现在可以很容易得出结论,这个 CALL 也就是把我们输入的注册码与 00440F4C 地址处指令后的“GFX-754-IER-954”作比较,相等则 OK。好了,我们已经得到足够的信息了。现在我们在菜单 查看->断点 上点击一下,打开断点窗口(也可以通过组合键 ALT+B 或点击工具栏上那个“B”图标打开断点窗口):

为什么要做这一步,而不是把这个断点删除呢?这里主要是为了保险一点,万一分析错误,我们还要接着分析,要是把断点删除了就要做一些重复工作了。还是先禁用一下,如果经过实际验证证明我们的分析是正确的,再删不迟。现在我们把断点禁用,在 OllyDBG 中按 F9 键让程序运行。输入我们经分析得出的内容:

用户名:Registered User

注册码:GFX-754-IER-954

点击“Register now !”按钮,呵呵,终于成功了:

CrackMe-CFF Crackme #3的更多相关文章

  1. 软件破解入门(暴力破解CrackMe)

    ---恢复内容开始--- 所谓暴力破解,就是通过修改汇编代码进而控制程序的运行流程,达到不需注册码也能正常使用软件的目的.相对于解出算法进而编写注册机,暴破的技术含量是比较低的.但也正是因为一本05年 ...

  2. 破解 crackme4(深入底层抓出关键算法)

    系统 : Windows xp 程序 : crackme4 程序下载地址 :http://pan.baidu.com/s/1nu452xN 要求 : 注册机编写 使用工具 : OD & IDA ...

  3. 简单详细的OD破解教程

    2007-08-04 15:46作者:CCDebuger注:昨天在网上见到了这篇文章,但缺少插图,从另外一篇文章中也看到了类似的的教程文章,里面的插图质量实在不敢恭维.在一个论坛中正好下载了文章中所介 ...

  4. OllyDBG 破解入门教程

    一.OllyDBG 的安装与配置OllyDBG  版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了.汉化版的发布版本是个 RAR 压缩包,同样只需解压到一 ...

  5. 一个有趣的CM

    系统 : Windows xp 程序 : Crackme#3 - Self Destructed 程序下载地址 :http://pan.baidu.com/s/1kVxwlaZ 要求 : 注册机编写 ...

  6. 可执行文件patch技术&&持续更新

    前言 在ctf比赛中, 有时我们需要对可执行文件进行patch, 或者在植入后门时,patch也是常用的手段.不过手工patch比较麻烦,下面介绍几个工具.本文介绍遇到的各种技术,不断更新. ELF ...

  7. Android动态调试so库JNI_Onload函数-----基于IDA实现

    之前看过吾爱破解论坛一个关于Android'逆向动态调试的经验总结帖,那个帖子写的很好,对Android的脱壳和破解很有帮助,之前我们老师在上课的时候也讲过集中调试的方法,但是现在不太实用.对吾爱破解 ...

  8. 一个crackme的分析

    是看雪合集的一个,因为老师让我们多练习,所以我就找了个crackme来练习 http://images2015.cnblogs.com/blog/638600/201612/638600-201612 ...

  9. 破解 crackme(完全拆解警告窗口)

    系统 : Windows xp 程序 : crackme 程序下载地址 :http://pan.baidu.com/s/1kUrbcAr 要求 : 注册机编写 & 去除Nag窗口 使用工具 : ...

  10. 破解 CrackMe#1 [UBC] by bRaINbuSY

    系统 : Windows xp 程序 : CrackMe#1 程序下载地址 :http://pan.baidu.com/s/1nuagj6h 要求 : 编写注册机 使用工具 :IDA & OD ...

随机推荐

  1. tensorflow2 自定义损失函数使用的隐藏坑

    Keras的核心原则是逐步揭示复杂性,可以在保持相应的高级便利性的同时,对操作细节进行更多控制.当我们要自定义fit中的训练算法时,可以重写模型中的train_step方法,然后调用fit来训练模型. ...

  2. etcd学习(4)-centos7中部署etcd

    etcd的搭建 前言 单机 集群 创建etcd配置文件 更新etcd系统默认配置 启动 配置ETCD为启动服务 测试下 参考 etcd的搭建 前言 这里记录下如何搭建etcd 单机 在etcd的rel ...

  3. xmind2020 zen 10.3.1安装破解教程

    hi大家好,xmind zen 2020 10.3.1是一款优秀的思维导图工具,我和我爸爸都在用,功能包括去掉xmind zen水印.上传图片等功能,支持windows操作系统! 文章教大家安装并解锁 ...

  4. 防止因提供的sql脚本有问题导致版本bvt失败技巧

    发版本时,可能会由于测试库和开发库表结构不一样而导致数据库脚本在测试那边执行时出错,导致版本BVT失败,以下技巧可解决此问题. 步骤:备份目标库,在备份库中执行将要提供的sql脚本看有无问题,若没问题 ...

  5. intouch 开发源程序加密方法

    在先前项目中,因为同行竞争被拷贝走了源程序代码,以至于被上司责备,故而亡羊补牢对intouch(10.1老版本进行源代码加密探索)整理方法如下. 1.intouch wondermarker打开源程序 ...

  6. DC-4靶机

    仅供个人娱乐 靶机信息 下载地址:http://www.five86.com/downloads/DC-4.zip 一.主机扫描 arp-scan -l nmap -p 1-65535 -A -sV ...

  7. 【译】使用 Source Link 提高调试效率

    有多少次你在调试器中追踪一个缺陷,通过代码,观察局部变量的值改变,当你碰壁--不是你所期待的值和你不能进入的方法,因为它来自类库或 .NET 框架本身:或者您设置了一个条件断点,等待检查某个值是如何设 ...

  8. etcd raft 处理流程图系列2-transport

    本章给出了raftexample中使用的传输层代码,补全了上一节中传输层与raft节点(raft server和channel server)的交互细节.下图中流程的核心在于传输层中的streamRt ...

  9. 判断Windows系统是32位或64位并执行不同脚本命令

    判断Windows系统是32位或64位并执行不同脚本命令 https://www.autoahk.com/?p=16549&preview=true https://www.cnblogs.c ...

  10. SpringBoot数据访问之整合Mybatis配置文件

    环境搭建以及前置知识回顾 SpringBoot中有两种start的形式: 官方:spring-boot-starter-* 第三方:*-spring-boot-starter Mybatis属于第三方 ...