[CrackMe]Cabeca.exe的逆向及注册机编写

news2024/10/7 18:25:15

1. 逆向分析过程

又是Delphi的程序, 有了上次的经验这次顺利了很多。差不多花了70分钟的样子, 把这个东西逆出来了。
在这里插入图片描述
先运行一下, 看看基本的功能, 这个作者一直用dumb或者idiot来称呼破解者(无奈), 着实有点皮
填充不完全会出现如下对话框:
在这里插入图片描述
如果serial不对, 会出现如下对话框:
在这里插入图片描述
这个crackme会通过Name来计算出Serial1和Serial2两个值, 如果满足要求过了。直接定位到Button的处理函数。
在这里插入图片描述
下断点, 输入一些值后F9运行, 断到Button的处理函数
在这里插入图片描述
首先它检测了2个DWORD的值是否为0, 如果是0那就跳转到显示没有填完整的弹框(红色框), 接着获取了Name, Serial1, Serial2这3个值的内容(蓝色框), 同样对比是否存在, 不存在就跳转到显示没有填完整的弹框。
在这里插入图片描述
接着再次对比2个DWORD值是否为0, 不是0就通过Hex2DecString把第一个DWORD值也就是nNameHash(实际上这是Serial1进行某种运算得到的值)转成了10进制字符串。
在这里插入图片描述
在Delphi的反汇编工具里也体现了这一点
在这里插入图片描述
马上就是关键的一步了, 把刚生产的nNameHash十进制字符串和serial1字符串作为参数传入了CheckSerial函数里
在这里插入图片描述
CheckSerial首先确认传入2个字符串不为空然后分别获取了它们2个的长度取值, 并获取长度差
在这里插入图片描述
从2个字符串内分别取出4字节放入ebx和ecx内, 然后进行对比是否相同。
在这里插入图片描述
如果不同, 那分别进行对比(之前都对比过不一样了, 不知道这有啥意义)
在这里插入图片描述
出来之后如果都相同那又会如法炮制, 把serial2和nSerial1Hash传入CheckSerial函数进行对比, 如果说一致, 那就代表正确。因为我这里输入的是随机值, 所以自然是不对的, 第一个CheckSerial都过不了。
在这里插入图片描述
所以可以得到结论, 成功的条件就是生成的2个hash值分别与serial1和serial2相等。现在就是要找这两个hash值的生成过程。于是我重新调试程序发现在按下button, button的处理过程还没开始时, 两个hash值就已经生成了。
在这里插入图片描述
而我又发现, 在我输入Name的时候, 这两个值就一直在变动。说明它肯定对按键事件进行捕获并处理。在TForm1中有另一个事件Edit1KeyPress, 很明显就是它了。
在这里插入图片描述
到IDA里面一看, 果然如此, 一切都明了了。
在这里插入图片描述

2. 编写注册机

注册机编写很简单, 直接把这个函数复制下来改一下就行, 下面是核心代码:

DWORD dwHashA = 0;
DWORD dwHashB = 0;

BOOL CKeyGenDlg::CalcHash(char ch, BOOL fShow)
{
    switch (ch)
    {
    case 8:
        dwHashA = 0;
        dwHashB = 0;
        break;
    case 0x41:
        dwHashA += 1064;
        dwHashB += 5648;
        break;
    case 0x42:
        dwHashA += 726576;
        dwHashB += 2;
        break;
    case 0x43:
        dwHashA += 3462;
        dwHashB += 9999;
        break;
    case 0x44:
        dwHashA += 4516;
        dwHashB += 74445628;
        break;
    case 0x45:
        dwHashA += 73482;
        dwHashB += 35644;
        break;
    case 0x46:
        dwHashA += 15554;
        dwHashB += 34328;
        break;
    case 0x47:
        dwHashA += 254376;
        dwHashB += 444444;
        break;
    case 0x48:
        dwHashA += 37348;
        dwHashB += 2615621;
        break;
    case 0x49:
        dwHashA += 27458;
        dwHashB += 3131331;
        break;
    case 0x4A:
        dwHashA += 333476;
        dwHashB += 12121212;
        break;
    case 0x4B:
        dwHashA += 275546;
        dwHashB += 71111;
        break;
    case 0x4C:
        dwHashA += 1834457;
        dwHashB += 76628;
        break;
    case 0x4D:
        dwHashA += 10349;
        dwHashB += 734348;
        break;
    case 0x4E:
        dwHashA += 1025;
        dwHashB += 897376628;
        break;
    case 0x4F:
        dwHashA += 1652;
        dwHashB += 3243223;
        break;
    case 0x50:
        dwHashA += 156;
        dwHashB += 8247348;
        break;
    case 0x51:
        dwHashA += 342;
        dwHashB += 236752;
        break;
    case 0x52:
        dwHashA += 34343;
        dwHashB += 783434;
        break;
    case 0x53:
        dwHashA += 7635344;
        dwHashB += 8734342;
        break;
    case 0x54:
        dwHashA += 42344;
        dwHashB += 78368;
        break;
    case 0x55:
        dwHashA += 87442;
        dwHashB += 12334;
        break;
    case 0x56:
        dwHashA += 7641;
        dwHashB += 7235;
        break;
    case 0x57:
        dwHashA += 15552;
        dwHashB += 323528;
        break;
    case 0x58:
        dwHashA += 9834;
        dwHashB += 732523528;
        break;
    case 0x59:
        dwHashA += 33553;
        dwHashB += 7238;
        break;
    case 0x5A:
        dwHashA += 52763;
        dwHashB += 726628;
        break;
    case 0x61:
        dwHashA += 1063;
        dwHashB += 121;
        break;
    case 0x62:
        dwHashA += 1724;
        dwHashB += 111;
        break;
    case 0x63:
        dwHashA += 1169;
        dwHashB += 738;
        break;
    case 0x64:
        dwHashA += 18253;
        dwHashB += 762;
        break;
    case 0x65:
        dwHashA += 1024;
        dwHashB += 14;
        break;
    case 0x66:
        dwHashA += 1744;
        dwHashB += 13;
        break;
    case 0x67:
        dwHashA += 1661;
        dwHashB += 12;
        break;
    case 0x68:
        dwHashA += 1872;
        dwHashB += 11;
        break;
    case 0x69:
        dwHashA += 1084;
        dwHashB += 99;
        break;
    case 0x6A:
        dwHashA += 1892;
        dwHashB += 888;
        break;
    case 0x6B:
        dwHashA += 192;
        dwHashB += 77;
        break;
    case 0x6C:
        dwHashA += 10109;
        dwHashB += 555;
        break;
    case 0x6D:
        dwHashA += 2078;
        dwHashB += 90;
        break;
    case 0x6E:
        dwHashA += 3591;
        dwHashB += 98;
        break;
    case 0x6F:
        dwHashA += 142;
        dwHashB += 7468;
        break;
    case 0x70:
        dwHashA += 632432;
        dwHashB += 575475;
        break;
    case 0x71:
        dwHashA += 3415;
        dwHashB += 648;
        break;
    case 0x72:
        dwHashA += 24555;
        dwHashB += 538;
        break;
    case 0x73:
        dwHashA += 2224;
        ++dwHashB;
        break;
    case 0x74:
        dwHashA += 1211;
        dwHashB += 64;
        break;
    case 0x75:
        dwHashA += 2242;
        dwHashB += 75;
        break;
    case 0x76:
        dwHashA += 7334;
        dwHashB += 78;
        break;
    case 0x77:
        dwHashA += 9502;
        dwHashB += 5;
        break;
    case 0x78:
        dwHashA += 917;
        dwHashB += 38;
        break;
    case 0x79:
        dwHashA += 11539;
        dwHashB += 8;
        break;
    case 0x7A:
        dwHashA += 6400;
        dwHashB += 456;
        break;
    default:
        dwHashA = 0;
        dwHashB = 0;
        SetDlgItemText(IDC_EDIT_SERIAL1, "");
        SetDlgItemText(IDC_EDIT_SERIAL2, "");
        SetDlgItemText(IDC_EDIT_NAME, "");
        return(FALSE);
    }
    if (fShow)
    {
        SetDlgItemInt(IDC_EDIT_SERIAL1, dwHashA, FALSE);
        SetDlgItemInt(IDC_EDIT_SERIAL2, dwHashB, FALSE);
    }
    
    return(TRUE);
}


void CKeyGenDlg::OnBnClickedBtnGen()
{
	// TODO: 在此添加控件通知处理程序代码
	char szBuf[20] = {0};
	CString strName;
    int iLen = 0;
	// 获取输入的name值
	GetDlgItemText(IDC_EDIT_NAME, strName);
	
	if (strName.IsEmpty())
	{
		MessageBox("Name can't be empty!");
		return;
	}

	strcpy_s(szBuf, sizeof(szBuf), strName.GetBuffer());
	char* pszName = szBuf;
    iLen = strlen(pszName);
	RtlZeroMemory(szBuf + iLen, sizeof(szBuf) - iLen);

    size_t n = 0;
    for (; n < iLen; ++n)
    {
        if (!CalcHash(pszName[n], ((n == (iLen - 1)) ? TRUE : FALSE)))
        {
            SetDlgItemText(IDC_STATIC_STATUS, "Status: Failed");
            break;
        }
    }
    if (n >= iLen)
    {
        SetDlgItemText(IDC_STATIC_STATUS, "Status: Success");
    }
    dwHashA = dwHashB = 0;
}

附上成功截图, 哦, 对了, 记得要输入Name而不是直接复制粘贴, 因为它是根据每次输入进行计算的。还有如果说按了退格(0x8), 那会把Name清空要你重新输。
在这里插入图片描述
(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/842145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提速Rust编译器!

Nethercote是一位研究Rust编译器的软件工程师。最近&#xff0c;他正在探索如何提升Rust编译器的性能&#xff0c;在他的博客文章中介绍了Rust编译器是如何将代码分割成代码生成单元&#xff08;CGU&#xff09;的以及rustc的性能加速。 他解释了不同数量和大小的CGU之间的权衡…

conda 环境 numpy 安装报错需要 Microsoft Visual C++ 14.0

到公司装深度学校环境。项目较旧&#xff0c;安装依赖&#xff0c;一堆报错&#xff08;基于 conda 环境&#xff09;&#xff1a; numpy 安装报需要 C 14.0 No module named numpy.distutils._msvccompiler in numpy.distutils; trying from distutilserror: Microsoft Visu…

高级web前端开发工程师工作的岗位职责(合集)

高级web前端开发工程师工作的岗位职责1 职责&#xff1a; 1、负责产品web端界面设计与用户体验&#xff0c;包括界面操作、用户交互设计; 2、负责基于Html5的web网页前端开发&#xff0c;要求适配主流浏览器; 3、与后端开发工程师合作&#xff0c;高效完成产品模型的展现及交…

MySql009——检索数据:过滤数据(WHERE子句结合AND、OR、IN、NOT操作符使用)

前提&#xff1a;使用《MySql006——检索数据&#xff1a;基础select语句》中创建的products表 一、AND操作符 通过AND操作符可以拼接多个过滤条件&#xff0c;表示且 SELECT vend_id, prod_name, prod_price FROMstudy.products WHEREvend_id 1001 AND prod_price > 3;…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机当前数据吞吐量(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取…

通过WiFi将ESP32与ROS集成

通过WiFi将ESP32与ROS集成 这篇博客介绍如何使用WiFi将ESP32开发板连接到机器人操作系统&#xff08;ROS&#xff09;。 该项目Github: https://github.com/Xiangyu-Fu/ESP32_ROS_wifi先决条件 在我们开始之前&#xff0c;请确保有以下开发环境&#xff1a; Ubuntu 20.04R…

Codejock Skin Framework Visual C++ MFC Crack

Codejock Skin Framework Visual C MFC Crack Codejock Visual CMFC皮肤框架为Windows开发人员提供了一种高度复杂的应用程序皮肤框架技术&#xff0c;该技术是在考虑Windows主题(视觉样式)的情况下开发的。只需几行代码就可以实现一个完全主题化的应用程序。 功能概述 Codejoc…

c++之STL详解

c之STL详解 泛型编程什么是STLSTL发展STL组件容器类型成员适配器STL迭代器STL算法顺序容器向量vector双端队列双端队列实现列表listc关联容器cmapmultimapsetmultiset迭代器函数对象集成函数对象自定义函数对象标准c库中算法STL算法头文件标准函数泛型算法例子自定函数作为算法…

在Linux中安装MySQL

在Linux中安装MySQL 检测当前系统中是否安装MySQL数据库 命令作用rpm -qa查询当前系统中安装的所有软件rpm -qa|grep mysql查询当前系统中安装的名称带mysql的软件rpm -qa | grep mariadb查询当前系统中安装的名称带mariadb的软件 RPM ( Red-Hat Package Manager )RPM软件包管理…

RCS-YOLO快速高精度的用于脑肿瘤检测的目标检测模型学习实践

最近看到了一篇有意思的论文&#xff0c;讲的是开发应用于医疗领域内的肿瘤检测的快速高精度的目标检测模型&#xff0c;论文地址在这里&#xff0c;如下所示&#xff1a; 凭借速度和准确性之间的良好平衡&#xff0c;尖端的YOLO框架已成为最有效的算法之一用于对象检测。然而&…

snmpget 和walk命令

要加.1&#xff0c;才能获取第一行 walk命令&#xff1a;

Python自动化测试框架中如何实现数据参数化?

1.数据参数化介绍 只要你是负责编写自动化测试脚本的&#xff0c;数据参数化这个思想你就肯定会用 &#xff0c;数据参数化的工具你肯定的懂一些 &#xff0c;因为它能大大的提高我们自动化脚本编写效率 。 1.1什么是数据参数化 所谓的数据参数化 &#xff0c;是指所执行的测…

20天学会rust(一)和rust say hi

关注我&#xff0c;学习Rust不迷路 工欲善其事&#xff0c;必先利其器。第一节我们先来配置rust需要的环境和安装趁手的工具&#xff0c;然后写一个简单的小程序。 安装 Rust环境 Rust 官方有提供一个叫做 rustup 的工具&#xff0c;专门用于 rust 版本的管理&#xff0c;网…

java的IO流——File类的实例化和常用方法

File类 File类是一个对象&#xff0c;代表一个文件或者文件目录File类在java.io包下File类中涉及到关于文件或目录的创建、删除、重命名、修改时间、文件大小等方法&#xff0c;并未涉及到写入或读取文件内容的操作&#xff0c;如果需要读取或写入文件内容&#xff0c;必须使用…

Popconfirm气泡确认框(antd-design组件库)简单使用

1.Popconfirm气泡确认框 点击元素&#xff0c;弹出气泡式的确认框。 2.何时使用 目标元素的操作需要用户进一步的确认时&#xff0c;在目标元素附近弹出浮层提示&#xff0c;询问用户。 和 confirm 弹出的全屏居中模态对话框相比&#xff0c;交互形式更轻量。 组件代码来自&…

红队钓鱼技术之自解压钓鱼木马

简介 对于使用自解压文件的场景&#xff0c;攻击者可以创建一个自解压的exe文件&#xff0c;该文件解压后自动执行解压出来的文件。然后&#xff0c;通过插入RLO字符&#xff0c;将这个exe文件伪装成另一种看似安全的文件类型&#xff0c;比如文本文件或图片文件。当用户打开这…

深入探索Python数据容器:绚丽字符串、神奇序列切片与魔幻集合奇遇

一 数据容器&#xff1a;str(字符串) 1.1 字符串初识 字符串也是数据容器的一员&#xff0c;字符串是一种数据容器&#xff0c;用于存储和处理文本数据。字符串是字符的容器&#xff0c;一个字符串可以存放任意数量的字符&#xff0c;可以包含字母、数字、标点符号、空格等字…

24数据结构-图的基本概念与存储结构

目录 第六章 图6.1 图的基本概念知识回顾 6.2 图的储存结构&#xff08;邻接矩阵法&#xff09;1. 数组表示法(1) 有向图&#xff0c;无向图的邻接矩阵 2. 定义邻接矩阵的结构3. 定义图的结构4. 构造图G5. 特点 第六章 图 6.1 图的基本概念 图是一种非线性结构 图的特点&am…

火山对未来气候的影响可能超出标准估计

火山未来释放的二氧化硫可能会高于目前用于气候预测的重建历史水平。 2009 年 6 月&#xff0c;国际空间站上的宇航员拍摄了俄罗斯千岛群岛萨雷切夫火山的大规模喷发。 资料来源&#xff1a;地球物理研究快报 当火山爆发时&#xff0c;它们经常向大气中喷出大量的 二氧化硫。这…

爬虫011_元组高级操作_以及字符串的切片操作---python工作笔记030

获取元组的下标对应的值 注意元组是不可以修改值的,只能获取不能修改 但是列表是可以修改值的对吧