CrackMe-005全破详解(图文+源码)--上篇
逆向破解 | 逆向 | 逆向分析 | CrackMe | Crack | CrackMe5 | CrackMe05
前言
CrackMe005,都说比较变态,很多人给放过去了,但是我还是决定上了它,既然变态就分两篇,上篇先实际说流程,到底应该怎么上它,下篇会告诉逆向分析的过程和方法
准备
【环境和工具】
win7/xp虚拟机环境
CrackMe005(ajj2.zip)
ollydbg
Dededark
peid
UPXEasyGUI.exe(upx专用脱壳器)
【学习层次】
爆破,但是这个CM作者声明了,爆破他是不认可的
解密流程,写注册机
积累Delphi程序逆向特点经验
实战图文
一.最终效果动图展示

二.查壳、脱壳
1.peid查壳
发现是upx壳,如下图

2.脱壳
peid通用脱壳可以脱(脱后492K)
手动OD脱可以脱(脱后492K)
UPXEasyGUI.exe(upx专用脱壳器)也可以脱,脱后(448K)
建议UPXEasyGUI脱,前两种脱法脱后,反汇编代码有些地方会有一定的错位,会影响逆向分析
具体原因是啥有高人可以指点的话请联系我
脱后如图
二.整个破解流程
注意:建议使用我已经修改过的原版,修改点只有一个字符X盘符改成了C盘符,否则你需要增加X分区或者改盘符,搁不住,所以我修改了程序,当然你也可以自己脱壳后,自己搜索字符串,自己再改盘符字符串
1.复制目录下ok.txt,到C:\ajj.126.c0m\j\o\j\o\ok.txt,这里我给原版的X盘改成C盘了,不然就改分区。

2.这时就应该可以显示出Edit2文本框,但是是禁用状态。

3.右键点击5次注册按钮(注意是右键)。
4.左键双击图框区空白处(不能点着图),Edit2文本框禁用解除。

5.用户名输入ajj
6.Edit2文本框内输入1_345,78后左键双击Edit2输入框中任何位置。
7.在图片是“性相近”的时候,鼠标从软件框右下脚移入软件框内。

8.在图片是“性本善”的时候,鼠标从软件框左下角移入软件框内。
9.这时候应该label3显示出数字,是0,1,2,3这四个当中的其中一个。

10.将数字输入我写的注册机,点击生成最终点击方案。

11.依照方案点击相应图片,注册成功

三、注册机源码
源码中,我求的是点击次数总和最小的方法,因为其实有很多组合,只求效率最高的方法,源码写的比较臃肿,为的是新手好读懂
void CCM002Dlg::OnOK()
{
// TODO: Add extra validation here //CDialog::OnOK(); char szKey[]={};
int n = ;
GetDlgItemText(IDC_EDIT1,szKey,);
if(!strlen(szKey))
{ MessageBox("请按照【前期步骤】获取正确数值后再生成方案!","友情提示");
return;
}
n = GetDlgItemInt(IDC_EDIT1); switch(n){
case :
n=0x3D;
break;
case :
n=0x34;
break;
case :
n=0xDF;
break; default : // 可选的
n=0x41;
} struct image
{
char szname[];
int nNumber ;
int nLef;
int nRight;
};
image aImage[]={}; sprintf(aImage[].szname,"人之初");
aImage[].nNumber = ;
aImage[].nLef = 0x2;
aImage[].nRight = 0x11; sprintf(aImage[].szname,"性本善");
aImage[].nNumber = ;
aImage[].nLef = 0x3;
aImage[].nRight = 0x13; sprintf(aImage[].szname,"性相近");
aImage[].nNumber = ;
aImage[].nLef = 0x5;
aImage[].nRight = 0x17; sprintf(aImage[].szname,"习相远");
aImage[].nNumber = ;
aImage[].nLef = 0x7;
aImage[].nRight = 0x1B;
/************************************************************************/
/* 设计原则,选择出点击次数最少的方案
/* iR作为大数数组下标,iL作为小数数组下标,j大数商,k小数商,求i+j最小值
/************************************************************************/
int nRes = ;
int nIL = ;
int nIR = ;
int nJ = ;
int nK = ;
for (int iL=;iL<;iL++)
{
for (int iR=;iR < ;iR++)
{ for (int j=;j<=;j++)
{
for (int k =;k<=;k++)
{ if ((aImage[iR].nRight*j + aImage[iL].nLef*k == n) && (nRes> j+k))
{
nIL = iL;
nIR = iR;
nJ = j;
nK = k;
nRes = j+k ;
} }
}
} } sprintf(szKey,"在“%s”图片时左键点击图片%d次\r\n\r\n在“%s”图片时右键点击图片%d次\r\n\r\n即可注册成功!",aImage[nIL].szname,nK,aImage[nIR].szname,nJ);
SetDlgItemText(IDC_EDIT2,szKey); }
CrackMe-005全破详解(图文+源码)--上篇的更多相关文章
- Java SPI机制实战详解及源码分析
背景介绍 提起SPI机制,可能很多人不太熟悉,它是由JDK直接提供的,全称为:Service Provider Interface.而在平时的使用过程中也很少遇到,但如果你阅读一些框架的源码时,会发现 ...
- 基于双向BiLstm神经网络的中文分词详解及源码
基于双向BiLstm神经网络的中文分词详解及源码 基于双向BiLstm神经网络的中文分词详解及源码 1 标注序列 2 训练网络 3 Viterbi算法求解最优路径 4 keras代码讲解 最后 源代码 ...
- 详解 QT 源码之 Qt 事件机制原理
QT 源码之 Qt 事件机制原理是本文要介绍的内容,在用Qt写Gui程序的时候,在main函数里面最后依据都是app.exec();很多书上对这句的解释是,使 Qt 程序进入消息循环.下面我们就到ex ...
- Android应用AsyncTask处理机制详解及源码分析
1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个知识点.前面我们分析了Handler异步机制原理(不了解的可以阅读我的<Android异步消息处理机 ...
- SpringBoot之DispatcherServlet详解及源码解析
在使用SpringBoot之后,我们表面上已经无法直接看到DispatcherServlet的使用了.本篇文章,带大家从最初DispatcherServlet的使用开始到SpringBoot源码中Di ...
- Spring Boot启动命令参数详解及源码分析
使用过Spring Boot,我们都知道通过java -jar可以快速启动Spring Boot项目.同时,也可以通过在执行jar -jar时传递参数来进行配置.本文带大家系统的了解一下Spring ...
- select用法&原理详解(源码剖析)(转)
今天遇到了在select()前后fd_set的变化问题,查了好久终于找到一个有用的帖子了,很赞,很详细!!原文链接如下: select用法&原理详解(源码剖析) 我的问题是: 如下图示:在se ...
- 【转载】Android应用AsyncTask处理机制详解及源码分析
[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个 ...
- 详解HashMap源码解析(下)
上文详解HashMap源码解析(上)介绍了HashMap整体介绍了一下数据结构,主要属性字段,获取数组的索引下标,以及几个构造方法.本文重点讲解元素的添加.查找.扩容等主要方法. 添加元素 put(K ...
- 详解ConCurrentHashMap源码(jdk1.8)
ConCurrentHashMap是一个支持高并发集合,常用的集合之一,在jdk1.8中ConCurrentHashMap的结构和操作和HashMap都很类似: 数据结构基于数组+链表/红黑树. ge ...
随机推荐
- [20171120]11g select for update skip locked.txt
[20171120]11g select for update skip locked.txt --//11G在select for update遇到阻塞时可以通过skipped locked跳过阻塞 ...
- [20171107]dbms_shared_pool.pin补充.txt
[20171107]dbms_shared_pool.pin补充.txt --//上午的测试,做一些补充,主要还是一些理解问题. 1.环境:SCOTT@book> @ &r/ver1 P ...
- Django应用:学习日志网站
目录 一.创建虚拟环境(Windows) 二.创建项目 三.创建应用程序 四.创建网页:学习笔记主页 五.创建其他网页 六.用户输入数据 七.用户账户 八.让用户拥有自己的数据 九.设置应用程序样式 ...
- strong vs copy
一.前言 在这里,我通过实例去介绍strong和copy的区别(%p打印出来对象的地址) ViewController.h #import <UIKi ...
- ES5-ES6-ES7_let关键字声明变量
let命令的介绍 let是ECMAScript6中新增的关键字,用于声明变量.它的用法类似于var var a = 3 let b = 4 let变量的声明 let 命令的特点不允许在同一作用域下声明 ...
- python五十七课——正则表达式(元字符)
1).匹配单个字符(数字.英文.其它) 符号位: []:表示一个字符位 [0123456789]:表示一位,取值范围:[0,9]之间的任何一个值 [0-9]:表示一位,取值范围:[0,9]之间的任何一 ...
- oracle11gR2 手工创建基于asm存储的oracle实例
http://www.cnblogs.com/beanbee/archive/2012/09/22/2697689.html使用命令行手工建立Oracle11gR2数据库 通过命令行建立一个数据库可以 ...
- 离线安装Cloudera Manager 5和CDH5(最新版5.9.3) 完全教程(五)数据库安装(双节点)
一.方案选择 通过Lvs+keepalived+mysql(主主同步)实现数据库层面的高可用方案,需要两台服务器作为数据库提供业务数据的存储,应用服务器通过vip访问数据库,允许同一时间内一台数据库服 ...
- 双目SLAM(1) 总配置
kitti 数据集 图像+相机参数 sgbm gpu 算深度 cuda sifi 算匹配点 rabsac 随机筛选 1)CUDA配置(自己配置)8.0 参考网页 ...
- var 全局变量 局部变量
var 定义的不一定是局部变量 全局变量: 过程体(包括方法function(){},对象Object={})外的所有的变量,不管有没有加var关键字,他都是全局变量. 局部变量: 在过程体内(方法, ...