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教程的主要内容,如果未能解决你的问题,请参考以下文章