zoukankan      html  css  js  c++  java
  • Crackme006

    知乎:逆向驿站

    原文链接
    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]='';
    	//循环处理后,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按钮
    
    ", nKey);
    	sprintf(szRes+strlen(szRes),"2.cancella按钮消失后,请在name处输入%s,然后点击ok按钮
    
    ", 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

  • 相关阅读:
    大数据之路_1
    Echart图表设置项
    AsyncSocket
    book_.Net与设计模式
    book_精通正则表达式
    操作系统基本功能
    操作系统基础
    网络系统结构与设计的基本原则
    3.1EDA和数据描述: 探索性数据分析
    宽带城域网
  • 原文地址:https://www.cnblogs.com/nxyz/p/10334737.html
Copyright © 2011-2022 走看看