zoukankan      html  css  js  c++  java
  • OD调试3--reverseMe

    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:逆向算法:待续。。。

     

     

     

  • 相关阅读:
    flume自定义source
    flume自定义sink之文件
    - Exception follows. org.apache.flume.FlumeException: java.net.BindException: Address already in use
    flume自定义sink之mysql
    Vue 【事件&样式】样式
    选择器
    rem
    表格和表单
    双飞翼布局、圣杯布局
    三栏布局
  • 原文地址:https://www.cnblogs.com/yunji5566/p/4250154.html
Copyright © 2011-2022 走看看