1.4 Crack小实验
0_day 第一章 基础知识
1.4 Crack小实验
《0day_2th》王清 著 电子书 下载链接:https://pan.baidu.com/s/11TgibQSC3-kYwCInmH8wwg 密码:ve75
实验环境
实验流程
首先打开IDA,并把由VC 6.0得到的.exe文件直接拖进IDA,稍等片刻,反汇编工作将完成。反汇编流程图如下所示:
在IDA图形显示界面,用鼠标选中程序分支点,即要寻找的对应C代码分支点的if分支点,按空格键切换到汇编指令界面:
光标仍然显示高亮的这条汇编指令就是刚才在流程图中看到的分支指令。可以看到这条指令位于PE文件的.text节,并且IDA已经自动将该指令的地址换算成了运行时的内存地址VA:004010D5。
现在关闭IDA,换成OllyDbg进行动态调试来看看程序到底怎样分支的。用OllyDbg把PE文件打开,如下:
OllyDbg在默认情况下将程序中断在PE装载处开始,而不是main函数的开始。一般情况下,main函数位于GetCommonLineA函数调用后不远处,并且有明显的特征:在调用之前有3次明显的压栈操作,因为系统要给main传入默认的argc、argv等参数。找到main函数后,按F7键单步跟入就可以看到真正的代码了。
也可以按快捷键Ctrl+G直接跳到由IDA得到的VA:0x004010D5处查看那条引起程序分支的关键指令:
选中这条指令,按F2键下断点,成功后,指令的地址会被标记成不同颜色:
按F9键让程序运行起来,这时候程序控制权会回到程序,OllyDbg暂时挂起。到程序提示输入密码的Console界面随便输入一个错误的密码(例如:123):
回车确认后,OllyDbg会重新中断程序,收回控制权。
密码验证函数的返回值将存在EAX寄存器中,if()语句通过下列两条指令实现:
TEST EAX,EAX JE XXXXX
也就是说,EAX 中的值为 0 时,跳转将被执行,程序进入密码确认流程;否则跳转不执行, 程序进入密码重输的流程。由于现在输入的是错误密码(123),所以可以在预执行区看到提示:“Jump is not taken(跳转未实现)”。
以上是破解前的状态。
如果我们把 JE 这条指令的机器代码修改成 JNE(非 0 则跳转),那么整个程序的逻辑就会反过来:输入错误的密码(例如:123)会被确认,输入正确的密码(1234567)反而要求重新输入!当然,把
TEST EAX, EAX
指令修改成
XOR EAX, EAX
也能达到改变程序流程的目的,这时不论正确与否,密码都将被接受。
双击JE这条指令,将其修改成JNE,单击“Assemble(汇编)”按钮将其写入内存,如下所示:
OllyDbg将汇编指令翻译成机器代码写入内存。原来内存中的机器代码74(JE)现在变成了75(JNE)。此外,在预执行区中的提示也发生了变化,提示跳转将要发生,也就是说,在修改了一个字节的内存数据后,错误的密码也将跳入正确的执行流程!后面您可以单步执行,看看程序是不是如我们所料执行了正确密码才应该执行的指令。
注:实际这里按了两下“汇编”按钮,导致产生两条je指令。按一下即可。
上面只是在内存中修改程序,还需要在二进制文件中也修改相应的字节,需要用到内存地址VA与文件地址之间的对应关系。利用PEiD或类似软件打开.exe文件,查看PE文件的节信息:
我们已经知道跳转指令在内存中的地址是VA = 0x004010D5,按照VA与文件地址的换算公式: 文件偏移地址 = 虚拟内存地址(VA) - 装载基址(Image Base) - 节偏移 = 0x004010D5 - 0x00400000 - (0x00001000 - 0x00001000) = 0x10D5 也就是说,这条指令在PE文件中距离文件开始处10D5字节的地方。
用UltraEdit按照二进制方式打开.exe文件,按Ctrl+G:
输入0x10D5,点击“确定”。直接跳到JE指令的机器代码处,将这一字节的74(JE)修改成75(JNE),保存。
重新运行可执行文件.exe,原本正确的密码“1234567”现在反而提示错误了。
Preference
https://blog.csdn.net/rectsuly/article/details/70161212
1.4 Crack小实验的更多相关文章
- PBR综合小实验视频-狮子XL
这个是上学时候录的一个策略路由小实验
- ubuntu下格式化内存当硬盘使的小实验
内存虚拟硬盘(ramdisk)是指通过软件技术,将物理内存进行分割,将一部分内存通过虚拟技术转变为硬盘以较大幅度提升计算机数据读取速度和保护硬盘. 在ubuntu下的dev下有ram相关的文件,这些文 ...
- MongoDB 主从复制小实验
MongoDB 主从复制小实验 操作环境描述:WIN8 64位操作系统,内装虚拟机为CentOS 5.5 32位系统. 操作描述:跟其他关系型数据库类似,在主库进行数据操作,将数据同步到从节点,从节 ...
- PS小实验-去除水印
PS小实验-去除水印 水印是一些品牌商覆盖在图片或视频上的一个商标logo或小文本,比如大家最讨厌的百度logo,作者本人也是比较讨厌水印的,让好端端的一张图片变得美中不足. 个人觉得用photosh ...
- arduino新入手体验:三个小实验
新入手体验:三个小实验 一:一个LED闪烁 控制要求:1个LED灯,每隔50ms闪烁一次 实物连接图: 控制代码: //2018.6/11 ;//定义数字接口10,对应 void setup() { ...
- [na]出口选路pbr小实验视频
什么是策略路由? 一般都是部署在出口路由器,用于路径强制分发的, 优先级高于路由表. 策略路由小实验视频 这个是读书时候录的一个策略路由小实验
- Hadoop之词频统计小实验
声明: 1)本文由我原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Ubuntu操作系统,hadoop1-2-1,jdk1.8.0. 3)统计词频工作在单节点的伪分布上,至于真正实 ...
- js中关于事件捕获与事件冒泡的小实验
1.事件冒泡:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div - ...
- 关于java中equals与==的区别的小实验
java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...
随机推荐
- JavaScript中数组中的方法:push()、pop()、shift()、unshift()、slice()、splice()、reverse()、join()、split()、concat()、indexOf()、forEach()、map()、
1.创建数组的几种方法 //a).通过new来创建数组,new可以省略 var arr=new Array(); var arr=Array(); //b). .通过new来创建数组,并且赋值 v ...
- eclipse启动时发生的Initializing Java Tooling错误
eclipse在启动发生An internal error occurred during: "Initializing Java Tooling". java.lang.Null ...
- Django创建超级用户出现错误
如果运行python manage.py createsuperuser出现一大堆错误代码 解决方案: 1.检查settings.py中的DATABASE配置确定正确性 2.执行python mana ...
- Python3 tkinter基础 Canvas create_rectangle 画虚边的矩形 create_oval 画椭圆形 圆形
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Django框架(六) Django之模板继承
模版导入和继承 模版导入 一个页面只能继承一个模板,如何解决了?如何使用多个模板,或者引入其他页面 <% include "a.html" %> 可以引用多次 模板,i ...
- Android灯光系统框架分析【转】
本文转载自: 首先别人的APP要能直接访问到你写的硬件或者不经过任何修改的APP能直接使用你的驱动,就需要使用系统自带的JNI,所以我们需要写出符合系统自带JNI文件的HAL文件和驱动程序,下面具体分 ...
- gimp的使用笔记
gimp是德国的开源软件! 跟其他软件一样, 包括file, edit, view, 还有select, color , filter, 和 window. 窗口window就包括所有的dockabl ...
- 【做题】TCSRM591 Div1 500 PyramidSequences——数形结合&思维
题意:定义高度为\(x\)的金字塔数列为周期为\(2x-2\)的无限数列.它的每一个周期都是形如\(1,2,...,x-1,x,x-1,...,2\)的形式.记高度为\(x\)的金字塔数列第\(i\) ...
- c# 之继承、封装、多态
虽然理解了继承和封装,但是多态总是忘记其定义,很容易被忽略,通过这一次的查找资料和总结能帮助自己更好的理解 1/多态的概念: 同一操作作用于不通过的对象,可以有不同的解释,产生不同的执行结果,这就是多 ...
- LOJ6285 数列分块入门9(分块)
昨天对着代码看了一晚上 然后今天终于在loj上过了 数列分块入门9题撒花★,°:.☆( ̄▽ ̄)/$:.°★ . 然后相当玄学 块的大小调成\(\sqrt{n}\)会TLE,改成150就过了 啧 然后就 ...