x64dbg破解一个简单的Demo教程

本文介绍了如何分析并破解一个简单的C++程序,通过使用x64dbg调试器寻找关键代码段,设置断点,并修改跳转地址以实现密码验证的绕过。通过对字符串比较和循环逻辑的解析,展示了代码调试的基本流程和思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码分析

首先需要破解的程序源码

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <stdint.h>
#include <stdlib.h>


void main()
{
	while (true)
	{
		std::cout << "请输入密码:" << std::endl;
		std::string inputString;
		std::cin >> inputString;
		if (strcmp(inputString.c_str(),"qwe") == 0)
		{
			std::cout << "密码正确" << std::endl;
		}
		else
		{
			std::cout << "密码错误" << std::endl;
		}
	}
}

源码很简单 循环输入,如果输入qwe则输出密码正确,其他则输出密码错误

打开x64dbg 打开exe程序,单击右键,搜索->所有模块->字符串

 找到密码错误行

点击右键 在反汇编中转到

 

 可以转到EC11DD部分

 可以看到00007FF61FEC11CC 行有一句代码 jne dump.7FF61FEC11DD 说明是进入了错误判断,跳转到错误逻辑代码,可以在00007FF61FEC11CC 出F2打断点进行调试流程

一些代码流程说明

 00007FF61FEC11BE  mov rax,rbp [rax清0]

这里rax寄存器主要做比较字符串个数计数,比如密码是qwe所以比较的计数是4  qwe(3)加上一个\0 = 4

所以在00007FF61FEC11CE cmp rax,4 处有一个比较rax个数的判断

每一次循环比较strcmp时

00007FF61FEC11C5   inc rax  [rax 计数增加1]

每一个字符比较

00007FF61FEC11C8 cmp cl,byte ptr ds:[rsi+rax-1]  | 字符串和密码qwe做比较,一个字节一个字节的比较

00007FF61FEC11CC jne dump.7FF61FEC11DD  如果某一个字符比较失败,则字节跳转到失败地址7FF61FEC11DD

00007FF61FEC11CE cmp rax,4  比较成功的字符个数  小于4(qwe加\0) 在跳转到7FF61FEC11C1开始比较下一个字符,如果成功只进入成功处理00007FF61FEC11D4出

另外我们可以看到我们是一个while死循环

所以在00007FF61FEC1201 cmp rdi,10  编译器做的死循环 RDI是16 永远不是10,然后跳转到7FF61FEC1160开头的地方

00007FF61FEC1205 jb dump.7FF61FEC1160    这样就开始了一次循环

如何破解

上面代码简单的分析了如果一个字符比较失败

00007FF61FEC11CC jne dump.7FF61FEC11DD 会跳转到失败错误处理,我们在这里修改跳转的地址就可以了

修改地址为EC11D4让他跳转到正确的地址 

 

 

 然后生成新的exe文件

然后运行新的exe 可以发现无论输入什么输出密码正确了

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值