• OllyDebug调试技巧(二)


    Chinese:

    1、32位寄存器要熟悉,EAX,EBX,ECX,EDX是数据寄存器,ESI和EDI是变址寄存器,这些寄存器一般可以随意使用

    EAX: 扩展累加寄存器

    EBX: 扩展基址寄存器

    ECX: 扩展计数寄存器

    EDX: 扩展数据寄存器

    ESI: 扩展来源寄存器(源地址)

    EDI: 扩展目标寄存器(目的地址)

    2、指针寄存器EBP,ESP,EIP

    EBP: 扩展基址指针寄存器

    ESP: 扩展堆栈指针寄存器

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

    注意这三个寄存器,EBP主要用于栈和栈帧;ESP指向当前进程的栈空间地址;EIP总是指向下一条要执行的指令。

    3、栈的地址是从高地址到低地址。

    4、在反汇编的过程中,经常要找Call,其实Call xxx就是push eip,然后jmp xxx,执行完就ret到Call指令所在的地址。

    5、Call的几种方式

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

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

    call dword ptr [eax]; Call的是eax里面存的地址的值

    call dword ptr [eax+5]; Call的是eax里面存的地址+5后的值

    call dword ptr [<&API>]; Call一个系统api

    6、在反汇编中会经常遇到Test指令,Test指令和And指令一样,对两个操作数进行位于运算,只是不将结果保存,操作后对标志位重新置位。该指令在反汇编中99%是test eax, eax(如果eax为0,则ZF位置1)......

    7、在反汇编的过程中经常遇到条件跳转指令

    8、在条件跳转指令前也会经常遇到cmp指令

    cmp a, b

    如果a-b=0, 则ZF置1

    无符号时:

    CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时a<b

    CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时a>b

    有符号时:

    若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,a>b

    若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为a<b

    若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出a<b

    若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出a>b

    最后两个可以作出这种判断的原因是,溢出的本质问题:

    两数同为正,相加,值为负,则说明溢出

    两数同为负,相加,值为正,则说明溢出

    故有,正正得负则溢出,负负得正则溢出

  • 相关阅读:
    bzoj 3779 重组病毒——LCT维护子树信息
    bzoj 4010 [HNOI2015]菜肴制作——贪心
    bzoj 2535 && bzoj 2109 [Noi2010]Plane 航空管制——贪心
    bzoj 3671 [Noi2014]随机数生成器——贪心(时间复杂度分配)
    bzoj 2395 [Balkan 2011]Timeismoney——最小乘积生成树
    bzoj 3157 && bzoj 3516 国王奇遇记——推式子
    bzoj 1101 [POI2007]Zap——反演
    hdu 4372 Count the Buildings——第一类斯特林数
    bzoj 2406 矩阵——有源汇上下界可行流
    bzoj 2039 [2009国家集训队]employ人员雇佣——二元关系
  • 原文地址:https://www.cnblogs.com/maplewan/p/3242145.html
Copyright © 2020-2023  润新知