Windows PC软件反编译逆向破解

文章目录

  • 一.OllyDbg工具简介
  • 二.OllyDbg分析Crakeme示例1
  • 三.OllyDbg分析Crakeme示例2
  • 四.总结

 

作者的github资源:

  • 系统安全:https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis
  • 网络安全:https://github.com/eastmountyxz/NetworkSecuritySelf-study

前文分析:

  • [系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向
  • [系统安全] 二.如何学好逆向分析及吕布传游戏逆向案例
  • [系统安全] 三.IDA Pro反汇编工具初识及逆向工程解密实战
  • [系统安全] 四.OllyDbg动态分析工具基础用法及Crakeme逆向破解

 

声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。


一.OllyDbg工具简介

OllyDbg是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级调试器,非常容易上手,是当今最为流行的调试解密工具之一。它还支持插件扩展功能,是目前最强大的调试工具之一。

OllyDbg打开如下图所示,包括反汇编窗口、寄存器窗口、信息窗口、数据窗口、堆栈窗口。

 

peid下载地址:链接:https://pan.baidu.com/s/1LbrMSx0fW1fCLHOpDlXqLQ 

提取码:oeta 

OllyDbg下载地址:链接:https://pan.baidu.com/s/1cbvOKSu3aRoSB5n_LyiUAw 

提取码:pjwq 

  • 反汇编窗口:显示被调试程序的反汇编代码,包括地址、HEX数据、反汇编、注释
  • 寄存器窗口:显示当前所选线程的CPU寄存器内容,点击标签可切换显示寄存器的方式
  • 信息窗口:显示反汇编窗口中选中的第一个命令的参数及跳转目标地址、字符等
  • 数据窗口:显示内存或文件的内容,右键菜单可切换显示方式
  • 堆栈窗口:显示当前线程的堆栈

在这里插入图片描述

下图是打开EXE后显示的界面。

在这里插入图片描述


下面简单讲解常用的快捷键调试方式。

F2
设置断点,如下图所示的红色位置,程序运行到此处会暂停,再按一次F2键会删除断点。

在这里插入图片描述

F9
按下这个键运行程序,如果没有设置相应的点,被调试的程序直接开始运行。

F8
单步步过,每按一次这个按键,将执行反汇编窗口中的一条指令,遇到CALL等子程序不进入其代码。

在这里插入图片描述

F7
单步步入,功能通单步步过(F8)类似,区别是遇到CALL等子程序时会进入其中,进入后首先停留在子程序的第一条指令上。如下图进入CALL子程序。

在这里插入图片描述

在这里插入图片描述

F4
运行到选定位置,即运行到光标所在位置处暂停。

CTRL+F9
执行到返回,按下此键会执行到一个返回指令时暂停,常用于从系统领空返回到我们调试的程序领空。

ALT+F9
执行到用户代码,从系统领空快速返回我们调试的程序领空。

在这里插入图片描述


二.OllyDbg分析Crakeme示例1

第一个案例是 《加密与解密》书中Crakeme v3.0的文件,需要解密用户名和序列号。

在这里插入图片描述

点击“Register now”按钮,会有输入错误相关的提示,如下图所示。

在这里插入图片描述

OllyDbg动态分析的基本流程如下:

  • 通常拿到一个软件先试着运行软件,如果有帮助文档查阅帮助文档,熟悉软件的基本用法,接着尝试输入错误的注册码,观察错误提示。
  • 如果没有输入注册码的地方,要考虑是否是读取注册表或Key文件(程序读取一个文件中的内容判断是否注册),这些可以用其他工具来辅助分析。
  • 如果都不是,原程序只是一个功能不全的试用版,那要注册为正式版需要手动写代码完善。
  • 如果需要输入注册码,如上图所示,则调用查壳软件检查程序是否加壳(如PeiD、FI),有壳的需要脱壳之后再调用OllyDbg分析调试,无壳的直接调用工具调试。

下面开始正式的分析。

第一步:调用PEiD检测程序是否加壳。
反馈结果为“Borland Delphi 4.0 - 5.0”,无壳Delphi编写的文件。

在这里插入图片描述

第二步:运行CrakeMe V3.0文件,并点击“Register now”,提示错误信息。
对话框提示错误信息“Wrong Serial, try again!”。

在这里插入图片描述

第三步:启动OllyDbg软件,选择菜单“文件”,打开CrackMe3文件。
此时文件会停留在如下位置,双击注释位置能添加自定义注释。

在这里插入图片描述

第四步:在反汇编窗口右键鼠标,选择“查找”->“所有参考文本字串”。

在这里插入图片描述

弹出如下图所示的对话框。

在这里插入图片描述

第五步:右键选择“查找文本”,输入“Wrong”定位“Wrong Serial, try again!”位置。

在这里插入图片描述

如下图所示,定位到“Wrong Serial”位置。

在这里插入图片描述

第六步:接着右键鼠标,点击“反汇编窗口中跟随”。

在这里插入图片描述

接着定位到如下图所示位置。

在这里插入图片描述

第七步:选中该语句右键“查找参考”-:“选定地址”(快捷键Ctrl+R)。

在这里插入图片描述

弹出如下图所示的“参考页面”。

在这里插入图片描述

第八步:双机上面的两个地址(00440F79、00440F93),去到对应的位置。

在这里插入图片描述

在这里插入图片描述

在反汇编窗口中向上滚动窗口,可以看到核心代码:

在这里插入图片描述

第九步:通过查看跳转到“Wrong serial, try again”字符串的指令,可以查询相应的程序。
在“调试选项”->“CPU”->勾选“显示跳转路径”及“如跳转未实现则显示灰色路径”和“显示跳转到选定命令的路径”。

在这里插入图片描述

如下图所示:

在这里插入图片描述

第十步:详细分析反汇编代码。
在下图中,地址0040F2C处按下F2键设置断点,接着按F9运行程序。

在这里插入图片描述

输入“Test”和“754-GFX-IER-954”,点击“Register now!”,显示结果如下图所示。

在这里插入图片描述

程序会在断点处停止,同时提示刚才输入的内容。

在这里插入图片描述

输出内容如下所示,其中内存地址02091CE0中输入了刚才的“Test”。

第十一步:左击“ss:[0019F8FC]=02091CE0,(ASCII “Test”)”,右键选择“数据窗口中跟随数值”,会在数据窗口中看到输入的内容。EAX=00000004 表示输入内容的长度为4个字符。

在这里插入图片描述

第十二步:调用F8按键和F7按键一步步分析代码。
回到下面00440F2C这部分代码,按下F8一步步运行,注意下面的核心代码。

<span style="color:#000000"><code class="language-html">00440F2C  |.  8B45 FC       mov eax,[local.1]            ;  输入的内容送到EAX,即"Test"
00440F2F  |.  BA 14104400   mov edx,crackme3.00441014    ;  ASCII "Registered User"
00440F34  |.  E8 F32BFCFF   call crackme3.00403B2C       ;  关键点:用按F7进入子程序
00440F39  |. /75 51         jnz Xcrackme3.00440F8C       ;  调走到这里就错误:Wrong serial
...
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

第十三步:当F8运行到“00440F34 |. E8 F32BFCFF call crackme3.00403B2C”时,按下F7进入CALL子程序,此时光标停留在如下所示位置(00403B2C)。

在这里插入图片描述

这里的PUSH ebx、PUSH esi等都是调用子程序保存堆栈时使用的命令,按F8一步步运行代码。其核心解释如下,是基础的汇编语言:(参考看雪CCDebuger大神的《OllyDBG入门教程》)

在这里插入图片描述

重点:程序运行到如下图所示界面时,可以看到“Test”和“Registered User”的比较。通过上面图片的分析,我们知道用户名必须为“Registered User”。

在这里插入图片描述

第十四步:接着按F9键运行程序,出现错误对话框,点击确定,重新在编辑框中输入“Registered User”,再次点击“Register now!”按钮,分析调试程序。
注意,F12键为暂停。

在这里插入图片描述

核心代码如下,其中地址00440F34的CALL已经分析清楚,继续F8执行下一步,知道第二个关键地方,即00440F51,按下F7进入子程序。注意:注释内容的提示不一定存在,需要动态调试程序到寄存器查看对应的注册码,才是正确的做法。

在这里插入图片描述

<span style="color:#000000"><code class="language-html">00440F34  |.  E8 F32BFCFF   call crackme3.00403B2C
00440F51  |.  E8 D62BFCFF   call crackme3.00403B2C
</code></span>
  • 1
  • 2

上面两句代码可以看到用户名和注册码都是调用同一子程序,这个CALL分析方法和上面一样。

在这里插入图片描述

第十五步:按F8调试该子程序,发现cmp比较两个值是否相等,其中0044102C为注册码内容。

在这里插入图片描述

第十六步:按F12暂停,再按F9重新运行,输入正确的用户名和密码,解密成功。

  • Registered User
  • GFX-754-IER-954

在这里插入图片描述

难点:调试程序时如何核心代码,比如这里的CMP比较,同时汇编代码也比较晦涩。


三.OllyDbg分析Crakeme示例2

这个案例是破解Crakeme中的Afkayas.1.EXE,这是典型的字符串序列破解程序,根据name的值推出serial。

第一步:通过PEiD检查它无壳,VB编写的。

第二步:OllyDbg工具打开Afkayas.1.EXE文件如下图所示。

第三步:反汇编区域右键鼠标,选择“查找”->“所有参考文本字串”。

第四步:在弹出的对话框中找到失败的提示字符“You Get Wrong”,右键“反汇编窗口中跟随”。

此时会回到代码区,可以看到失败和成果的字符串。

第五步:通常成功和失败的反馈字符串相隔不远,需要在之前判断,如果输入的serial正确则成功,否则失败;接着向上找到调用字符串比较函数的入口点。

注意,这一步比较关键,但个人觉得需要长时间的经验和实践,才能准确定位。

汇编调用函数之前会先把参数入栈,然后用CALL指令调用函数。在字符串比较函数之前有一句 PUSH EAX 指令,可以推测这里的EAX就是字符串的首地址。

第六步:在比较函数00402533处按下F2键设置断点,接着按F9键执行,此时会弹出运行界面,我们输入“Eastmount”和“12345678”,然后点击OK按钮。

此时程序停留在断点处,右下角堆栈区显示了提示的正确Serial。

第七步:输入正确的用户名和Serial,成果注册。

  • Eastmount
  • AKA-877848


下面结合鬼手大神和海天一色大神的博文,简单分析加密的基本逻辑,同时强烈推荐大家阅读他们的文章,参见前面的参考文献。这些逆向的经验真不是一朝一夕就能获取的,深知自己要学习和经历的东西太多,你我一起加油。

基本流程如下:
serial = ‘AKA-’ + 逆序itoa(strlen(name) * 0x17CFB + name[0])

  • 求出了用户名的长度
  • 将用户名长度乘以0x17CFB得到结果 如果溢出则跳转
  • 将结果再加上用户名的第一个字符的ASCII
  • 将结果转为十进制
  • 将结果和AKA进行拼接,得到最后的序列号

下面分享一段Python的解密代码。

<span style="color:#000000"><code class="language-python"><span style="color:#5c6370"># encoding:  utf-8</span>key <span style="color:#669900">=</span> <span style="color:#669900">"AKA"</span>
name <span style="color:#669900">=</span> <span style="color:#669900">"Eastmount"</span><span style="color:#5c6370">#获取用户名长度</span>
nameLen <span style="color:#669900">=</span> <span style="color:#669900">len</span><span style="color:#999999">(</span>name<span style="color:#999999">)</span>
<span style="color:#c678dd">print</span><span style="color:#999999">(</span>u<span style="color:#669900">'获取用户名长度:'</span><span style="color:#999999">)</span>
<span style="color:#c678dd">print</span><span style="color:#999999">(</span>nameLen<span style="color:#999999">)</span><span style="color:#5c6370">#用户名长度乘以0x17CFB得到结果</span>
res <span style="color:#669900">=</span> nameLen <span style="color:#669900">*</span> <span style="color:#98c379">0x17CFB</span>
<span style="color:#c678dd">print</span><span style="color:#999999">(</span>u<span style="color:#669900">'用户名长度乘以0x17CFB:'</span><span style="color:#999999">)</span>
<span style="color:#c678dd">print</span><span style="color:#999999">(</span>res<span style="color:#999999">)</span><span style="color:#5c6370">#将结果加上用户名的第一个字符的ASCII</span>
<span style="color:#c678dd">print</span><span style="color:#999999">(</span>name<span style="color:#999999">[</span><span style="color:#98c379">0</span><span style="color:#999999">]</span><span style="color:#999999">,</span> <span style="color:#669900">ord</span><span style="color:#999999">(</span>name<span style="color:#999999">[</span><span style="color:#98c379">0</span><span style="color:#999999">]</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
res <span style="color:#669900">=</span> res <span style="color:#669900">+</span> <span style="color:#669900">ord</span><span style="color:#999999">(</span>name<span style="color:#999999">[</span><span style="color:#98c379">0</span><span style="color:#999999">]</span><span style="color:#999999">)</span>
<span style="color:#c678dd">print</span><span style="color:#999999">(</span>u<span style="color:#669900">'结果加上用户名第一个字符的ASCII:'</span><span style="color:#999999">)</span>
<span style="color:#c678dd">print</span><span style="color:#999999">(</span>res<span style="color:#999999">)</span><span style="color:#5c6370">#转换为十进制 省略</span><span style="color:#5c6370">#拼接序列号</span>
key <span style="color:#669900">=</span> key <span style="color:#669900">+</span> <span style="color:#669900">str</span><span style="color:#999999">(</span>res<span style="color:#999999">)</span>
<span style="color:#c678dd">print</span><span style="color:#999999">(</span>u<span style="color:#669900">'最终结果:'</span><span style="color:#999999">)</span>
<span style="color:#c678dd">print</span><span style="color:#999999">(</span>key<span style="color:#999999">)</span>
</code></span>

定义不同的用户名可以得到对应的Serial。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信公众号天气与聊天机器人小功能

微信公众号小功能 以下都是借鉴的微信公众平台的文档加老师指点和自行的理解。 &#xff08;1&#xff09;微信公众号发送地区回复现在和未来五天天气情况 &#xff08;2&#xff09;发送语音和智能机器人聊天 一、调用天气预报接口 实现微信公众号发送地区回复现在和未来五天…

安卓app逆向破解脱壳教程

From&#xff1a;Hook 神器家族的 Frida 工具使用详解&#xff1a;https://blog.csdn.net/FlyPigYe/article/details/90258758 详解 Hook 框架 frida ( 信抢红包 )&#xff1a;https://www.freebuf.com/company-information/180480.html APP逆向神器之Frida【Android初级篇】…

关注微信公众号使其自动发送欢迎你关注消息

关注微信公众号使其自动发送欢迎你关注消息 一般我们关注微信公众号时。他都会自动推送一条消息。欢迎您关注了某公众号。而今天我们所做的就是这个功能。 关注公众号时我们需要获取到用户的一些个人基本信息。 而获取基本信息就要看他的运行原理。到底是怎么运行。 当我们申请…

微信公众号——永久素材的上传

微信公众号永久素材的上传 思路&#xff1a;1.需要上传到本地&#xff08;因为后面需要用的本地的绝对路径 2.上传到微信服务器 3.添加信息到本地数据库 一、上传图片到本地 文件上传的方法 以下是我的代码 首先更改文件上传的配置 而后写我们的文件上传方法 if (request…

安卓逆向之基于Xposed-ZjDroid脱壳 逆向分析(脱壳)

安卓逆向——某力播逆向分析(脱壳) 一、环境 这一步真的头疼&#xff0c;环境很重要&#xff0c;各种测试&#xff0c;一下是我测试的环境&#xff0c;由于没有真机&#xff0c;就拿虚拟机做测试 1. Xposed 2. FDex2 3. fiddler 4. 软件 二、抓包 通过 …

安卓逆向代码反混淆 Simplify工具 JEB2反混淆神器

【技术分享】Android程序反混淆利器——Simplify工具 https://www.anquanke.com/post/id/85388 发布时间&#xff1a;2017-01-23 17:21:23 问题背景 Android程序代码混淆是Android开发者经常用来防止app被反编译之后迅速被分析的常见手法。在没有混淆的代码中&#xff0c;被…

Vmware虚拟机的安装和使用

安装虚拟机 一、安装虚拟机Vmware Workstation 下一步 下一步 如果C盘剩余空间大&#xff08;大于50G&#xff09;&#xff0c;可安装在C盘 二、在虚拟机中安装Linux系统&#xff1a; 准备工作&#xff1a; Linux系统镜像文件&#xff08;ISO文件&#xff09; 1 、新建虚拟机…

【项目经验】如何用TexturePacker Physicseditor开发游戏

首先感谢Andreas的license。先广告一下Andreas。 -----------------------------------------------------------------------------------------http://www.codeandweb.com/texturepacker - The sprite sheet creator turns chaos into orderhttp://www.codeandweb.com/physic…

smbd的安装与使用

文件共享服务软件 samba 安装与配置 安装了samba服务的主机&#xff0c;可以将文件共享给其它用户&#xff0c;其它用户可以对文件进行读写操作。 安装 以Ubuntu Linux为例 1、 安装 2、 检查是否安装成功 启动 samba服务&#xff1a; 查看samba服务状态&#xff1a; 3、 添…

Laravel-admin 分类避免踩坑

一、模型层引入 use Encore\Admin\Traits\AdminBuilder; use Encore\Admin\Traits\ModelTree; 在方法中使用 use ModelTree,AdminBuilder; 最终代码为 <?phpnamespace App\Model;use Illuminate\Database\Eloquent\Model; use Encore\Admin\Traits\AdminBuilder; use Enco…

python使用python-barcode生成任意长度字符串的条形码(一维码)详细教程

使用python-barcode生成一维码 1.安装python包 pip install Pillow pip install python-barcode2.实例程序 # -*- coding: utf-8 -*-import barcode import random from barcode.writer import ImageWriter import os from PIL import Image#生成一维码的类型的种类 "&…

Objective-C学习笔记(一)–类

1、类的定义与实现1.1说明所有的类都是继承NSObject。类的接口与实现是分开的&#xff0c;一般类的定义是放在.h文件【包含类的名称、成员变量、方法、属性、继承关系 、遵从的协议】&#xff1b;实现部分是放在.m文件中【包含每个属性和方法的具体实现以及协议的方法实现】语法…

laravel支付宝sdk接入

自己学习使的 仅供参考 一、打开蚂蚁金服开放平台 找到研发服务->沙箱应用 设置沙箱应用保证可以使用 二、找到sdkdemo下载放到本地环境并改名为alipay配置里面的config 注释有详细的讲解仔细看 三、&#xff08;这里是我的习惯&#xff09;放到laravel的app下 四、去confi…

npm上传自己的项目

npm安装就不介绍了&#xff0c;自行度娘。本文介绍npm上传 先初始化&#xff1a;npm init 根据提示填完系统介绍信息&#xff08;package.json&#xff09;&#xff1b; 再登录npmjs&#xff1a; npm login 效果如图&#xff1a; 输入注册的用户名、密码、邮箱&#xff0c;…

融于心而表于行 之 程序的执行问题

2.4 程序的执行问题Linux的多用户说完了&#xff0c;还需要进行下一个话题&#xff0c;那就是多任务的问题。所谓多任务&#xff0c;就是同一时刻能够执行多个程序。这个问题其实对于大多数Windows用户它都不是个问题&#xff0c;因为我们经常会一边浏览网页&#xff0c;一边用…

WebStorm文件类型关联设置

无意中创造了一个没有扩展名的文件&#xff0c;我选择了错误的文件类型关联。是js类型的&#xff0c;我却选成了文本&#xff0c;Ws每次编辑类型就成了txt文本&#xff0c;这个问题让我很苦恼&#xff0c;以下是我的解决方案。 错选的弹出框如下&#xff1a; 解决方案如下&…

WebStorm按Tab建快速生成代码模块

WS中&#xff0c;比如调试每次都要写的console.log(xxx);每次都要敲一遍&#xff0c;还有if模块&#xff0c;for循环模块&#xff0c;难道没有快捷键&#xff0c;可以生成代码模块吗&#xff0c;答案是“有”。 操作步骤如下&#xff08;汉化版WS&#xff09;&#xff1a; 1、…

iterm2一键登陆服务器(门神权限不用每次都输密码进行验证)

1、新建文件 vim ~/.ssh/config 在打开的文件中输入以下内容 Host * ControlMaster auto ControlPath ~/.ssh/master-%r%h:%p ControlPersist yes ServerAliveInterval 60 #保持持久链接 每60s 发送一个请求检测2、 新建文件 并赋予可执行权限&#xff…

STM32 cubeMX 光敏电阻AD转化实验

文章代码使用 HAL 库。 文章目录 前言一、光敏电阻介绍二、光敏电阻原理图解析三、ADC采样介绍1. 工作原理&#xff1a;2. ADC精度&#xff1a; 四、STM32 cubeMX配置ADC采样五、代码编写总结 前言 实验开发板&#xff1a;STM32F051K8。所需软件&#xff1a;keil5 &#xff0c;…

tls握手浅析

首先上图&#xff1a; tcp三次握手完毕 tls&#xff1a; 1、client hello client random 支持的tls 支持的算法 2、server hello server random 选择的tls协议 选择的算法 证书 公钥 3、client 公&#x1f511;加密后的。 premaster secret server 私钥解密得到 premas…