x64dbg破解一个简单的Demo教程

Posted 小米渣的逆袭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了x64dbg破解一个简单的Demo教程相关的知识,希望对你有一定的参考价值。

源码分析

首先需要破解的程序源码

#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 可以发现无论输入什么输出密码正确了

 

以上是关于x64dbg破解一个简单的Demo教程的主要内容,如果未能解决你的问题,请参考以下文章

x64dbg入门学习

通过批处理文件启动的调试软件(x64dbg)

x64dbg

IDA Pro与x64dbg联动调试记录

如何使用 x64dbg 记录程序执行的 CPU 指令?

x64dbg 中的“r8d”是啥?