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

1. 脱壳过程

这个crackme有2个文件
在这里插入图片描述
发现加了壳
在这里插入图片描述
先来脱壳, 使用ESP守恒, pushad后立马下硬件访问断点
在这里插入图片描述
F9直接运行, 立马到popad处
在这里插入图片描述
接着走几步就到了OEP
在这里插入图片描述
下面使用LordPE来转储映像, 为了防止别人修改PE中的ImageSize, 先尝试修正下ImageSize, 然后dump full即可
在这里插入图片描述
在这里插入图片描述
接着用x64dbg调试器重新打开dump后的文件, 准备修复入口点和IAT表, 在这之前往内存里瞄了一眼, 发现主模块的PE头部被设置了只读属性, 首先先将其改成可读写
在这里插入图片描述
在这里插入图片描述
这样就舒服多了
在这里插入图片描述
使用ImportREC打开当前被调试的进程, 并且修改OEP为之前脱壳后第一句代码的RVA地址,注意, 这个地址要减去ImageBase才是RVA地址, 接着选择IAT自动搜索, 如果没什么问题会弹出如下弹框
在这里插入图片描述
然后选择获取导入表, 即可发现该exe所导入的模块, 并且其后面都是有效
在这里插入图片描述
最后选择修正转储选择要修正的转储文件即可
在这里插入图片描述

2. 逆向分析过程

这个程序比较简单, 作者的目的估计主要是为了让我们练习脱壳。脱完壳后, 再次调试就发现图片变成了CRACKED
在这里插入图片描述
但是不进行调试的状态, 就会显示是LOCKED状态
在这里插入图片描述
这里先解决这个问题, 让它永远变成cracked状态, 可以确定的是, 他做这些事肯定是在WM_INITDIALOG中的,因为在程序运行的过程中是没有任何变化, 定位WndProc然后找到WM_INITDIALOG后重新跑
在这里插入图片描述
可以看到了关键API LoadBitmapA
在这里插入图片描述
使用Resource hacker查看一下程序有什么bitmap资源, Ooops, 找到了这张图片的资源ID是101, 十六进制是0x65
在这里插入图片描述
这里圈出来的call决定了最终你将选择哪张图片
在这里插入图片描述
里面是把0x401000和0x402000处的代码计算哈希然后运算决定的, 很明显脱壳会对这个造成影响
在这里插入图片描述
这里直接选择进行爆破, 直接把0x65传入LoadBitmapA中
在这里插入图片描述
好了, 这样永远就是cracked的状态了。
在这里插入图片描述
下面继续进行破解, 运行以下后发现Register按钮是被禁用的, 尝试搜索以下EnableWindow这个API, 定位到该位置后发现上方还有2个GetDlgItemText, 很明显是为了获取name和输入的key的。在EnableWindow上面还有一个call应该就是key的生成算法
在这里插入图片描述
随便进行了一次测试, 由于这里要求密码必须是8位, 所以首先我把密码设置成8位, 这样方便调试Key运算的部分
在这里插入图片描述
这个函数最终会返回eax, 也就是说如果eax为1, 那么EnableWindow就会激活Register按钮, 那也就能顺利注册, 否则就不行
在这里插入图片描述
再看以下Key运算部分, 这里是一个jne循环, 如果ecx不为4就会循环满足某个条件会让ecx增加1, 只有ecx为4才是正确的serial
在这里插入图片描述
这里经过红色框部分的运算后, 满足2个橘色框的条件则ecx有机会增加1,经过4次判断都满足条件key即为正确
在这里插入图片描述

3. 编写注册机

这个注册机编写很容易, 为了躲避使用ror之类的带进位指令, 我直接使用了内联汇编来编写
在这里插入图片描述
下面放出核心代码:

BOOL GetSerialKey(LPCSTR pszName, LPSTR pszKeyBuf, DWORD nKeyBufSize)
{
	int iNameLen = 0;
	DWORD dwFix = 0x44414D4E;
	DWORD dwTmp = 0;
	CHAR cch = 0;
	int iKeyLen = 0;
	int iPtr1 = 1;
	int iPtr0 = 0;

	if (!pszName || !pszKeyBuf || nKeyBufSize < 9)
	{
		return(FALSE);
	}

	iNameLen = strlen(pszName);
	if (!iNameLen)
	{
		return(FALSE);
	}

	for (size_t nIdx = 0; nIdx < iNameLen; ++nIdx)
	{
		cch = pszName[nIdx];
		dwTmp += cch;
		__asm
		{
			push eax
			push ecx
			xor ecx, ecx
			mov cl, byte ptr [nIdx]
			ror dword ptr[dwFix], 1
			ror dword ptr[dwFix], cl
			pop ecx
			pop eax 
		}
		dwFix ^= dwTmp;
	}
	dwFix |= 0x10101010;
	
	for (size_t nIdx = 0; nIdx < 4; ++nIdx)
	{
		__asm
		{
			push eax 
			xor eax, eax
			rol dword ptr[dwFix], 8
			mov al, byte ptr[dwFix]
			mov cch, al

			mov byte ptr[dwTmp], al
			and cch, 0xF
			shr byte ptr[dwTmp], 4
			and byte ptr[dwTmp], 0xF
			cmp cch, 0xA
			sbb cch, 0x69
			mov al, cch
			das
			mov cch, al
		}
		pszKeyBuf[nIdx * 2 + 1] = cch;
		__asm
		{
			mov al, byte ptr[dwTmp]
			mov cch, al
			cmp cch, 0xA
			sbb cch, 0x69
			mov al, cch
			das 
			mov cch, al
			pop eax 
		}
		pszKeyBuf[nIdx * 2] = cch;
	}

	return(TRUE);
}

(完)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于一致性引导的元学习bootstraping半监督医学图像分割

文章目录 Consistency-guided Meta-Learning for Bootstrapping Semi-Supervised Medical Image Segmentation摘要本文方法实验结果 Consistency-guided Meta-Learning for Bootstrapping Semi-Supervised Medical Image Segmentation 摘要 医学成像取得了显著的进步&#xf…

Visual C++中的虚函数和纯虚函数(以外观设计模式为例)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来说说Visual C中的虚函数和纯虚函数。该系列帖子全部使用我本人自创的对比学习法。也就是当C学不下去的时候&#xff0c;就用JAVA实现同样的代码&#xff0c;然后再用对比的方法把C学会。 直接说虚函数…

618,你会入手哪些书?【文末送书】

好书分享 前沿技术人工智能半导体新一代通信与信息技术网络空间安全参与规则 一年一度的618又到啦&#xff01;今年的618就不要乱买啦&#xff0c;衣服买多了会被淘汰&#xff0c;电子产品买多了会过时&#xff0c;零食买多了会增肥&#xff0c;最后怎么看都不划算。可是如果你…

Visual Studio 2022 程序员必须知道高效调试手段与技巧(下)终章

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 一些调试的实例&#x1f4ad; 实例一&#x1f4fa; 调试演示 &#x1f4ad; 实…

使用Jetpack Compose和Motion Layout创建交互式UI

使用Jetpack Compose和Motion Layout创建交互式UI 通过阅读本博客&#xff0c;您将学会使用Motion Layout实现这种精致的动画效果&#xff1a; 让我们从简单的介绍开始。 介绍 作为Android开发者&#xff0c;您可能会遇到需要布局动画的情况&#xff0c;有时甚至需要变形样…

JDK17 中的新特性初步了解

1. Switch 语句的增强 jdk12 &#xff0c;switch语句不用写break了&#xff0c;直接写箭头和对应的值。 jdk 17中&#xff0c; 加了一个逗号&#xff0c;用于匹配多对一。 如果要在每个case里写逻辑&#xff0c;可以写在花括号里。 在返回值的前面加上yield的关键字。 也可以对…

【雕爷学编程】MicroPython动手做(11)——搭建掌控板IDE开发环境四种

为了能够打好基础&#xff0c;系统学习MicroPython&#xff0c;特地入手了二块掌控板 知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通…

技术复盘(5)--git

技术复盘--git 资料地址原理图安装配置基本命令分支命令对接gitee练习:远程仓库操作 资料地址 学习地址-B站黑马&#xff1a;https://www.bilibili.com/video/BV1MU4y1Y7h5 git官方&#xff1a;https://git-scm.com/ gitee官网&#xff1a;https://gitee.com/ 原理图 说明&am…

文件系统总结

《本文件系统默认linux文件系统》 一、文件系统基本概念 文件系统是操作系统中负责存取和管理信息的模块&#xff0c;它用统一的方式管理用户和系统信息的存储、检索、更新、共享和保护&#xff0c;并为用户提供一整套方便有效的文件使用和操作方法文件系统是操作系统中管理文…

C++笔记之vector的reserve()和capacity()用法

C笔记之vector的reserve()和capacity()用法 code review! 代码 #include <vector> #include <iostream>int main() {std::vector<int> myVector;std::cout << "Current size: " << myVector.size() << std::endl;std::cout …

SpringBoot使用jetty和tomcat还有undertow以及ssl配置支持https请求

一般使用SpringBoot开发应用程序都是使用的tomcat 稍微注意点性能就使用undertow&#xff0c;配置支持https请求常用nginx来做代理&#xff0c;直接用SpringBoot配置还是很少的&#xff0c;八成用不到&#xff0c;就怕需要用到的时候又不能及时弄出来&#xff0c;于是记录一下。…

Service Mesh之Istio部署bookinfo

给istio部署插件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 rootk8s-master01:/usr/local# cd istio rootk8s-master01:/usr/local/istio# ls samples/addons/ extras grafana.yaml jaeger.yaml kiali.yaml prometheus.yaml RE…

个人博客系统 -- 博客列表页删除Markdown字符

之前的博客系统的列表页会有在markdown编辑器中的特殊字符,比如标题的字符#之类的,在列表页进行展示的时候,我们需要将这些字符进行筛选. 对这些字符进行筛选,我们可以通过排设计正则表达式进行筛选,也可以使用组件的方式进行筛选.下面我来总结一下,使用组件的方式进行筛选. 这…

rcu链表综合实践

基础知识 rcu-read copy update的缩写。和读写锁起到相同的效果。据说牛逼一点。对于我们普通程序员&#xff0c;要先学会使用&#xff0c;再探究其内部原理。 链表的数据结构&#xff1a; struct list_head {struct list_head *next, *prev; };还有一种&#xff1a;struct h…

Codeforces Round 888 (Div. 3)(视频讲解全部题目)

[TOC](Codeforces Round 888 (Div. 3)&#xff08;视频讲解全部题目&#xff09;) Codeforces Round 888 (Div. 3)&#xff08;A–G&#xff09;全部题目详解 A Escalator Conversations #include<bits/stdc.h> #define endl \n #define INF 0x3f3f3f3f using namesp…

第四章 网络层

第四章 网络层 4.1 网络层提供的两种服务 ​ 网络层关注的是如何将分组从源端沿着网络路径送达目的端。在计算机领域&#xff0c;网络层应该向运输层提供怎样的服务&#xff08;“面向连接”还是“无连接”&#xff09;曾引起长期的争论。争论的实质就是&#xff1a;在计算机通…

flex盒子 center排布,有滚动条时,拖动滚动条无法完整显示内容

文章目录 问题示例代码解决问题改进后的效果 问题 最近在开发项目的过程中&#xff0c;发现了一个有趣的事情&#xff0c;与flex盒子有关&#xff0c;不知道算不算是一个bug&#xff0c;不过对于开发者来说&#xff0c;确实有些不方便&#xff0c;感兴趣的同学不妨也去试试。 …

ShardingSphere-Proxy绑定表与广播表详解与实战

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

A Deep Framework for Hyperspectral Image Fusion Between Different Satellites

1.摘要 最近&#xff0c;将低分辨率高光谱图像&#xff08;LR-HSI&#xff09;与不同卫星的高分辨率多光谱图像&#xff08;HR-MSI&#xff09;融合已成为提高HSI分辨率的有效方法。然而&#xff0c;由于不同的成像卫星、不同的照明条件和相邻的成像时间&#xff0c;LR-HSI和H…

iOS开发-下拉刷新动画loading旋转指示器动画效果

iOS开发-下拉刷新动画loading旋转指示器动画效果 之前开发中实现下拉刷新动画loading旋转指示器动画效果 一、效果图 二、基础动画 CABasicAnimation类的使用方式就是基本的关键帧动画。 所谓关键帧动画&#xff0c;就是将Layer的属性作为KeyPath来注册&#xff0c;指定动画…
最新文章