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