知乎:逆向驿站



原文链接

CrackMe006 | 难度适中适合练手 |160个CrackMe深度解析(图文+视频+注册机源码)

crackme006,依然是delphi的,而且没壳子,条线比较清晰,算法也不难,非常适合新入门的来练习.

快过年了,Crackme系列年前就停更在006吧,祝大家新年666 ,年后继续

准备

【环境和工具】

  • win7/xp虚拟机环境

  • CrackMe006(aLoNg3x.1.exe)

  • ollydbg

  • Dededark

【学习层次】

  • 逆向分析程序验证流程逻辑

  • 解密算法,写注册机

  • 积累Delphi程序逆向特点经验

实战图文

最终效果展示

程序验证流程逻辑图

动态分析

1.程序观察

旁边既然有个help,我们当然要看了,四个弹框,有实际信息价值的是头两个,如图



大体意思是,这个crackme的最终目标是隐藏ok和cancella按钮来观看完整的Ringzero logo。

2.控件ID,事件函数信息

依然老规矩,既然是delphi的程序,我们就先用dededark给控件信息和事件函数信息搜集出来



3.控件ID常量搜索法,打开入手点

程序开始是ok按钮是禁用状态,cancella按钮是可以点击的,那么我们就从cancella入手,两个方向,你可以去找cancellaclick事件的函数入手,也可以从cancella控件ID入手,我这里选择后者,因为最终目的是cancella要被隐藏起来,无论如何一定会用到控件ID

查找→所有常量→2D0(cancella按钮控件ID),结果如下

一共有四个地方用到了这个控件ID,我们分别跟入查看哪个是我们想找的隐藏这个控件的反汇编代码,从上至下依次如下







找到了入手点,我们开始上下阅读函数块,发现这正是cancellaclick事件函数

4.分析Cancellaclick中算法

在Cancellaclick函数入口处下断点,然后用户名输入123456,注册码输入654321,然后开始动态调试分析,F8步过分析如下图

F7跟如算法call仔细分析,如下图

这种不是摘要hash的,是直接可以逆推计算出注册码,根据以上算法的反汇编分析,写出逆推注册码的源码,如下

	char szName1[128] = {0};
char szCode[128] ={0} ;
char szRes[256] ={0} ;
int nKey = 0 ;
int nlen = 0;
int nTemp = 0 ; GetDlgItemText(IDC_EDIT1,szName1,128);
nlen = strlen(szName1);
if (nlen<=5 || nlen >10 || szName1[0] == 0x30)
{
MessageBox("请输入6-10字符长度的字符串,而且第一位不能是0!","逆向驿站提示您");
return ;
}
/************************************************************************/
/* cancella点击事件算法,可隐藏cancella按钮,根据输入name推code */
/************************************************************************/
nKey = ((int)szName1[4])%7+2 ;
nTemp = nKey ;
//阶乘
for (int i=1;i<nTemp;i++)
{
nKey = nKey * i;
} nTemp = nKey ;
nKey = 0 ;
//求和
for (int j =0;j<nlen ;j++)
{
nKey = nKey + nTemp * ((int)szName1[j]);
}
//得出正确code
nKey = nKey - 0x7a69 ;//nKey值就是code应该输入的值

例如我们输入的用户名是123456,逆推注册码计算如下

  • "123456"的第五个字符是"5",asc码是53,即十六进制0x35

  • 除以7余数是4,再加2是6

  • 6的阶乘是6 * 5* 4* 3 *2 *1,等于720 ,即十六进制的0x2D0

  • 123456每个字符的asc码相加是0x31+0x32+0x33+0x34+0x35+0x36,结果是0x135

  • 0x135 乘以0x2D0是0x36510

  • 0x36510比注册码的十六进制形态大0x7A69

  • 即注册码是0x36510-0x7A69 = 0x2EAA7 ,即十进制是191143

算出了注册码,我们来测试一下,如下动图

Cancella按钮消失

5.分析OK按钮中算法

有了如上的过程作为经验,我们"依葫芦画瓢",来进行ok按钮中的算法分析,依然是okClick事件入口下断,F8动态分析,结果如下

F7跟如算法call仔细分析,如下图

分析后发现,这个算法是根据已经算出的注册码,再次要求用户名合规,算法并不难,而且很敏感的看到0x41,0x41对应的asc字符是大写字母A,而0x41加上的数字的取值范围是0-0x19,即十进制0-25,那一看就知道,就是26个大写字母范围内了,这时候你可以变态的暴力枚举也行,当然这个也是可以逆推出来,我们还是选择逆推吧。源码如下

	/************************************************************************/
/* ok点击事件算法,可隐藏ok按钮,根据code推name */
/************************************************************************/ sprintf(szCode,"%d",nKey);
nlen =strlen(szCode);
szName1[nlen]='\0';
//循环处理后,szName1就是要求的name
for (int k =nlen-1;k>=0;k--)
{
szName1[k] = ((int)szCode[k] * (int)szCode[k] * (k+1))%0x19+0x41; }
sprintf(szRes,"1.请在code处输入%d,然后点击cancella按钮\r\n\r\n", nKey);
sprintf(szRes+strlen(szRes),"2.cancella按钮消失后,请在name处输入%s,然后点击ok按钮\r\n\r\n", szName1);
sprintf(szRes+strlen(szRes),"3.ok按钮消失,注册成功");
SetDlgItemText(IDC_EDIT2,szRes);

我们刚输入的注册码是191143,逆推出用户名应该是"BXDEUG",验证如下动图

OK按钮消失,至此全部搞定, 是不是感觉不难,去网盘中下载,试试吧

补充知识点

再CancellaClick事件算法中,有个阶乘计算,函数内部反汇编代码如下,可以作为知识点积累,下次看到这个第一时间就能反应过来,提高效率,逆向的老手往往是这种知识碎片很多,而且脑部搜索算法很精准

最后,喜欢这里的请推荐给你身边的朋友吧(渗透测试、逆向破解、病毒分析、信息安全等)

文章中涉及软件、课件、源码等均在网盘,为避免网盘链接失效,公众号中回复:网盘

欢迎关注微信公众号:逆向驿站

相关文章

CrackMe-005精解(下)

CrackMe-005精解(上)

CrackMe-004精解

CrackMe-003精解

CrackMe-002精解

CrackMe-001精解

本期标签:dededark|delphi反汇编|crackme|crackme6|crackme06

Crackme006 - 全新160个CrackMe学习系列(图文|视频|注册机源码)的更多相关文章

  1. Java并发包源码学习系列:线程池ScheduledThreadPoolExecutor源码解析

    目录 ScheduledThreadPoolExecutor概述 类图结构 ScheduledExecutorService ScheduledFutureTask FutureTask schedu ...

  2. Java并发包源码学习系列:线程池ThreadPoolExecutor源码解析

    目录 ThreadPoolExecutor概述 线程池解决的优点 线程池处理流程 创建线程池 重要常量及字段 线程池的五种状态及转换 ThreadPoolExecutor构造参数及参数意义 Work类 ...

  3. Java并发包源码学习系列:同步组件CountDownLatch源码解析

    目录 CountDownLatch概述 使用案例与基本思路 类图与基本结构 void await() boolean await(long timeout, TimeUnit unit) void c ...

  4. Java并发包源码学习系列:同步组件CyclicBarrier源码解析

    目录 CyclicBarrier概述 案例学习 类图结构及重要字段 内部类Generation及相关方法 void reset() void breakBarrier() void nextGener ...

  5. Java并发包源码学习系列:同步组件Semaphore源码解析

    目录 Semaphore概述及案例学习 类图结构及重要字段 void acquire() 非公平 公平策略 void acquire(int permits) void acquireUninterr ...

  6. Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  7. Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  8. Java 集合系列 06 Stack详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  9. Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

随机推荐

  1. 用Python实现数据结构之链表

    链表 链表与栈,队列不一样,它是由一个个节点构成的,每个节点存储着本身的一些信息,也存储着其他一个或多个节点的引用,可以从一个节点找到其他的节点,节点与节点之间就像是有链连在一起一样,这种数据结构就叫 ...

  2. pandas的resample重采样

    Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法. 降采样:高频数据到低频数据 升采样:低频数据到高频数据 主要函数:r ...

  3. Java设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  4. Linux下编辑、编译、调试命令总结——gcc和gdb描述

    GCC gcc是linux系统集成的编译器.在linux环境下编辑程序,首先需要克服的便是没有集成开发环境的一键式操作所带来的麻烦.这其中涉及命令行操作.编译选项的设定.文件依赖关系的书写(makef ...

  5. Django之ORM查询进阶

    基于双下划线的双表查询 分组与聚合函数 基于双下划线的双表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询, ...

  6. 清空表与删除表mysql

    Mysql清空表(truncate)与删除表中数据(delete)的区别 为某基于wordpress搭建的博客长久未除草,某天升级的时候发现已经被插入了几万条垃圾留言,如果一条条删除那可真是累人的活. ...

  7. 对Promise的理解?

    ES6原生提供了promise对象 所谓Promise,就是一个对象,用来传递异步操作的消息.它代表了某个未来才会知道结果的事件(通过是一个异步操作),并且这个事件提供统一的API,可供进一步处理 P ...

  8. (转)清除已运行过Rancher和K8S的主机上的环境数据

    文章转自 https://blog.csdn.net/CSDN_duomaomao/article/details/77684571?locationNum=5&fps=1 本文命令主要是参考 ...

  9. 在CentOS7服务器端启动jupyter notebook服务,在windows端使用jupyter notebook,服务器充当后台计算云端

    在CentOS7服务器端启动jupyter notebook服务,在windows端使用jupyter notebook,服务器充当后台计算云端 在服务器端启动jupyter notebook服务,在 ...

  10. 在 Virtual Box 安装 Mac Os 并安装 Qt 开发应用

    导读 由于 Beslyric-for-X 项目开发需要,开始尝试在 Mac Os 下开发 Qt 应用.尝试成功后,记录于此,希望对有类似需求的人有所帮助. 本文以开发 Beslyric-for-X 为 ...