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

news/2024/4/24 4:39:19/

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.ppmy.cn/news/1012558.html

相关文章

C语言--strcmp ,stmcmp(比较)

两个字符串进行比较&#xff0c;相等为0 字符串比较 strcmp 原型int strcmp(const chars1,const chars2) 若str1str2&#xff0c;则返回零&#xff1b; 若str1<str2,则返回负数&#xff1b; 若str1>str2,则返回正数 strncmp 原型int strncmp(const chars1,const chars2,…

map 比较(两个map的key,value 是否一样)

1. 用equals 比较 public static void main(String[] args) {List<Map<String,Object>> list new ArrayList<>();Map<String,Object> map1 new HashMap<>();map1.put("name","郭");map1.put("objId","1&quo…

白盒测试怎么做

一、什么是白盒测试 白盒测试又称结构测试、逻辑驱动测试或基于代码的测试。 白盒测试是一种测试用例设计方法&#xff0c;盒子指的是被测试的软件&#xff0c;白盒指的是盒子是可视的&#xff0c;即清楚盒子内部的东西以及里面是如何运作的。 "白盒"法需要测试者…

[C++项目] Boost文档 站内搜索引擎(4): 搜索的相关接口的实现、线程安全的单例index接口、cppjieba分词库的使用、综合调试...

有关Boost文档搜索引擎的项目的前三篇文章, 已经分别介绍分析了: 项目背景: &#x1fae6;[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍…文档解析、处理模块parser的实现: &#x1fae6;[C项目] Boost文档 站内搜索引擎(2): 文档文本解析模块…

收藏这8个好用的原型设计工具,轻松制作原型图

在设计工作中&#xff0c;原型设计是非常关键的一步&#xff0c;而原型设计工具又能帮助设计师更轻松地完成设计工作。今天本文将与大家分享8个好用的原型设计工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一个能在线协作的原型工具&#xff0c;也就是说…

面试热题(滑动窗口最大值)

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输出&#xff1a;[3,3,5,…

Operator 开发实践 二 (定义API对象)

需求说明 上一篇文章我们介绍了operator的基础内容&#xff0c;我们继续梳理一下我们的需求来编写operator 我们的需求很简单&#xff0c;创建一个Deployment随后再创建一个service代理pod的端口&#xff0c;增加过滤调谐事件&#xff0c;webhook用来进行访问控制 怎么样&am…

Centos更换网卡名称为eth0

Centos更换网卡名称为eth0 已安装好系统后需要修改网卡名称为eth0 编辑配置文件将ens33信息替换为eth0,可在vim命令模式输入%s/ens33/eth0/g替换相关内容 修改内核文件,添加内容:net.ifnames=0 biosdevname=0 [root@nova3 ~]# vim /etc/default/grub 使用命令重新生成g…

真的不想知道录音转文字怎么弄才简单吗

哇哦&#xff01;听说你想知道如何将录音转成文字&#xff1f;这简直是一个超酷的技能&#xff0c;让我来为你揭开这个神奇的面纱吧&#xff01;想象一下&#xff0c;当你有一堆录音文件需要处理时&#xff0c;你不再需要费尽心思地一遍遍倾听、抄写。现在&#xff0c;你只需要…

C++网络编程Reactor模式介绍

Reactor模式是一种事件驱动的设计模式,主要用于处理服务请求,这些请求在一开始并不知道何时会到达。它是一种非阻塞I/O模式,可以处理大量并发连接,因此在网络编程中被广泛使用。 Reactor模式的主要组件包括: Reactor:这是事件循环的主体,负责监听和分发事件。它会不断地…

path.join()及path.resolve()区别

path.join只是简单的将路径片段进行拼接&#xff0c;并规范化生成一个路径&#xff0c;而path.resolve则一定会生成一个绝对路径&#xff0c;相当于执行cd操作&#xff0c;与cd操作不同的是&#xff0c;这些路径可以是文件&#xff0c;并且可不必实际存在。 “平台特定的分隔符…

秋招算法备战第39天 | 62.不同路径、63. 不同路径 II

62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 按照动态规划五部曲走&#xff0c;非常清晰 class Solution:def uniquePaths(self, m: int, n: int) -> int:dp [[0 for _ in range(n)] for _ in range(m)]for i in range(m):dp[i][0] 1for j in range(n):dp[0][…

windows永久关闭更新

不要去services.msc 服务里面关闭windowUpdata了&#xff0c;对win11和部分win10根本不管用&#xff0c;下面在教你一招永久关闭&#xff08;原理不是关闭&#xff0c;只是延长更新时间&#xff0c;时间可以设置百年后&#xff0c;所以和关闭差不多&#xff09; windows图形化…

GLTF在线场景编辑工具

推荐&#xff1a;使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 以下是Babylon.js Sandbox的主要功能和特点&#xff1a; 1、创建和编辑场景&#xff1a;Babylon.js Sandbox允许用户在一个交互式的3D环境中创建和编辑glTF场景。您可以添加不同类型的物体、调整其位置…

【Spring】Bean的作用域和生命周期

目录 一、引入案例来探讨Bean的作用域 二、Bean的作用域 2.1、Bean的6种作用域 2.2、设置Bean的作用域 三、Spring的执行流程 四、Bean的声明周期 1、生命周期演示 一、引入案例来探讨Bean的作用域 首先我们创建一个User类&#xff0c;定义一个用户信息&#xff0c;在定义…

21、p6spy输出执行SQL日志

文章目录 1、背景2、简介3、接入3.1、 引入依赖3.2、修改database参数&#xff1a;3.3、 创建P6SpyLogger类&#xff0c;自定义日志格式3.4、添加spy.properties3.5、 输出样例 4、补充4.1、参数说明 1、背景 在开发的过程中&#xff0c;总希望方法执行完了可以看到完整是sql语…

【手撕C语言】多线程

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言,Linux基础,ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的一句鸡汤&#x1f914;&…

对比TargetNetwork 和 Double DQN

1、Double DQN算法&#xff1a; Selection using DQN&#xff1a; a ⋆ argmax ⁡ a Q ( s t 1 , a ; w ) . a^{\star}\operatorname*{argmax}_{a}Q(s_{t1},a;\mathbf{w}). \\ a⋆aargmax​Q(st1​,a;w). Evaluation using target network: y t r t γ ⋅ Q ( s t 1 , …

【代码随想录-Leetcode第二题:27.移除元素】

题目&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组…

VB+SQL采购管理系统设计与实现

摘 要 本系统是基于为轴承企业采购部门开发的系统。课题主要采用自上而下的结构化程序设计方法与面向对象方法相结合的方法,致力于达到标准的现代化物流管理要求。帮助轴承企业采购部门全面实现电子化、自动化、标准化的现代化先进管理模式。 该系统使用Visualbasic.net编程…