本文共 1667 字,大约阅读时间需要 5 分钟。
目录
基本概念
分析一个程序,用什么API函数作为切入点十分关键。
设置OllyDbg中断在程序的入口:
System breakpoint:系统断点,OllyDbg用CreateProcessA加载DEBUG_ONLY_THIS_PROCESS参数执行,程序运行之后会触发一个INT13,在系统空间里。
Entry point of main module:主模块的入口点,即文件的入口点。
WinMain:程序的WinMain()函数入口点。
点击选项,再点击开始,即可选择暂停点:
普通的Win32项目或者MFC程序
程序通常读取文本框内容的字符串用的是以下两个函数:
GetDlgItemTextA(GetDlgItemTextW)
GetWindowTextA(GetWindowTextW)
Qt程序在Windows逆向过程中其实也有这个,但可以根据Qt函数特意的特征,进行破解,在下面的代码与实例中将会给出。
关于返回值,汇编代码的返回值约定是存放在eax这个寄存器里边的,如果32位的eax不够存放返回值,系统会将返回值放在内存某个位置并把该位置的地址放在eax返回。
代码与实例
这里首先破解下TraceMe这个程序。
程序运行截图如下
随机输入用户名和密码,点击确定:
使用OD打开,Ctrl + G 直接搜索:
GetDlgItemTextA
在此处下个断点,在写代码的时候,可以知道当要计算时,基本上要先获取用户的数据,然后进行算法,最后得到结果。
暴力破解,就是在得到结果的那个时间,把以前如果是fale的,变成true,让其成功的运行。
如下分析下:
发现,这个开始把用户名压入栈,估计要开始调用判断函数了!再走
这里用户名,密码都传进去了。这个Call估计就是算法,然后后的这个Test EAX,EAX就是存放结果。
走到JS跳转那个地方
把Z这个标志位改为0.看看
此时显示不跳转了,在这个地方放个断点,然后跑起来。
提示登录成功。
双击JZ这个地方:
进了这个页面后,右键保存
然后是
生成好文件后,随便输入用户名密码即可:
这里用Qt写一个小程序,关键代码如下:
#include "widget.h"#include "ui_widget.h"#include#include Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this); connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btnClicked()));}Widget::~Widget(){ delete ui;}void Widget::btnClicked(){ QString passwd = ui->lineEdit->text(); if(isOK(passwd)){ QMessageBox::information(this, "提示", "成功"); } else{ QMessageBox::information(this, "提示", "失败"); }}bool Widget::isOK(QString str){ if(str == "www.it1995.cn") return true; return false;}
这个是自己写的,密码是www.it1995.cn,现在破解他,来看看是怎么样的逻辑:
演示下,输入正确的密码:
输入错误的密码:
破解他,让其输入任意的用户名密码都能登录成功!
用OD打开他,经过慢慢的分析(其实和上面有异曲同工之妙),得到结果:
在此附近重新下个断点:
这里是关键:
成功了,像刚刚那样修改下,就算暴力破解了!
打包下载
转载地址:https://it1995.blog.csdn.net/article/details/103399566 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!