admin 发表于 2021-11-16 14:59:09

软件破解基础知识详解(手把手教你如何破解软件)



在介绍PE结构后,本文将通过OD(OllyDBG)对示例程序进行逆向分析,绕过登录判定,实现破解登录的效果。本文以简单的程序为示例,其目的是方便我们直观了解破解方法及破解原理,通过由浅到深,逐步递增难度的方式,为下一步深入逆向分析打下坚实的基础。

1.破解示例程序介绍

本程序通过C++编写,当点击“确定”按钮时,会获取用户输入的用户名及密码进行判断,当未输入任何内容点击提交时,系统会显示“用户名与密码不能为空”。当输入用户名和密码与判断数据“test”不符时,系统会提示“用户名或密码错误”,当用户名及密码都为“test”时,则提示“登录成功”。详细代码如下图:


测试示例源代码

当我们运行crackMeText.exe程序时,展现效果如下:


打开效果

当我们输入内容错误(用户名及密码都不是test)时,系统提示“用户名或密码错误”。


登录错误

当我们输入内容正确(用户名及密码都是test)时,系统提示“登录成功”。


登录成功

以上是测试示例的简单介绍。

2.OD程序逆向分析介绍

我们可以打开本地的OD程序,将示例系统拖入至OD即可,效果如下图:


OD主线程模块

左上为反汇编窗口,右上为寄存器窗口,左下为栈窗口,右下为数据窗口。

反汇编窗口:用户显示反汇编代码,调试分析程序主要是就是在这个窗口进行。

寄存器窗口:用户显示各个寄存器内容,包括:通用寄存器、段寄存器、标志寄存器等。

栈窗口:用户显示栈内容,即ESP寄存器指向的地址部分。

数据窗口:多种方式显示内存中的内容,可以使用Hex、文本、短型、长型、反汇编等。

由于内容较多,我们可通过搜索ASCII查看字符串进行快速定位,该操作位于插件->中文搜索引擎->搜索ASCII,具体如下图:


OD搜索ASCLL

搜索完毕会,会显示中文搜索引擎内容,我们双击选择“登录成功”,如下图:


双击 “登录成功”

双击后,便快速定位至“登录成功”反汇编代码段中,如下图:


“登录成功”反汇编

届时,我们可以查看该区域的局部汇编代码。

3.OD程序动态调试分析介绍

通过静态查看反汇编代码,使我们对其内容有一定了解后,我们可以通过设置断点进行逻辑梳理。

点击指定行,“右键”->断点->切换,便可对指定行设置断点。如下图:


断点设置

设置完毕后,我们点击“运行程序”,随后示例程序便会启动,我们可输入test/test123,信息进行断点调试,如下图:


用户名及密码信息录入

点击“确定”按钮后,OD会锁定指定断点设置行,我们可通过“F8”进行单步调试,如下图:


断点调试

上图为JNZ判断(后期我会写一篇关于逆向的基础知识),当等于0时跳转至012318D6位置。

判断不满足后,会跳入到 012318D6位置,如下图:


入栈

继续按“F8”后,会进入PUSH “用户名或密码错误”行。


告警内容入栈

最后执行到call代码后,我们打开测试程序时,发现弹出了“用户名或密码错误”对话框。


登录错误对话框

通过设置断点后逐步调试,我们对程序执行有个更深入的了解,随后我们便可以对汇编内容进行修改。

4.汇编内容修改

我的绕过思路是,将if语句中最后的密码判断直接绕过(strcmp(password,"test")==0),也就是只需要用户名输入正确即可。找到该语句的对应位置后,双击指定行(00851897处),如下图:


00851897原始内容

我们将该处内容修改为 je 000118CD,即若为1时,跳转至000118CD处(为登录正确内容位置)。当我们再次运行程序输入test(用户名)/123(密码)时,系统提示“登录成”。


00851897内容修改

通过以上步骤,我们就可以通过修改汇编内容,绕过示例程序登录判断。该方式只是通过内存形式进行修改,并未实际修改原始示例程序,我们可通过存盘的形式进行修改。选中修改的反汇编代码行,“右键”->复制到可执行文件->选择,如下图:


复制到可执行文件

随后我们会跳转至文件对话框中,如下图:


文件对话框

在该页面我们,“右键”->保存文件,便可将已修改的文件另存为exe,如下图:


程序保存

修改生成后的exe再运行时,便可实现上面我们修改后的效果,只需要输入正确用户名test即可(密码随便输入)。

5.总结

通过以上逐步讲解,相信大家已经清楚了解到如何通过OD进行逆向分析及绕过破解,以简单的示例是让大家更容易有所认识,针对复杂系统,您还需具有相对丰富的编程、汇编、工具等多方面经验。

页: [1]
查看完整版本: 软件破解基础知识详解(手把手教你如何破解软件)