---恢复内容开始---

所谓暴力破解,就是通过修改汇编代码进而控制程序的运行流程,达到不需注册码也能正常使用软件的目的。相对于解出算法进而编写注册机,暴破的技术含量是比较低的。但也正是因为一本05年的杂志上介绍“暴力破解”的文章,让我入了这个大坑。近来想重拾调试器,就先从最简单的CrackMe入手,熟练一下各工具方法。

下载CrackMe3文件(我用的是看雪《加密与解密》中的CFF CrackMe #3 程序  http://pan.baidu.com/s/1dD9v9x3 )。

1.查看此程序是否加壳。加壳的话还得进行脱壳处理。将CrackMe拖到PEID上,显示用Delphi编写。无壳,甚好。

3.打开程序,看看注册码出现异常的时候有何提示。恩,输入错误的注册码,确认。显示了“Wrong Serial,try again!”。我们记下这一串字符,接下来用得到。

4.退出程序,打开OllyDbg,并载入此程序。(当年用的是W32Dasm,属于静态反汇编软件,支持WIN API,具有强大的串式参考功能。因此成为破解入门软件的最佳选择。这次用OllyDbg实施爆破,只是复习一下操作。爆破原理都是相同的)下图是OllyICE,是OllyDbg的汉化版。也一样好用。

载入程序后,出现如下界面:

title上面的“模块 — crackme3”标明了程序领空,我们当前是在crackme的代码内。

5.我们在反汇编窗口“右键——查找——所有参考文本字符串”:

然后会弹出一个文本字符串的对话框,继续“右键——查找文本”:

然后会弹出对话框,输入前面记下来的那串“Wrong Serial,try again!”。其实为了方便,可以只输入“Wrong”这个字符串,毕竟程序里带“Wrong”的字符不会太多,如下图:

点击“确定”后,会高亮查找结果,此时在对应字符串处“右键——反汇编窗口中跟随”,会在反汇编窗口中跳到对应此串字符的汇编指令:

看到上图的指令,分析一下程序流程:输入ID和注册码后,call调用子函数来判断注册码是否正确(00440F51处,call 00403B2C处的子函数),如果不正确,一个jnz跳到00440F72,弹出“Wrong Serial ,try again!”,提醒说你丫注册码是错的。

为了验证我们的想法,我们在call的前面按F2下个断点,然后一步步跟进,看看call了个什么函数过来:

然后F9让程序跑起来,输入假的ID “wwwwww” ,按下“注册”。此时程序自然要去call子函数来验证我们的注册码是否正确。可惜它还没走到call的那一步,就停在了我们设的断点上(可以看到信息窗口中的堆栈内容“wwwww”,不知会不会存在缓冲区溢出?XD):

然后按下几次F8单步步过,直到了00440F34 call指令,程序就要召唤子程序来检验注册码是否正确了!此时改为F7单步步入,跟踪到所call的函数(如图,此函数地址在00403B2C处):

跟进去之后,这就是用来验证注册码的程序(从 三个push压入堆栈 开始,到 三个pop弹出堆栈+retn 结束):

从代码中可以发现,程序将输入的注册码与内置的注册码用cmp指令做了比较。(cmp指令执行后,将对标志寄存器ZF产生影响。比如 CMP AX , BX ,当AX=BX时,ZF=1;AX!=BX时,ZF=0。)

也就是说,如果注册码与输入的字符串不相等,ZF=0。此时子程序返回,执行00440F39处的JNZ指令。因为输入的注册码不对,ZF=0,开始执行JNZ,跳转到00440F8C,弹出“Wrong Serial”对话框提示注册码错误。

这就是传说中的“关键跳”,如果将JNZ(ZF=0时就跳转)改为JE(ZF=1时就跳转),得到的结果就会正好相反,即错误的注册码反而会提示注册成功,对的注册码反而会提示错误。

6.那么现在找出那两个“关键跳”(输入ID时call了一下,然后一个jnz。输入注册码时又call了一下,再一个jnz。),如下图:

好,现在只剩下修改汇编代码了。双击对应的JNZ指令,弹出“汇编于此处”的对话框。将只需将“jnz”改为“je”,点击“汇编”即可。用同样的方法修改另一处“jnz”:

修改完毕,“右键——复制到可执行文件——所有修改“:

在弹出的对话框中点击“全部复制”:

然后在出现的新对话框中“右键——保存文件”,完毕。

此时打开新保存的文件,随意输入一个ID和注册码,点击“注册”,即弹出“注册成功”的对话框:

小结:本次主要是重温了OllyDbg的操作。爆破无外乎就是改变程序的验证流程,譬如将关键处的jne改为je,或者jmp,比较不优雅。更优雅的是揣摩出程序作者的验证算法,写出内存补丁或者注册机,这才是高大上的方法。无奈算法一类的是我的软肋,仍需努力啊。

软件破解入门(暴力破解CrackMe)的更多相关文章

  1. 记一次ctf比赛解密题的解决(可逆加密基本破解之暴力破解)

    题目是这个样子的: code.txt的内容是这样: 有点吓人木?233333 其实解密之后是这样的: 找到一点安慰没? 好了,废话不多说.讲解一下思路吧. 我们知道base64加密是属于可逆加密的.简 ...

  2. 新萌渗透测试入门DVWA 教程2:DWVA 的配置和暴力破解靶机

    啊呀,上周忘了更新了.开篇时分,简短的深表歉意. 好了,现在开始配置DWVS. 0x00 配置DWVS 首先输入密码登陆,用户名admin,密码password 进入界面后选择,DVWA Securi ...

  3. 010 Editor 8.0.1 之 暴力破解

    一.工具及软件介绍二.破解1.打开调试程序2.打开注册页面3.在弹出窗口API中下断4.点击注册按钮5.逐一进去观察6.找到正确的授权字符串7.找到函数头8.找到计算出EBX的CALL9.进入函数跟踪 ...

  4. sshd服务器搭建管理和防止暴力破解

    1.1 Linux服务前期环境准备,搭建一个RHEL7环境 1.2 sshd服务安装-ssh命令使用方法 1.3 sshd服务配置和管理 1.4 防止SSHD服务暴力破解的几种方式 1.1 Linux ...

  5. 使用C#winform编写渗透测试工具--暴力破解

    使用C#winform编写渗透测试工具--暴力破解 这篇文章主要介绍使用C#winform编写渗透测试工具--暴力破解.暴力破解是指通过利用大量猜测和穷举的方式来尝试获取用户口令的攻击方式.简单来说就 ...

  6. Brute Force(暴力(破解))

    一.攻击模块1:Brute Force(暴力破解) 暴力破解一般指穷举法,穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕.若某个情况 ...

  7. Python黑客编程2 入门demo--zip暴力破解

    Python黑客编程2 入门demo--zip暴力破解 上一篇文章,我们在Kali Linux中搭建了基本的Python开发环境,本篇文章为了拉近Python和大家的距离,我们写一个暴力破解zip包密 ...

  8. 安全性测试入门:DVWA系列研究(一):Brute Force暴力破解攻击和防御

    写在篇头: 随着国内的互联网产业日臻成熟,软件质量的要求越来越高,对测试团队和测试工程师提出了种种新的挑战. 传统的行业现象是90%的测试工程师被堆积在基本的功能.系统.黑盒测试,但是随着软件测试整体 ...

  9. 入门系列之使用fail2ban防御SSH服务器的暴力破解攻击

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由SQL GM发表于云+社区专栏 介绍 对于SSH服务的常见的攻击就是暴力破解攻击--远程攻击者通过不同的密码来无限次地进行登录尝试.当 ...

随机推荐

  1. P1734 最大约数和

    题目描述 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. 输入输出格式 输入格式: 输入一个正整数S. 输出格式: 输出最大的约数之和. 输入输出样例 输入样例#1: 复 ...

  2. docker执行第一个应用

    概念科普 Docker image:镜像是只读的,镜像中包含有需要运行的文件.镜像用来创建container,一个镜像可以运行多个container:镜像可以通过Dockerfile创建,也可以从Do ...

  3. Android学习之基础知识四-Activity活动2讲

    一.在活动(activity)中添加Toast显示: 1.Toast作用:Android系统提供的一种非常好的提醒方式,将一些短小的信息提供给用户,这些信息会在一段时间后自动消失,不会占用任何屏幕空间 ...

  4. ASP.NET Core 释放 IDisposable 对象的四种方法

    本文翻译自<Four ways to dispose IDisposables in ASP.NET Core>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! IDispos ...

  5. 序号生成算法odoo

    def get_sum_seq(self, cr, uid, ids, name, args=None, context=None): if not ids: return {} result={} ...

  6. Luogu4338 ZJOI2018 历史 LCT、贪心

    传送门 题意:在$N$个点的$LCT$中,最开始每条边的虚实不定,给出每一个点的$access$次数,求一种$access$方案使得每条边的虚实变换次数之和最大,需要支持动态增加某个点的$access ...

  7. Spring学习日志之纯Java配置的MVC框架搭建

    依赖引入 <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifa ...

  8. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(八)线上Mysql数据库崩溃事故的原因和处理

    前文提要 承接前文<一次线上Mysql数据库崩溃事故的记录>,在文章中讲到了一次线上数据库崩溃的事件记录,建议两篇文章结合在一起看,不至于摸不着头脑. 由于时间原因,其中只讲了当时的一些经 ...

  9. 关于树莓派HDMI转VGA线接显示器黑屏

    经过数种折腾,找到了解决方法,在SD卡内有个config.txt文件,在其中找到“#hdmi_safe=1”,把#消除掉,变更后成为 # uncomment if you get no picture ...

  10. CSS 列表实例

    CSS 列表属性允许你放置.改变列表项标志,或者将图像作为列表项标志.CSS 列表属性(list)属性 描述list-style 简写属性.用于把所有用于列表的属性设置于一个声明中.list-styl ...