• OllyDbg---循环、串操作和寻址方式


    循环 字符串指令和寻址方式

    循环

    XOR ECX,ECX
    MOV ECX,15H    
    
    LABEL:
    DEC ECX
    
    CMP ECX,0
    JNE LABEL
    

    LOOP

    • 重复循环,直到计数器的值为0,每次循环将计数器的值减1,如果计数器为0就跳转到指定地址,比如loop short 401007。

    LOOPZ,LOOPE

    • 重复循环,直到零标志位Z被置为1。

    LOOPNZ,LOOPNE

    • 重复循环,直到零标志位被置为0。

    • LOOPZ, LOOPNZ指令还需要检查零标志位,只有计数器的值和零标志位Z都满足条件时才会循环。

    串操作

    MOVS

    • 从一个地址向另一个地址复制数据,源地址保存在ESI寄存器中,目的地址保存在EDI寄存器中。
    • 拷贝4个字节的内容时,还可以写为MOVSD,拷贝两个字节的内容时可以写为MOVSW,拷贝一个字节的内容时可以写为MOVSB。
    • MOVS指令不能将数据拷贝到没有写入权限的内存单元中,强制写入的话会引发异常。

    REP

    • 可以作为一些指令的前缀,尤其MOVS指令,该前缀表示当前指令需要执行的次数ECX,每次循环计数器ECX的值递减1,和循环一样。
    • REP MOVS则不一定拷贝4个字节的内容,它拷贝的大小是 每次拷贝的大小乘上计数器ECX。

    LODS

    • 该指令是从源地址拷贝数据到EAX中
    • REP也可以搭配LODS指令配合使用,重复执行直到计数器ECX的值为0。
    • 一次拷贝两个字节的内容的指令为LODSW,一次拷贝一个字节的内容的指令为LODSB。

    STOS

    • 该指令是将EAX的值拷贝到寄存器EDI指向的内存单元中。
    • 该指令也可以搭配REP使用
    • 每次操作两个字节的STOSW指令和每次操作一个字节的STOSB指令。

    CMPS

    • 该指令是比较ESI和EDI指向内存单元的内容。
    • 该指令执行的是算数减法的运算,如果差值为0,零标志位Z会被置为1。
    • 由于该指令影响零标志位Z,所以可以搭配REPZ/REPE前缀指令来使用,直到计数器ECX的值为0或者零标志位被清0。
    • REPNZ/REPNE也可以搭配该指令使用。

    寻址方式

    直接寻址

    • 最简单的一种寻址方式,该指令的操作数包含一个具体的地址。

      MOV DWORD PTR [00513450], ECX
      MOV AX, WORD PTR [00510A25]
      MOV AL, BYTE PTR [00402811]
      CALL 452200
      JMP 421000
      

    间接寻址

    • 许多程序使用间接寻址来完成一些复杂的操作,在刚开始分析调试的时候真实地址并不会显示出来,直到执行到这条指令时,查看相应寄存器的值才能知道真实的地址。

    • 如果想在指令执行之前看到真实的地址,需要在该指令上下断点,断下来以后查看寄存器的值或者查看解释窗口中的提示信息。

      MOV DWORD PTR[EAX], ECX
      CALL EAX
      JMP [EAX+4]
      
  • 相关阅读:
    Spring中通配符问题
    <context:component-scan>子标签:<context:include-filter>和<context:exclude-filter>使用时要注意的地方
    (转)Spring常见注解总结
    (转)Spring常用注解
    spring配置文件引入properties文件:<context:property-placeholder>标签使用总结
    (转)Java多线程学习(吐血超详细总结)
    Druid连接池(四)
    sublime自动保存设置
    情感分类
    psvm中String [] args 理解
  • 原文地址:https://www.cnblogs.com/KX-Lau/p/12929088.html
Copyright © 2020-2023  润新知