OD调试3:reverseMe.exe(reverse就是逆向的意思)

运行效果图:

1关于寄存器

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

a)         EAX:扩展累加寄存器

b)         EBX:扩展基址寄存器

c)         ECX:扩展计数寄存器

d)         EDX:扩展数据寄存器

e)         ESI:扩展来源寄存器

f)          EDI:扩展目标寄存器

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

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

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

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

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

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

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

2关于栈

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

g)         FILO(Fisrt In Last Out,先进后出)

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

3关于CALL指令

call XXX; 等于 push eip; 然后 jmp XXX;

call有以下几种方式:

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

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

–      call dword ptr [eax]

–      call dword ptr [eax+5]

–      call dword ptr [<&API>] ;执行一个系统API

4.关于系统API

Windows应用程序运行在Ring3级别(包括OllyDBG)

  但有时候需要Ring0级别才能进行操作,那咋整?我们可以通过系统为我们搭建的桥梁:API函数,也称之为系统提供给我们的接口。因为系统只信任自己提供的函数,所以我们要通过API才能实现对内核的操作。你可以这么想,假如我送给你一辆法拉利跑车,恩,你没听错,是假如,不是真的!那你要怎么来驾驶她?没错,要通过踩油门来加速,要通过打方向盘来转弯……而油门,方向盘就是所谓的接口,对于法拉利来说,它们就是API函数。

5.关于mov指令

  • mov指令格式:mov dest, src
  • 这是一个很容易理解的指令,mov指令将src的内容拷贝到dest,mov指令总共有以下几种扩展:

–      movs/movsb​​/movsw/movsd edi,esi:这些变体按串/字节/字/双字为单位将esi寄存器指向的数据复制到edi寄存器指向的空间。

–      movsx符号位扩展,byte->word,word->dword (扩展后高位全用符号位填充),然后实现mov。

–      movzx零扩展,byte->word,word->dword(扩展后高位全用0填充),然后实现mov。

6.关于cmp指令

  • cmp指令格式:cmp dest, src
  • cmp指令比较dest和src两个操作数,并通过比较结果设置C/​O/Z标志位。
  • cmp指令大概有以下几种格式:

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

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

–      cmp [404000], eax ;同上。

7.标志位

  • 这个概念在破解中起到的作用是至关重要的。
  • 事实上所有的标志位归并与一个32位的标志位寄存器,也就是说有32个不同的标志位。
  • 每个标志位有两个属性:置1或置0,就相当于我们平时说的OK或不OK。
  • 在逆向中,你真正需要关心的标志位只有三个,也就是cmp指令能修改的那三个:Z/O/C。
    • Z标志位(0标志),这个标志位是最常用的,运算结果为0时候,Z标志位置1,否则置0。
    • O标志位(溢出标志),在运行过程中,如操作数超出了机器能表示的范围则称为溢出,此时OF位置1,否则置0。
    • C标志位(进位标志),记录运算时从最高有效位产生的进位值。例如执行加法指令时,最高有效位有进位时置1,否则置0。

8.逻辑运算

XOR:异或。存在相异的情况,为真

9. 关于test指令

  • test指令格式:test dest, src
  • 这个指令和and指令一样,对两个操作数进行按位的‘与’运算,唯一不同之处是不将‘与’的结果保存到dest。
  • 即本指令对两个操作数的内容均不进行修改,仅是在逻辑与操作后,对标志位重新置位。
  • 该指令的实战形态百分之九十九是酱紫:test eax, eax(如果eax的值为0,则Z标志位置1)

10. 关于条件跳转指令

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

11. patch

  • patch也就是我们平时所说的补丁。
  • 所谓给程序打补丁就是我们对程序破解所进行的修改。
  • OllyDBG的“/”可以查看所有打过的补丁。

实验内容:

way1:爆破/打补丁方式

cmp xxx xxx

jne xxxx

cmp之后一般跟跳转指令,是破解的关键地方。

标志位在破解中也起到至关重要的作用。

Z:zero flag(95%用到)

O:over flag

C:carry falg

标志位为1表示:是/ok

标志位为0表示:否/不ok

进入之后,F8到上图这个jnz时,经过试验,发现如果跳转未实现的话,会直接弹出失败信息的messagebox。

所以此处的jnz让它跳转实现。(方法:右侧的零标志位”Z”改为0)

接着往下走,此处的jnz同理也改为跳转实现。

凡是跳转到此地"keyfile is not valid.sorry"的跳转都要使之相反,否则依然失败。

碰到JL的跳转,改变方法如右图:

即是S标志位和O标志位不同,jl指令会跳转。不让它跳转的话,就将二者修改为相同,任意改其中一个都行。

现在来到此处jmp,发现已经连接到了跳转成功之处了!

下面添上我们需要的补丁,保存。

需要改为跳转的,用jmp汇编进去;

需要改为不跳转的,直接nop汇编。

打过的补丁查看如下图:

保存之后的文件,运行如下:

way2:逆向算法:待续。。。

OD调试3--reverseMe的更多相关文章

  1. OD调试篇7--笔记及解题报告

    MFC:微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows AP ...

  2. OD调试9—实例:深入分析代码完成软件破解

    OD调试9—实例:深入分析代码完成软件破解  爆破,是最初级的解决方案,不到万不得已,我们不直接修改JNZ通关.因为这样子的话,我们就享受不到破解.逆向的真正乐趣了. 了解程序背后按照剧情发展经常会出 ...

  3. OD调试学习笔记7—去除未注册版软件的使用次数限制

    OD调试学习笔记7—去除未注册版软件的使用次数限制 本节使用的软件链接 (想自己试验下的可以下载) 一:破解的思路 仔细观察一个程序,我们会发现,无论在怎么加密,无论加密哪里,这个程序加密的目的就是需 ...

  4. OD调试6—使未注册版软件的功能得以实现

    OD调试6—使未注册版软件的功能得以实现 本节使用的软件下载链接 (想动手试验的朋友可以下载来试试) 继续开始我OD调试教程的学习笔记. 本次试验对真正的程序进行逆向.(之前的都是为破解而专门设计的小 ...

  5. OD调试4--去除NAG窗口

    OD调试4--去除NAG窗口 nag本意是烦人的意思,nag窗口是软件设计者用来时不时提醒用户购买正版的警告窗口.软件设计者可能认为当用户忍受不了试用版中的这些烦人的窗口时,就会考虑购买正式版本. 一 ...

  6. OD调试2---TraceMe

    OD调试2---TraceMe 拆解一个Windows程序要比拆解一个DOS程序容易得多,因为在Windows中,只要API函数被使用,想对寻找蛛丝马迹的人隐藏一些东西是比较困难的.因此分析一个程序, ...

  7. OD调试1--第一个win32程序

    OD调试一:第一个Win32程序的修改 在软件开发的过程中,程序员会使用一些调试工具,以便高效地找出软件中存在的错误.而在逆向分析领域,分析者也会利用相关的调试工具来分析软件的行为并验证分析结果.由于 ...

  8. OD调试篇3-小软件破解1

    OD调试篇3-小软件破解1 要求如下图该软件需要改5个地方,其中1.2是软件未注册而设定限定的添加个数,3.4.5是软件显示的一些未注册的信息. 一. 1.按1运行程序,添加用户添加第五个时出现提示, ...

  9. OD调试篇1—Hello

    OD调试篇1—Hello 要求:通过OD将程序的标题“I love fishc.com”改为“I love you” 一.找到程序的标题“I love fishc.com” 1.把程序拖到OD运行出现 ...

随机推荐

  1. hdu 1215 七夕节

    Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" ...

  2. C++的学习记录 - 0

    最近玩Arduino发现,在编写函数库的时候要用到C++.正好手头有一本教材,于是时隔2年,开始重学. 又看到重载.构造.拷贝这些词竟然还有些小兴奋. 开个系列日志记录一下学习过程中的问题和体会. 看 ...

  3. jquery 实现 隐藏交替同时记住以前隐藏的样式

    /* * control menu show or hide(expand and collapse) */ var status = []; function menuOperation() { $ ...

  4. HTML5画布(矩形)

    canvas元素用于绘制图形. canvas元素是HTML5中新增的一个重要元素,元素本身是没有绘图能力,所有的绘制工作必须在javascript内部完成. 案例1: <!DOCTYPE htm ...

  5. Symfony2 Doctrine从现有Database生成Entity(转载自http://blog.it985.com/6809.html)

    在我的以前一章Symfony之十分钟入门说了怎样生成数据库,然后设计实体Entity,再同步数据库的表结构,一般我们的顺序都是这样:生成数据库->设计实体Entity->同步数据库表结构. ...

  6. Linux远程拷贝scp命令

    今天要从admin服务器将测试上修正content和image_count后的数据库更新到dz服务器. 首先需要备份数据库,使用mysqldump命令 整表全部备份:    mysqldump -u ...

  7. C++中初始化和定义对象的语法,带括号与不带括号的区别

    小记:运行环境:win xp  vs2008 #include <iostream>#include <string> using std::cout;using std::c ...

  8. Windows通用应用平台

    什么是 UWP? 很多程序员都有一个梦想:希望自己开发的软件能够轻而易举的在所有平台上运行,而不是把同样的需求,用不同的技术.工具重新开发才能够运行在所有平台上.这就是跨平台,很多软件从业者都在为这个 ...

  9. 什么是野指针?(What is a wild pointer?)

    未被初始化的变量称为野指针(wild pointer).顾名思义,我们不知道这个指针指向内存中的什么地址,使用不当程序会产生各种各样的问题. 理解下面的例子: int main() { int *p; ...

  10. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅳ

    2.4.4 堆的算法 我们用长度为 N + 1的私有数组pq[]来表示一个大小为N的堆,我们不会使用pq[0],堆元素放在pq[1]至pq[N]中.在排序算法中,我们只能通过私有辅助函数less()和 ...