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

news2024/9/26 1:23:27

1. 逆向分析过程

先上手把玩一下, 从外观上看感觉和Chafe.1.exe差不了多少, 还是那个界面
在这里插入图片描述
找到RegisterClassEx从而找到其对应的窗口过程
在这里插入图片描述
找到对应的WM_COMMAND分支
在这里插入图片描述
首先其修改了代码中的4个字节, 将其修改成0x00584554, 然后通过GetDlgItemInt获取了serial值
在这里插入图片描述
这里其实原本就是这个值, 只不过作者为了确保是0x00584554, 再次写入
在这里插入图片描述
获取了输入的serial值后, 将其压入栈内, 接着获取输入的name值, 将name进行hash运算, 最后获取了一个DWORD值, 这里可以看出有Chafe.2.exe的痕迹。其会将name遍历并每次取4个字节与0x58455443进行16次异或操作后, 得到一个hash值。
在这里插入图片描述
接下来他从栈内获取了之前输入的serial值, 并与上一步生成的hash值相加生成了hashX。将hashX与FixCodePlace(也就是直接被修复成0x54, 0x45, 0x58, 0x00的位置, 即0x4012D9)进行异或操作。之后获取了hashX的高位WORD部分并将其与FixCodePlace的低位WORD进行相减。
在这里插入图片描述
来看一下FixCodePlace到底在哪:
在这里插入图片描述
接着作者把从窗口过程函数开始的248个字节(没错, 是代码段内的代码), 每次以4个字节为步长, 一共执行3E次, 将其与0不断的做异或操作, 最终生成的一个值FinalX与0xAFFCCFFB进行比较, 如果相同那就代表是最终的serial key
注意, 这里从从窗口过程函数开始的248个字节中包含了那个FixCodePlace的位置, 因为这里本身就是窗口过程函数, 也就是说这个最终的值FinalX是会随着FixCodePlace的值变动而不停变化的。

整个算法非常清晰, 下面来写注册机

2. 编写注册机

这个注册机的编写重点在于如何倒推回去。首先可以确定的是我们必须要得到FixCodePlace这个FinalX到底是什么, 由于这个FinalX是由窗口过程函数的前248个字节不停的异或取得的。并且异或是具有还原性的, 所以这个值是可以得到的, 首先我们把这窗口过程的248个字节提取出来。并且将FinalX的值全部设置成0(这是为了取消这个值的影响), 进行还原。
在这里插入图片描述
接着编写代码将FinalX的值还原出来, 这里解释一下第123条语句
由于我们的计算机使用的是小端序, 所以高位存放在高地址内存, 低位存放在低地址内存
这里计算FinalX的操作是按照4个字节为1组进行异或的。
这样FinalX的值会被截断, 分成了3字节和1字节, 3字节放在低位内存, 而1字节放在高位内存
我们要将其重新组合并放在一个DWORD里面
所以1字节要放在DWORD的最高位也就是首位, 3字节放在DWORD剩下的3个位置
在这里插入图片描述
完成这一步后就对其进行逆推即可, 首先计算出通过name获取的hash这里取名为NameHash, 原本的逻辑是:

DWORD NameAddSerial = NameHash + Serial;
DWORD FixCodePlace = 0x00584554;
FixCodePlace ^= NameAddSerial;
DWORD dwHighPartOfNameAddSerial = (NameAddSerial >> 0x10);  // 也就是HIWORD(NameAddSerial)
FixCodePlace -= dwHighPartOfnameAddSerial; // 也就是LOWORD(FixCodePlace) -= HIWORD(NameAddSerial)
// 接着计算窗口过程的248字节的hash值获取FinalX

现在我们要把逻辑改一下, 逆推回去最终计算出NameAddSerial这个值, 这个值被计算出来只要再减去NameHash就能求出Serial了

DWORD dwOrginFixCodePlace = 0x00584554;
// 利用异或的还原性, 由于低位值还进行了减法运算, 所以这里先把高位还原
WORD wHighPart = HIWORD(FinalX) ^ HIWORD(dwOrginFixCodePlace);
// 由于有LOWORD(FixCodePlace ) -= HIWORD(NameAddSerial)存在, 所以要加上(因为还原是逆过程)
// 由于NameAddSerial的高位部分我们已经做过还原了也就是wHighPart, 所以可以直接使用
WORD wLowPart = LOWORD(FinalX) + wHighPart;
// 别忘了还有异或还原
wLowPart ^= LOWORD(dwOrginFixCodePlace);
// 然后把这两部分组合到一起, 别忘了减去Serial值, 这就是最终的serial key了
MAKELONG(wLowPart, wHighpart) - NameHash;

在这里插入图片描述
最终核心代码如下:

// 237
BYTE data[248] = {
	0x55, 0x8B, 0xEC, 0x83, 0xC4, 0xFC, 0x8B, 0x45, 0x0C, 0x83, 0xF8, 0x10, 0x75, 0x0D, 0x6A, 0x00,
	0xE8, 0x6B, 0x02, 0x00, 0x00, 0x33, 0xC0, 0xC9, 0xC2, 0x10, 0x00, 0x83, 0xF8, 0x0F, 0x75, 0x0E,
	0x8B, 0x45, 0x08, 0xE8, 0x18, 0x01, 0x00, 0x00, 0x33, 0xC0, 0xC9, 0xC2, 0x10, 0x00, 0x83, 0xF8,
	0x01, 0x75, 0x06, 0x33, 0xC0, 0xC9, 0xC2, 0x10, 0x00, 0x3D, 0x11, 0x01, 0x00, 0x00, 0x0F, 0x85,
	0xE7, 0x00, 0x00, 0x00, 0x8B, 0x45, 0x14, 0x3B, 0x05, 0x60, 0x31, 0x40, 0x00, 0x75, 0x1A, 0x6A,
	0x00, 0x68, 0x96, 0x30, 0x40, 0x00, 0x68, 0xA7, 0x30, 0x40, 0x00, 0xFF, 0x75, 0x08, 0xE8, 0x17,
	0x02, 0x00, 0x00, 0x33, 0xC0, 0xC9, 0xC2, 0x10, 0x00, 0x3B, 0x05, 0x58, 0x31, 0x40, 0x00, 0x74,
	0x0C, 0x3B, 0x05, 0x54, 0x31, 0x40, 0x00, 0x0F, 0x85, 0xAE, 0x00, 0x00, 0x00, 0xC7, 0x05, 0xD9,
	0x12, 0x40, 0x00, 0x54, 0x45, 0x58, 0x00, 0x6A, 0x00, 0x8D, 0x45, 0xFC, 0x50, 0x6A, 0x64, 0xFF,
	0x35, 0x50, 0x31, 0x40, 0x00, 0xE8, 0xBC, 0x01, 0x00, 0x00, 0x83, 0x7D, 0xFC, 0x00, 0x74, 0x5F,
	0x50, 0x6A, 0x14, 0x68, 0x6C, 0x31, 0x40, 0x00, 0xFF, 0x35, 0x54, 0x31, 0x40, 0x00, 0xE8, 0xAF,
	0x01, 0x00, 0x00, 0x85, 0xC0, 0x74, 0x48, 0xA1, 0x0B, 0x30, 0x40, 0x00, 0xBB, 0x6C, 0x31, 0x40,
	0x00, 0x03, 0x03, 0x43, 0x81, 0xFB, 0x7C, 0x31, 0x40, 0x00, 0x75, 0xF5, 0x5B, 0x03, 0xC3, 0x31,
	0x05, 0xD9, 0x12, 0x40, 0x00, 0xC1, 0xE8, 0x10, 0x66, 0x29, 0x05, 0xD9, 0x12, 0x40, 0x00, 0xBE,
	0xEC, 0x11, 0x40, 0x00, 0xB9, 0x3E, 0x00, 0x00, 0x00, 0x33, 0xDB, 0xEB, 0x04, 0x00, 0x00, 0x00, /*Fix Code Place*/
	0x00, /*lodsd*/ 0xAD, 0x33, 0xD8, 0x49, 0x75, 0xFA, 0x81
};

DWORD CalcLostCode()
{
	// 0x54, 0x45, 0x58, 0x00 original
	DWORD dwCompareValue = 0xAFFCCFFB;
	DWORD dwTimes = 0x3E;
	PDWORD pdwCodeBuf = (PDWORD)data;

	do
	{
		dwCompareValue ^= *pdwCodeBuf;
		++pdwCodeBuf;
		--dwTimes;
	} while (dwTimes);
	dwCompareValue = (dwCompareValue >> 8) | (dwCompareValue << 24);

	return(dwCompareValue);
}

DWORD GetSerialKey(LPSTR lpszName, DWORD dwFinalCode)
{
	DWORD dwCipher = 0x58455443;

	for (size_t nIdx = 0; nIdx < 0x10; ++nIdx)
	{
		dwCipher += *(DWORD *)&lpszName[nIdx];
	}

	DWORD dwOriginalCode = 0x00584554;
	WORD wHighPart = HIWORD(dwFinalCode) ^ HIWORD(dwOriginalCode);
	WORD wLowPart = (LOWORD(dwFinalCode) + wHighPart) ^ LOWORD(dwOriginalCode);
	DWORD dwRes = MAKELONG(wLowPart, wHighPart);

	return(MAKELONG(wLowPart, wHighPart) - dwCipher);
}

void CKeyGenDlg::OnBnClickedBtnGen()
{
	// TODO: 在此添加控件通知处理程序代码
	char szBuf[20] = {0};
	int iLen = 0;
	CString strName;

	// 获取输入的name值
	GetDlgItemText(IDC_EDIT_NAME, strName);
	iLen = strName.GetLength();
	if (strName.IsEmpty())
	{
		MessageBox("Name can't be empty!");
		return;
	}
	strcpy_s(szBuf, sizeof(szBuf), strName.GetBuffer());
	char* pszName = szBuf;
	RtlZeroMemory(szBuf + iLen, sizeof(szBuf) - iLen);
	
	DWORD dwVal = CalcLostCode();
	DWORD dwSerialKey = GetSerialKey(szBuf, dwVal);

	SetDlgItemInt(IDC_EDIT_SERIAL, dwSerialKey, FALSE);
}

(完)

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

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

相关文章

笔记20230727

1. http2.0&#xff0c;概念就不说了&#xff0c;查看是否使用&#xff1a;network调试&#xff0c;查看请求的header-view source&#xff0c;可以查看http版本&#xff1b;后端&#xff0c;如nginx&#xff0c;配置&#xff0c;http2表示开启。后端开启、浏览器支持&#xff…

利用小波包对一维信号进行降噪或压缩(MATLAB)

function [ output_args ] example4_12( input_args ) %EXAMPLE4_12 Summary of this function goes here % Detailed explanation goes here clc; clear; % 设置信噪比和随机数的初始值 snr 3; init 2055615866; % 生成一个原始信号xref和含高斯白噪声的信号x [xref,x] …

nginx配置auth_basic认证

nginx配置auth_basic认证 windows 1、下载 httpd 下载地址: https://www.apachelounge.com/download/ 2、生成密码&#xff1a;打开cmd&#xff0c;进入到 Apache24\bin后 html htpasswd.exe -c G:\nginx\nginx-1.14.2\conf\.htpasswd user 其中: G:\nginx\nginx-1.14.2\conf…

【微服务】springboot 多模块打包使用详解

目录 一、前言 1.1 为什么需要掌握多模块打包 二、工程模块概述 2.1 前后端不分离 2.2 部署方式多样化 2.3 单模块向多模块演进 三、单模块打包构建 3.1 环境准备 3.1.1 创建测试用的单模块工程 3.1.2 多环境配置文件 3.1.3 新增测试接口 3.2 pom配置详解 3.2.1 添…

Git代码管理

目录&#xff1a; git环境配置 git工作流程git常用命令gitlab实战gitlog分析与检索分支管理策略git合并与冲突 1.git环境配置 Git 简介&#xff1a; Git 是目前世界上最先进的分布式版本控制系统。Git 优点&#xff1a; 适合分布式开发&#xff0c;强调个体…

搭建自己第一个golang程序

概念&#xff1a; golang 和 java有些类似&#xff0c;配置好环境就可以直接编写运行了&#xff1b;这里分两种&#xff1a; 一.shell模式 创建一个go类型的文件 往里面编写代码 二.开发工具模式 这里的开发工具 我选用goland package mainimport "fmt"func mai…

模糊神经网络机械故障诊断(MATLAB代码)

效果 用训练好的模糊神经网络对机械故障进行诊断,根据网络的预测值得到机械的技术状态。预测值小于 1.5 时为正常状态,预测值在 1.5~2.5 之间时为曲轴轴承轻微异响,预测值在 2.5~3.5 之间时为曲轴轴承严重异响预测值在 3.5~4.5 之间时为连杆轴承轻微异响,预测值大于 4.5 时为连…

Debian LNMP架构的简单配置使用

一、LNMP简介 LinuxNginxMysqlPHP组成的网站架构&#xff0c;常用于中小型网站服务。 二、环境 Debian 6.1.27-1kali1 (2023-05-12) Nginx/1.22.1 10.11.2-MariaDB&#xff08;mysql&#xff09; PHP 8.2.7 &#xff08;Debian 6.1.27包含以上包&#xff0c;直接使用即…

0138 内存管理2

目录 3.内存管理 3.2虚拟内存管理 3.2部分习题 3.内存管理 3.2虚拟内存管理 3.2部分习题 1.在请求分页存储管理中&#xff0c;若采用FIFO页面淘汰算法&#xff0c;则当可供分配的页帧数增加时&#xff0c;缺页中断的次数&#xff08;&#xff09; A.减少 B.增加…

【嵌入式学习笔记】嵌入式基础9——STM32启动过程

1.MAP文件浅析 1.1.MDK编译后生成的中间过程文件 1.2.Map文件构成&#xff1a; 程序段交叉引用关系&#xff08;Section Cross References&#xff09;&#xff1a;描述各文件之间函数调用关系删除映像未使用的程序段&#xff08;Removing Unused input sections from the im…

Linux进程的认识

查看进程指令proc/ps 注意哦, 我们经常使用的指令, 像ls, touch…这些指令在启动之后本质上也是进程 proc 是内存文件系统, 存放着当前系统的实时进程信息. 每一个进程在系统中, 都会存在一个唯一的标识符(pid -> process id), 就如同学生在学校里有一个专门的学号一样. 大…

MyBatis——Java与数据库再续前缘

迭代更新&#xff0c;更新时代 时代发展&#xff0c;发展技术 技术进步&#xff0c;进步迭代 ——Lungcen 目录 MyBatis的简介入门 1、硬编码 2、操作繁琐 MyBatis简单入门 1、处理硬编码 2、处理操作繁琐 3、参数传递 MyBatis核心配置文件 配置文档的顶层结构 环境配置&…

MMsegmentaion自定义数据集运行出错AssertionError: failed to load image

问题 我的数据集中图像是TIF格式&#xff0c;4通道&#xff0c;想用mmsegmentation模型跑一下看看效果&#xff0c;按照官方手册里的方法自定义完数据集后&#xff0c;运行出错&#xff0c;错误截图如下。 解决 1.错误原因 通过上面的截图&#xff0c;发现错误出在红色框框…

vue动态引入静态资源

vue动态引入静态资源 静态资源位置&#xff08;../../assets/piecture/page404.jpg&#xff09;或者&#xff08;/assets/piecture/page404.jpg&#xff09; 错误引入方式 错误引入方式&#xff08;一&#xff09; <template><div><img :src"../../asset…

Spark-hadoop集群中8020:Connection refused

一、使用CentOs7虚拟机运行spark案例报出8020端口出现错误 前提条件&#xff0c;使用standalone模式下的Spark&#xff0c;使用spark-shell运行example中的相关测试案例spark-examples_2.12-3.0.0.jar&#xff0c;来计算pi。当spark-shell 停止掉后&#xff0c;集群监控base:40…

macos下安装john the ripper并配置zip2john+破解加密zip文件

为了破解加密的zip文件&#xff0c;需要用到john进行爆破密码。 1、首先使用homebrew安装john&#xff0c;可以安装它的增强版john-jumbo: brew install john-jumbo 2、安装后可以使用 john 命令验证&#xff1a; john 3、配置zip2john的环境——.zshrc下&#xff0c;&#x…

Linux Mint 21.2 ISO 镜像开放下载

导读Linux Mint 21.2 ISO 镜像于 2023 年 6 月 21 日公测&#xff0c;开发者在这段时间内收集并修复了用户反馈的诸多问题。 代号为“Victoria”的 Linux Mint 21.2 ISO 镜像于今天正式开放下载&#xff0c;新版本基于 Ubuntu 22.04 LTS&#xff0c;提供 Cinnamon 5.8、Xfce 4.…

CNN卷积详解

转载自&#xff1a;https://blog.csdn.net/yilulvxing/article/details/107452153 仅用于自己学习过程中经典文章讲解的记录&#xff0c;防止原文失效。 1&#xff1a;单通道卷积 以单通道卷积为例&#xff0c;输入为&#xff08;1,5,5&#xff09;&#xff0c;分别表示1个通道…

Flutter 添加 example流程

一、已有Flutter工程&#xff08;命令&#xff09;添加 example 1、cd 工程(flutter_plugin ,是自己创建的)根目录 例: flutter create example 执行命令创建example PS&#xff1a;cd example 后执行flutter doctor 后就可以看到效果 2、如果需要指定iOS/Android 语言,请添加…

从0到1,无代码开发如何简化产品创新流程

在当今竞争激烈的市场环境中&#xff0c;产品创新已经成为企业成功的关键因素之一。为了在市场上保持竞争力&#xff0c;企业需要不断地推出新产品或改进现有产品。然而&#xff0c;传统的开发流程往往耗时费力&#xff0c;且成本高昂。因此&#xff0c;简化产品创新流程成为了…