二进制破解科普系列之ReverseMe

  • A+
所属分类:逆向工程


零、前言

本系列为二进制破解科普系列教程。教程面向新手爱好者,欢迎大家探讨、建议,大牛轻喷。


壹、准备工作

在学习之前,我们需要了解以下的内容:

1.寄存器

寄存器就好比是CPU身上的口袋,方便CPU随时从里边拿出需要的东西来使用。常见涉及到的九个寄存器:

Ø EAX:扩展累加寄存器

Ø EBX:扩展基址寄存器

Ø ECX:扩展计数寄存器

Ø EDX:扩展数据寄存器

Ø ESI:扩展来源寄存器

Ø EDI:扩展目标寄存器

Ø EBP:扩展基址指针寄存器

Ø ESP:扩展堆栈指针寄存器

Ø EIP:扩展的指令指针寄存器

这些寄存器的大小是32位(4个字节),他们可以容纳数据从0-FFFFFFFF(无符号数),除了以下三个寄存器,其他我们都可以随意使用:

Ø EBP:主要是用于栈和栈帧。

Ø ESP:指向当前进程的栈空间地址。

Ø EIP:总是指向下一条要被执行的指令。

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

FILOFisrt In Last Out,先进后出)

地址反向增长(栈底为大地址,栈顶为小地址)

二进制破解科普系列之ReverseMe
 

3.CALL指令

call有以下几种方式:

call 404000h ;直接跳到函数或过程的地址

call eax ;函数或过程地址存放在eax

call dword ptr [eax]

4.系统API

Windows应用程序运行在Ring3级别

二进制破解科普系列之ReverseMe
 

API函数,我们也称之为系统提供给我们的接口。因为系统只信任自己提供的函数,所以我们要通过API才能实现对内核的操作。

5.mov指令

mov指令格式:mov dest, src

这是一个很容易理解的指令,mov指令将src的内容拷贝到destmov指令总共有以下几种扩展:movs/movsb/movsw/movsd ediesi:这些变体按串/字节//双字为单位将esi寄存器指向的数据复制到edi寄存器指向的空间。movsx符号位扩展,byte->wordword->dword (扩展后高位全用符号位填充),然后实现movmovzx零扩展,byte->wordword->dword(扩展后高位全用0填充),然后实现mov

6.cmp指令

cmp指令格式:cmp dest, src

cmp指令比较destsrc两个操作数,并通过比较结果设置C/O/Z标志位。

cmp指令大概有以下几种格式:

cmp eax, ebx ;如果相等,Z标志位置1,否则0.

cmp eax, [404000] ;eax404000地址处的dword型数据相比较并同上置位。

cmp [404000], eax ;同上。

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

在逆向中,你真正需要关心的标志位只有三个,也就是cmp指令能修改的那三个:Z/O/C

Z标志位(0标志),这个标志位是最常用的,运算结果为0时候,Z标志位置1,否则置0

O标志位(溢出标志),在运行过程中,如操作数超出了机器能表示的范围则称为溢出,此时OF位置1,否则置0

C标志位(进位标志),记录运算时从最高有效位产生的进位值。例如执行加法指令时,最高有效位有进位时置1,否则置0

8.逻辑运算

二进制破解科普系列之ReverseMe
 

9.test指令

test指令格式:test dest, src

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

10.条件跳转指令

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

 

贰、破解ReverseMe二进制破解科普系列之ReverseMe

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

LoadIconA :图片的图标

CreateFileA:创建文件

二进制破解科普系列之ReverseMe

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

二进制破解科普系列之ReverseMe

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

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

二进制破解科普系列之ReverseMe

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

二进制破解科普系列之ReverseMe

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

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

ReadFile:读取一个文件

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

  •  test指令格式:test dest, src

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

  •  jnz条件跳转

  •  jmp:无条件跳转

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

二进制破解科普系列之ReverseMe

二进制破解科普系列之ReverseMe


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

二进制破解科普系列之ReverseMe

二进制破解科普系列之ReverseMe


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

二进制破解科普系列之ReverseMe

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

二进制破解科普系列之ReverseMe
 

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

二进制破解科普系列之ReverseMe

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

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

二进制破解科普系列之ReverseMe

那我们为了跳转不实现的话,我们到到寄存器位置去设置我们SF或者OF里面的值,让他不!= 从而实现我们要的结果,我这里就让S=1变为S=0

二进制破解科普系列之ReverseMe 二进制破解科普系列之ReverseMe

 

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

二进制破解科普系列之ReverseMe

当我们继续走的时候,我们又看到一个跳转程序,其实这里的话,并不是什么陷阱,这里值得思考的是,并不是所以得跳转就让他实现或者不实现。这个已实现不会跳到密钥区。


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

二进制破解科普系列之ReverseMe

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

二进制破解科普系列之ReverseMe

 

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

二进制破解科普系列之ReverseMe

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

二进制破解科普系列之ReverseMe

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

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

二进制破解科普系列之ReverseMe

程序下载链接:http://pan.baidu.com/s/1nucZRol 密码:4zsl

本文作者:whitecell-club.org  Wens0n

文章欢迎转载,转载请保留作者与出处


二进制破解科普系列之ReverseMe

 


本文始发于微信公众号(WhiteCellClub):二进制破解科普系列之ReverseMe

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: