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

news2024/9/22 15:37:09

1. 逆向工程

这个版本连一个注册界面也没有
在这里插入图片描述
进去一看, 他打开了一个CRACKME32.KEY, 估计里面就是放key的, 于是我随便写了一些数字进去
在这里插入图片描述
从CRACKME32.KEY中读取18个字节, 然后确认读取是否成功, 可见密码是18字节, 回去把密码长度改成18在重新调试
在这里插入图片描述
接着把key值输入CalcHash函数内计算一个FinalHash值, 在将其与0x12345678进行异或
在这里插入图片描述
其中hash计算的算法也非常简单, 从’A’开始与key进行异或加密操作, 每次key往前挪动1位, 'A’也自增1,每一位都累加到FinalHash中, 进行14次操作, 保留剩下4位, 最终获取结果后返回与x012345678进行异或
在这里插入图片描述
把生成的FinalHash值作为参数传入
在这里插入图片描述
获取字符串的最后4位
在这里插入图片描述
把字符串最后4位和FinalHash进行对比, 如果一样, 那就代表成功否则失败。
在这里插入图片描述

2. 注册机编写

编写思路是首先随机生成14位字符串, 然后将其用crackme的hash算法进行计算后生成FinalHash, 将这生成的FinalHash拼接在最后即可
核心代码:

VOID GenRandom(LPSTR* ppRandomStr, DWORD dwRandomStrLen)
{
	CHAR szHashTbl[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	srand((UINT)time(NULL));
	LPSTR pRandomStr = nullptr;

	pRandomStr = (LPSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwRandomStrLen + 1);
	if (!pRandomStr)
	{
		AfxMessageBox("Failed to gen key!");
		return;
	}
	for (size_t nIdx = 0; nIdx < dwRandomStrLen; ++nIdx)
	{
		pRandomStr[nIdx] = szHashTbl[rand() % (sizeof(szHashTbl) - 1)];
	}
	*ppRandomStr = pRandomStr;
}

void CKeyGenDlg::OnBnClickedBtnGen()
{
	// TODO: 在此添加控件通知处理程序代码
	DWORD dwFinalHash = 0;
	CHAR ch = 'A';
	CHAR szCrypto = 0;
	LPSTR pszKey = nullptr;
	HANDLE hFile = INVALID_HANDLE_VALUE;
	DWORD dwWritten = 0;
	BOOL fOk = FALSE;

	__try
	{
		GenRandom(&pszKey, 0x12);
		
		for (size_t nIdx = 0; nIdx < 0xE; ++nIdx)
		{
			szCrypto = pszKey[nIdx] ^ ch;
			++ch;
			dwFinalHash += szCrypto;
		}
		dwFinalHash ^= 0x12345678;
		RtlCopyMemory((pszKey + 0xE), &dwFinalHash, 4);
		hFile = CreateFile("CRACKME3.KEY",
			GENERIC_READ | GENERIC_WRITE,
			FILE_SHARE_READ | FILE_SHARE_WRITE,
			NULL,
			CREATE_ALWAYS,
			FILE_ATTRIBUTE_NORMAL,
			NULL);
		if (INVALID_HANDLE_VALUE == hFile)
		{
			__leave;
		}
		SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
		fOk = WriteFile(hFile, pszKey, 0x13, &dwWritten, NULL);
		if (fOk && dwWritten == 0x13)
		{
			SetDlgItemText(IDC_STATIC_STATUS, "Status:Success");
		}
		else
		{
			SetDlgItemText(IDC_STATIC_STATUS, "Status:Failed");
		}
	}
	__finally
	{
		if (pszKey)
		{
			HeapFree(GetProcessHeap(), 0, pszKey);
			pszKey = nullptr;
		}
		if (hFile != INVALID_HANDLE_VALUE)
		{
			CloseHandle(hFile);
			hFile = INVALID_HANDLE_VALUE;
		}
	}
}

结果如下:
在这里插入图片描述
(完)

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

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

相关文章

AMEYA:尼得科科宝滑动型DIP开关CVS产品参数及价格​

日本电产尼得科科宝滑动型DIP开关CVS采用紧凑设计&#xff0c;3bit产品&#xff0c;旋钮把手高度为0.2mm&#xff0c;操作性良好端子为1mm间距&#xff0c;电路数丰富(2,3,4,8)端接样式为鸥翼式&#xff0c;J形引线使用树脂材料符合UL认证94V-0 符合RoHS规范。 日本电产尼得科科…

11-矩阵的运算_加减法_数乘_转置

矩阵的运算 加法&#xff0c;数乘&#xff0c;减法&#xff0c;转置 矩阵的加减 矩阵的加法就是矩阵的对应位置相加&#xff0c;减法也是一样就是对应位置相减 数乘 转置 转置的操作和向量是一样的&#xff0c;就是把 aij 变成 aji&#xff0c;把行和列互换一下 对于矩阵而…

【低代码开发】:探索应用开发的未来趋势

低代码开发&#xff1a;加速应用开发的未来趋势 引言什么是低代码以及功能特点&#xff1f;什么是低代码开发&#xff1f;低代码平台的特点和功能低代码平台的应用场景和优势低代码的优点低代码的缺点低代码平台项目开发流程选择和实施低代码平台 低代码未来的发展趋势低代码平…

vue - 【完整源码】实现评论区发表评论、回复评论、评论盖楼等功能,前端PC网站/移动端H5实现多用户评论与回复功能(详细示例源码,一键复制开箱即用)

效果图 在vue项目开发中,实现一个类似社交软件的评论区发表留言及回复等评论功能效果,可以无限回复盖楼。 一、功

视频传输网安全防护体系

在电脑、手机信息安全保护得到广泛关注和普及的今天&#xff0c;监控摄像头等设备的安全防护仍为大众所忽略&#xff0c;大量视频监控网络的前端设备和数据没有任何保护&#xff0c;完全暴露在互联网中。 前端IP接入设备与后端业务系统处于直连状态&#xff0c;一旦有攻击者或…

点播播放器如何自定义额外信息(统计信息传值)

Web播放器支持设置观众信息参数&#xff0c;设置后在播放器上报的观看日志中会附带观众信息&#xff0c;这样用户就可以通过管理后台的统计页面或服务端API来查看特定观众的视频观看情况了。 播放器设置观众信息参数的代码示例如下&#xff1a; <div id"player"…

【100天精通python】Day20:文件及目录操作_os模块和os.psth模块,文件权限修改

目录 专栏导读 1 文件的目录操作 os模块的一些操作目录函数​编辑 os.path 模块的操作目录函数 2 相对路径和绝对路径 3 路径拼接 4 判断目录是否存在 5 创建目录、删除目录、遍历目录 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12…

C++模拟操作系统睡眠机制

在系统中定义一个变量bHiberable&#xff0c;如果是3分钟内休眠&#xff0c;那么每隔3分钟检测一次这个变量&#xff0c;如果为真&#xff0c;则进入睡眠&#xff0c;如果是假&#xff0c;就把这个标志设置为真。继续等待和检测。 程序阻止操作系统休眠的办法&#xff1a;操作…

Git 一篇文章搞懂git (万字长文)

索引 一. Git初识1.提出问题2.什么是版本控制器3.git安装 二. git本地仓库基本操作1.Git本地仓库相关命令2.认识工作区&#xff0c;暂存区&#xff0c;版本库3.第一次Git追踪管理文件4.**有关于打印提交日志的命令**5.验证.git文件的指针指向6.Git管理的再理解——修改7.版本回…

shell 脚本 if 判断使用方法

例如 1&#xff1a; shell if判断条件使用-n参数的使用 if [ -n $1 ] 当str非空的时候&#xff0c;为true if [[ -n $1 ]];then app_version$1 fi $1 不管我们是否传入参数&#xff0c;都是输出app_version$1 这行&#xff0c;也就是结果一直为true 例如 2&#xff1a; net…

CASS7.0裁剪面域图形

1、打开CASS7.0&#xff0c;绘制一个线状闭合图形&#xff0c;如下&#xff1a; 2、然后填充该线状地物&#xff0c;并删除线状地物&#xff0c;仅留下填充好的面域图形。如下&#xff1a; 3、恢复面域图形的边界线&#xff08;选中面域后&#xff0c;鼠标左键双击&#xff0c;…

Pytorch基础

文章目录 一、Pytorch简介二、安装2.1 安装GPU环境2.2 安装Pytorch2.3 测试 三、Tensor3.1 Tensor创建3.1.1 torch.tensor() && torch.tensor([])3.1.2 torch.randn && torch.randperm3.1.3 torch.range(begin,end,step)3.1.4 指定numpy 3.2 Tensor运算3.2.1 A…

mysql 非definer用户如何查看存储过程定义

当我们创建存储过程时&#xff0c;如果没有显示指定definer&#xff0c;则会默认当前用户为该sp的definer&#xff0c;如果没有相关授权&#xff0c;则其他用户是看不了这个sp的。 比如用户zhenxi1拥有如下权限&#xff1a; 它拥有对dev_nacos库的查询权限&#xff0c;这个时候…

流程节点图形变化

一、背景 &#xff08;1&#xff09;流程节点为矩形&#xff0c;只有上下左右四个连接点。 &#xff08;2&#xff09;支持移动&#xff0c;放大缩小&#xff0c;连接线。 二、需求 &#xff08;1&#xff09;流程节点支持图形变化。 &#xff08;2&#xff09;支持节点边框…

第7期ThreadX视频教程:如何实现RTOS高效的任务管理,抢占式调度,时间片调度和零中断延迟(2023-07-31)

视频教程汇总帖&#xff1a;https://www.armbbs.cn/forum.php?modviewthread&tid110519 本期视频为大家分享高效的RTOS任务管理设计&#xff0c;通过这个点来引出抢占式调度&#xff0c;时间片调度&#xff0c;任务优先级设置和零中断延迟。 RTOS任务高效管理是我们使用R…

吃透《西瓜书》第四章 决策树定义与构造、ID3决策树、C4.5决策树、CART决策树

目录 一、基本概念 1.1 什么是信息熵&#xff1f; 1.2 决策树的定义与构造 二、决策树算法 2.1 ID3 决策树 2.2 C4.5 决策树 2.3 CART 决策树 一、基本概念 1.1 什么是信息熵&#xff1f; 信息熵: 熵是度量样本集合纯度最常用的一种指标&#xff0c;代表一个系统中蕴…

Python小红书旋转验证码识别

本周免费接了一个用户的需求&#xff0c;研究了一下小红书旋转验证码。刚开始小瞧了它&#xff0c;觉得它应该没有百度旋转验证码那么难&#xff0c;毕竟图像没有干扰&#xff0c;需要的训练样本就可以很少。然而事情并没有这么简单&#xff0c;所以记录一下。 首先看一下最终…

代码随想录算法训练营第二天| 977. 有序数组的平方y,螺旋矩阵 II,209. 长度最小的子数组

977. 有序数组的平方y 思路&#xff0c;原数组是有序的&#xff0c;但是因为负数平方后可能变无序了&#xff0c;因此利用双指针遍历原数组&#xff0c;比较 nums[left]*nums[left]和nums[right]*nums[right]谁更大&#xff0c;然后对新数组赋值 class Solution {public int…

uni-table行点击事件

uni-app 如何点击表格的行跳转到对应的页面 找到uni-ui的源码&#xff0c;在源码里面绑定事件 用$emit发射事件 在你使用了uni-table的组件中接受改事件 然后绑定调用成功