2022 零基础菜鸟学习解密的作业 第一天 爆破【视频】
本帖最后由 dujinshan 于 2022-3-21 14:17 编辑第一次发帖,如有违规及时指正。。。。。
本人零基础菜鸟,记录下学习解密的过程,视频采用4K分辨率,作业中如有错误请提出建议,以便少走弯路。
作业视频地址:https://www.bilibili.com/video/BV1RS4y1S7xp
课件下载地址:https://www.123pan.com/s/fyzA-sfPod
您的支持是我最大的动力
****************************************************
零基础菜鸟学习解密的作业 第一天 爆破
学破解前我们要知道破解的几个基本步骤。
第一步、测试软件 找出验证方式的突破口 。第二步、查壳第三步、脱壳第四步、查找 关键字符串 或 在弹窗断点 。第五步、找到 关键跳转 或者 关键call(验证子程序)第六步、修改 跳转 或 制作注册机 本节课件:CrackmeNo1.exe本节工具:ExeinfoPe 、UPXTool+ 、x32dbg
一、找出验证方式的突破口 软件作者为了保护自己辛苦编出的软件不被破解都会加一些验证方式,验证方式分以下几类:
①注册码方式:用户名+注册码、机器码(硬件码)+注册码、重启验证、组合方式+注册码,这几种个人开发作者常用,也是最简单的验证方式,破解方法:爆破和跟踪注册码都可以。
②加密狗方式:加密狗多见于商业软件,加密狗是个像U盘的硬件,里面存着注册信息,有USB狗、并口狗等,破解方法:爆破、硬件复制、软件模拟。
③光盘加密:多用于游戏软件类似加密狗,破解方法:爆破或者虚拟光盘。
④网络验证:由于网络进步的越来越快,网络验证理所当然的成为了主流,由于注册信息都存在作者的网络服务器上,软件还不定期的读取服务器上的信息验证。破解方法:爆破或者模拟校验的方式。 ⑤NAG窗口:软件使用前或试用版使用中经常弹出验证等提示窗口,试用期过后还会屏蔽正式窗口或屏蔽功能; 还有很多目前不常见的,如:试用期、灰色按钮等等,
双击打开“CrackmeNo1.exe”,输入假的注册码:“11111” ,点“验证”,点退出“走人”按钮。
总结突破口:有 关键字符串“ I am sad ” ,没有弹出“信息窗口” 。
二、查壳(也叫侦壳) 查壳前简介一下 壳的概念 : 壳是保护程序不会被破解加上去的一层或多层保护代码,壳的种类大概分两类,分别是:
第一类:压缩壳(Packers) 主要功能为了减少体积和 少量的防破解 ,常见的有UPX、ASPack、PECompact、FSG和Winupack(国产壳)等;
第二类:保护壳(Protectors) 功能就是防止破解 ,常见的有Armadillo、EncryptPE(国产壳)、ASProtect、Telock、Obsidium、Xtreme-Protector、VMProtect、DBPE(国产壳)、ACProtect(国产壳)和Hying(国产壳)等;
SDK保护程序 由于作者为了省事或技术不够,所以基本都用现成的加壳程序,这样导致大多数壳的破解方法都公布出来了,为了解决这个问题一些加密壳程序引入了SDK的概念。
由于我们是新手,目前只拿最简单压缩壳来学习,后面慢慢了解。
打开“ExeinfoPe”,把“CrackmeNo1.exe”拖进“ExeinfoPe”,我们观察下面信息,显示的是“UPX 0.89 - 3.xx -> .......”,证明是“UPX壳”,关闭“ExeinfoPe” 。
三、脱壳 脱壳基本都是用脱壳软件(通用脱壳、专用脱壳)和,遇到脱不掉和最新版壳的就用动态调试器手动脱壳。 我们打开“UPXTool+”,把“CrackmeNo1.exe”拖进“UPXTool+”,点解压缩,点开始,关闭
我们在“CrackmeNo1.exe”同目录下看到了“CRACKM~1.EX~”这个程序,他是脱壳前“CrackmeNo1.exe”的备份。
我们在打开“ExeinfoPe”,把“CrackmeNo1.exe”拖进去,信息栏显示“Borland Delphi”,说明是没有壳了,是“Delphi”编程语言编写的,不过“ExeinfoPe”不是所有语言都能识别;
常见的编程语言: 一般能够识别bolandC+、VisualC++、VisualBasic、Delphi及.NET等编写的程序,如果程序由VFP、PowerBuilder或者国产的易语言等编写,一般都会识别为VisualC++,如何正确识别这些编程语言,我们将在以后慢慢学习。
每种语言都有自己的特征和专用的破解方法,所以了解语言可以让解密者更容易破解。 由于目前大多软件都加壳了,脱掉壳才能让我们更容易分析需要解密的软件,这样脱壳慢慢的成为了解密的一个分支。
四、分析调试 调试器主要分静态分析器和动态调试器两类:
静态分析器:主流有IDAPro、W32Dasm、C32asm等。
动态调试器:主流是x32/x64dbg、OllyDbg、SoftICE、Trw2000,前面两个是ring3汇编级别的调试器,后面两个属于ring3和ring0级别都可以调试,因为ring0 属于系统底层CPU指令,我们基本用不到,而OllyDbg(简称OD)的64位又不好用,然后就是黑马x32/x64dbg调试器,因为他的操作和OD基本相同,还是开源的,还用QT平台编写,支持多国语言,设计人性化,是个前景非常好的调试器。所以自然而然的成为了动态调试的主力军。可以去官网下载和查壳特征 https://x64dbg.com/
1、查找关键字符串: (1)CrackMe(破解我)简介: 它们都是一些公开给别人尝试破解的小程序,制作CrackMe的人可能是程序员,想测试一下自己软件的保护能力,也可能是一位CrackMer(破解者),想挑战一下其它CrackMer的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破。
(2)预设x32dbg 打开x32dbg 在菜单栏点 选项 -> 选项 -> 把 系统断点* 的勾去掉 -> 保存(为什么x32dbg,因为CrackMe是32位的)。
(3)x32dbg调试器的五个主窗口和命令行: ①反汇编窗口(Disassembler) 当载入程序后,窗口内显示的是程序反汇编后的源代码,与W32Dasm等反汇编工具反汇编出来的源代码相同,不过不包含基本信息、菜单对话框信息和引入表信息,而且会自动定位到程序的入口点处。这也是将静态反汇编与动态调试相结合的一个窗口。 窗口分为5列,分别为:跳转辅助线列、地址(虚拟地址)列、16进制(机器码)列、反汇编(汇编代码)列和注释(可以自定义注释内容)列。注释栏目还会显示一些API函数等信息,在调试时可以参考。
②信息窗口(Information) 在动态调试时,窗口内会显示出当前代码行的各个寄存器的信息或者API函数的调用、跳转等信息,可以用来辅助了解当前代码行的寄存器的运行情况。
③数据窗口(Dump) 默认以十六进制方式显示文件在内存中的数据,还可以用鼠标右键设置用文本或者反汇编等方式显示数据。窗口分为3列,分别为:地址(内存当中的虚拟地址)、16进制值和ASCII(16进制值对应的字符)。还可以设置为Unicode等方式。 ④寄存器窗口(Registers) 动态显示CPU各个寄存器的内容,包括数据寄存器(EAX、EBX、ECX和EDX)、指针及变址寄存器(ESP、EBP、ESI和EDI)、段寄存器(CS、DS、SS、ES),以及控制寄存器中的程序状态字寄存器(CF、PF、AF、ZF、SF)等。 此外,还可以通过鼠标右键设置查看3DNow!和MMX等寄存器状态。这些寄存器当中应用最广泛的就是数据寄存器和指针及变址寄存器,像输入的用户名、机器码及注册码等信息一般都会放在这些寄存器当中,因此在动态调试时要多注意查看这些寄存器的内容。
⑤堆栈窗口(Stack) 显示堆栈的内容,也就是EBP和ESP所指向的内容。堆栈是很重要的,API函数或者子程序等都会利用它来传递参数、变量等信息。而且如果是字符串信息,会在注释里面显示出来。有的用明码比较注册信息的程序可能会在这里面显示出正确的注册码。
这5个窗口统称为CPU视图窗口,是启动x32dbg时默认打开的窗口
⑥命令行(Command) 方便在动态调试时输入命令。一般来说主要是输入下断点或者清除断点的命令。
⑦视图窗口 另外还有很多其他的功能视图窗口,可以通过“视图”菜单当中的项目打开,或者通过上面的工具栏上的按钮打开,也可以用快捷键打开。
(4)开始调试 把CrackmeNo1.exe拖到x32dbg -> 按Ctrl+G (表达式)输入401000 (程序代码的起始处)确定 -> 右键 -> 搜索 -> 当前模块 -> 字符串(这时我们切换到 引用 视图窗口了) -> 在下面的搜索框输入“ I am sad ” -> 双击 搜索出来的这行(我们又切换回CPU视图窗口了)
我们观察反汇编窗口,我们切换回来的这行。
第一列 辅助线列:有很多带箭头的线(跳转的指向线),蓝虚线是条件执行线、蓝线无条件执行线、橙色回跳线,还有很多黑色的圈(断点的状态)黑色未设置、红色启用、蓝色禁用
什么是断点: 暂停在某一个点(行)的意思,动态调试时,我们需要一行一行的执行,来观察程序的变化,遇到关键地方的时候,我们需要他停在这里,来确定他是否是关键位置,分一般断点、内存访问断点、内存写入断点、硬件断点,相关的介绍后期慢慢了解。
第二列 虚拟地址列: 这列是源代码的虚拟地址无论在硬盘上还是映射到内存中,这个虚拟地址是不变的。将来进行动态调试时,如果想对这行代码下断点,所下的断点地址也就是这行代码的虚拟地址。
第三列 HEX数据列: 这列是源代码所对应的机器码。大家可以把机器码理解为源代码对应的机器语言,是用16进制来表示的。用16进制编辑器修改程序也就是对机器码进行修改,由0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F 这16个数字组成。
第四列 反汇编代码列: 把机器语言转换为汇编语言代码,在此代码运行过程中我们可以领悟到软件作者的编程思想,软件一切神秘的运行机制全在反汇编代码里面。
这里存在很多指令,下面是常用的指令类别,别怕,后面慢慢就了解了
常用指令的认识 段首指令: push 子程序入口指令: Call 运算指令: add、sub、inc、dec 寄存指令: eax、ebx、ecx 传输指令: mov、lea 比较指令: cmp 执行指令: test 条件跳转指令: je、jne、jb、ja、jg、jge、jl、jle 无条件跳转指令: jmp 空操作指令: nop 循环指令: loop 返回指令: ret 这些都是常用的指令,相关指令说明可以在网上搜索查阅详细了解。
第五列 注释列 可以用来备注重要的信息,还会显示一些API函数等信息,在调试时可以参考,还可以添加标签方便下次快速定位到此代码处。
什么是爆破: 就是暴力破解,已修改 跳转 或者 窗口代码 替换原软件内的命令。
①分析关键跳转 我们简单了解了上面内容,看下里面的信息,来分析怎么破解,首先我们看我们进来的这行,是失败信息“i am sad”的语句,他上面一行有个jmp(无条件跳转),代码的执行顺序是从上往下执行,意思就是执行到jmp就是跳过失败,但是辅助线那列显示有个jne(有条件跳转)可以跳到失败这行,还可以执行到“welcome”成功这行,而且没有别的跳转能进入他的跳转区域,还有它比失败哪行上面的jmp早执行,那么说明这个是个爆破的关键跳转,那么我们必须让jne不受上面的验证信息影响,既不跳转到失败哪行,然后还要走到成功这行,那就用到这个nop空指令。
②修改跳转 我们在jne这行点一下让灰色指示条停在这里 → 按Ctrl+9(右键 - 二进制 - 用NOP填充) → 确定 。
③保存修改的程序 在反汇编窗口修改的代码处右键 → 补丁(Ctrl+P) → 修补文件 → 选择保存到的位置 → 起个名字(比如:CrackmeNo1-爆破.exe) → OK → 关闭补丁窗口 → 关闭x32dbg → 退出。
④测试程序 打开CrackmeNo1-爆破.exe → 随意输入上面注册码 → 验证 → 显示出正确信息“welcome!”,证明成功了!!!
......你的支持是我最大的动力
2022-03-10 by:Dujinshan
6666 谢谢分享 谢谢@Thanks! 感谢楼主分享 多谢楼主分享 感谢楼主分享
感谢楼主分享
页:
[1]