首页 > 编程知识 正文

十进制转二进制算法,ollydbg破解入门教程

时间:2023-05-05 12:02:03 阅读:129223 作者:4238

小甲鱼 视频教程(4、5集):https://www.bilibili.com/video/av6889190?p=4

实验程序reverseME.exe下载地址: https://pan.Baidu.com/s/18 nd v3rq _ yv _ qzurnrymqja提取代码: e91j

3358 www.360doc.com/content/16/0220/00/26186435 _ 535858733.shtml

0. 前言

本系列是对科普系列教程的二进制解读。 教程面向初学者的粉丝,欢迎大家的探讨、建议。 单身前辈轻喷。

1 .准备工作

在学习之前,你需要了解以下内容。

1.寄存器:

寄存器就像CPU的口袋,方便CPU随时从里面取出需要的东西使用。 经常相关的9个寄存器:

EAX :扩展累加寄存器EBX :扩展基址寄存器ECX :扩展计数器寄存器EDX :扩展数据寄存器ESI :扩展源寄存器EDI :扩展目标寄存器EBP :扩展基址报告指针寄存器EIP :扩展堆栈指针寄存器EIP :的指令指针寄存器这些寄存器的大小为32位(4字节),它们可以存储从0-fffffffffff到无符号数的数据。 以下3个寄存器以外可以自由使用。

EBP :主要用于堆栈和堆栈帧。 ESP :指向当前进程的堆栈区域地址。 EIP :始终指向下一个要执行的命令。

2. 栈:栈是在内存中的一部分,它有两个特殊的性质:

Filo(fisrtinlastout,先进先出)地址反向增加(堆栈下大地址、堆栈上小地址)图标:

3. CALL指令

呼叫有以下方法:

call404000h; 直接跳转到函数或过程的地址calleax; 函数或过程地址存储在eaxcalldwordptr[eax]中

4. 系统API

windows APP应用程序在Ring3级别执行

API函数也称为系统提供的接口。 因为系统只信任自己提供的函数,所以实现内核操作需要API。

5. mov指令

mov指令格式: movdest,src。 这是一个简单易懂的指令,mov指令将src的内容复制到dest中,

mov指令具有名为movs/movsb/movsw/movsdedi、esi的扩展功能。 这些变化以串行/字节/字/双字为单位,将esi寄存器指向的数据复制到edi寄存器指向的空间中。 movsx符号比特扩展、字节-字、字-字(扩展后的高位全部用符号比特填充),然后实现mov。 实现movzx零扩展、byte-word、word-dword (扩展后的高位均由0填充)以及mov。

6. cmp指令

cmp指令格式: cmpdest,src。 cmp指令比较dest和src两个操作数,并根据比较结果设定C/O/Z标志位。

cmp命令有以下格式:

cmpeax,ebx; 如果等于,则为z标志位置1,否则为0.cmpeax,[404000]; 将eax与404000地址的dword型数据进行比较,形成相同的集。 cmp[404000],eax; 同上。

7. 标志位:在破解中起到的作用是至关重要的。

相反,你真正需要关心的标志位只有三个。 也就是说,cmp命令只能修改三个Z/O/C。

z标志位(0标志),该标志位最常用,运算结果为0时,z标志位置设定为1,否则设定为0。 o标志位(溢出标志)在运行过程中,在操作数超出机器可表现的范围时称为溢出,此时设定为OF位置1,否则设定为0。 c标志位(进位标志)记录运算时从最高位产生的进位值。 例如,执行加法指令时,最高位有进位时设为1,没有时设为0。

8. 逻辑运算

图:

>9.test 指令

test 指令格式:test dest, src。这个指令 和 and 指令一样,对两个操作数进行按位的 ‘与’ 运算,唯一不同之处是不将 ‘与’ 的结果保存到 dest。即本指令对两个操作数的内容均不进行修改,仅是在逻辑与操作后,对标志位重新置位。

 

10. 条件跳转指令

条件跳转指令,就是根据各种不同标志位的条件判断是否成立,条件成立则跳转。

 

 

2. 破解 ReverseMe

 

按 F3 载入程序:

首先,我们来看看程序图,我们先随便的走一次,顺便介绍对应的名词。

LoadIconA  : 图片的图标
CreateFileA: 创建文件

当 跳转不实现的时候,就执行下面的代码段:

然后弹出消息框,结束进程。

我们的目的是想让他跳转实现,那我们怎么办呢?就得跳过上面的代码段,我们如何来修改对应的代码段,来实现我们所要的效果呢?

要让他跳转实现的话,修改对应的 Z=0 就实现跳转。

这里已经实现跳转了,我们这节课肯定不像上面的课程那么简单了,直接一步到位,我们这节课的话,需要跳转几个位置,要不然我们怎么能突破障碍呢?

那接下来,我们继续走我们的调试文件!

ReadFile:读取一个文件

这里我们要明白为什么要去ReadFile呢?因为这里的话,要去读取一个密钥的文件,所以这里才需要ReadFile。

 test 指令格式:test dest, src

 test 指令和 and 指令一样,对两个操作数进行按位的‘与’运算,唯一不同之处是不将‘与’ 的结果保存到dest。

 jnz条件跳转

 jmp:无条件跳转

一般我们想让条件跳转判断的话,看如下图:

我们又遇到一个跳转未实现的值,其实在这里也是一个坑来的,那我们和上面一样,让他跳转的值实现。同样把寄存器区的Z值修改为 Z=0 从而达到跳转的效果。

ebx 的值等于 0 的话可以看看寄存器上的 ebx 的值。

这里看到的是xor的条件判断,对相应的值清0

下面我们走到的密钥区,如下图所示:

我们可以看到这里的跳转已实现,那想想这里是不是我们的第三个障碍呢?

分析到下面的语句,发现这里要是直接走下去的话,会误人程序的陷阱,那我们的目的只能让跳转不实现了,j1的跳转判断的话,可以看我们上面的跳转图。要让jl不实现的话,我们这里需要让SF!=OF,从而达到我们想要的效果。

就可以达到跳转不实现,我们跳过这个障碍之后,我们继续走,继续看我们的程序。

继续走我们的程序,我们又遇到一个跳转已实现的,分析到下面的代码,发现会跳转到密钥区,所以我们继续让他不实现。看他的条件语句:

让SF!=OF的值相等就行,那在这里修改S的值,让S=1变为S=0就可以达到所要的效果。

通过修改后,可以看到跳转未实现。

接下来,我们继续走我们的程序,走到jmp是无条件跳转,就让他跳吧。

我们跳转到这里的话,我们看到text里面的提示:You really did it! Congratz !!! 提示你破解已经成功咯。

是不是有点小小的激动呢?

 

 

以上都是 根据  [鱼C]小甲鱼主讲OD使用教程(第4、5集):https://www.bilibili.com/video/av6889190/?p=4

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。