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. Contains Duplicate,Contains Duplicate II,Contains Duplicate III

    217. Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your ...

  2. Java中的try/catch/finally

    样例1: public class Test{ public static String output = ""; public static void foo(int i){ t ...

  3. C#设置鼠标在控件上面时,改变光标形状

    //设置鼠标在控件上面时,改变光标形状 private void pictureBox_macroLogo_MouseHover(object sender, System.EventArgs e) ...

  4. Hibernate学习笔记(一):mycelipse建立项目流程(未完成)

    1.部署数据库: 2.部署项目: 3.引入Hibernate: 4.url配置

  5. C++ 使用cl命令编辑时发生的问题收录

    1.cl不是内部或这外部命令,也不是可运行的程序或批处理文件. 这个问题的出现的原因是因为系统找不到cl命令处理程序,无法识别,解决办法: 首先在C盘查找cl.exe,可能会查到多个,先选择第一个,将 ...

  6. 实现android apk反编译后代码混淆

    通常情况下我们需要对我们开发的android代码进行混淆,以免代码在反编译时暴露敏感信息及相关技术代码: 反编译测试工具:onekey-decompile-apk-1.0.1. 在高级版本的adt创建 ...

  7. NPAPI开发常识

    其实,就在几天前,我根本不知道什么是NPAPI插件.因为最近的项目中用到需要在非IE下检测客户端是否安装,最终找到浏览器插件NPAPI. 以下资料来源于网络收集,以此给那些和我一样迷茫的人.本文的目的 ...

  8. [TYVJ] P1026 犁田机器人

    犁田机器人 背景 Background USACO OCT 09 2ND   描述 Description Farmer John為了让自己从无穷无尽的犁田工作中解放出来,於是买了个新机器人帮助他犁田 ...

  9. redhat 5下源码安装nginx服务

    首先确保机器中已安装 gcc c++,libtool等工具,保证可执行源码安装 A.为了确保能在 Nginx 中使用正则表达式进行更灵活的配置,安装之前需要确定系统是否安装有 PCRE(Perl Co ...

  10. PowerShell_零基础自学课程_9_高级主题:静态类和类的操作

    上次我们说到了,wmi对象和com组件,今天我们继续来看PS中对象的相关内容.主要说一下静态对象和对象的基本操作. 一.静态对象 在PS中有一类特殊的对象,我们不能同过这些类创建新的对象,这些类是不能 ...