• JMP CALL RET


    一.JMP指令(修改EIP的值)(第一个修改EIP的指令)

    三种方法 :JMP 立即数

         JMP  寄存器

         JMP  内存

    EIP 之前介绍过,EIP存放的值就是cpu下一次要执行的地址

    1.之前学过要修改一个通用寄存器的值,mov指令就可以完成,但是mov这个指令时不允许修改EIP寄存器的

     

    所以可以使用JMP 1(本质的作用效果其实和mov eip ,1一样)

     

     

    例子1:将EIP修改为004183F4,程序也会跳到004183F4执行 

     

    例子2:后面跟寄存器

           

      例子3 :后面跟内存(注意 跟内存的时候只能使用dword,因为其本质是修改EIP里面的值 但是EIP是32位的 ,所以只能用dword)

     二.call指令(也是修改EIP的指令)(相对来说比JMP复杂一些)

    call指令做了哪些事?

    (之前要想让代码一行行执行 按F8   但是编写call指令的时候,执行得按F7)

    比如

     第一件事就是就是修改了EIP,把call后面的值放到EIP中

    第二件事情 他会把当前指令的下一行地址 存到了堆栈中

     

     所以call 

    总结一下 call和jmp唯一的区别就是call会把下一行指令放到堆栈中(相应的ESP的值也会改变)

    三.RET指令

    RET指令做的事情就是

     

     例子 :执行之前(观察红圈的三个地方)还有堆栈里面的值

                 堆栈里面的值  

     

     F8执行之后

     

     所以由变化可以看出ret做的事情

    第一件事情:把当前栈顶的值放入EIP 里,响应的cpu也就跳到EIP里指定的地址

    第二件事情就是栈顶指针+4,也即是ESP+4。

    四,拓展(反调试之Fake  F8

    目的就是让F8失效 ,反调试 让别人不太容易看懂

    4.1    F7和F8

     

      F7和F8都是使程序单行执行 唯一出现区别的时候就是执行call指令的时候,一个call里面可能由很多条指令,F7会去把call指令做的事情一步步做,但是F8则把call指令包括里面的程序一下子全执行完 ,紧接着下面设置断点,不执行了。

     断点:程序停止的地方 也可以自己设置断点F2,那么程序走到你设置的位置也就会停下来.

     之后是如何将f8废掉的,还是视频表达的更加清楚https://www.bilibili.com/video/av67934684?p=20

     总结一下,call指令在执行的时候会把程序下一步 的地址放在堆栈的栈顶的值当中,然后ret会把栈顶的值(也就是下一步程序进行的地址)放回到EIP 让cpu执行完call,接着执行下一条。所以破解人员想追踪程序的运行,会在call指令执行之后再执行一个ret,这样程序就回到正常程序call完成之后的下一步,程序也就是一步步的进行 。(一个ret会让 破解人员知道程序下一步在哪执行)

    反调试也就是将call执行完之后 ,用mov指令修改ESP地址里面的值之后 ,这样栈顶的值也就是被修改,然后如果破解的人写一个ret,那么就会返回一个错误的 下一步地址 给EIP 导致破解人员不知道程序下一步到底在哪。

  • 相关阅读:
    简单实现 C# 与 Javascript的兼容
    如何写好CSS系列之表单(form)
    D3、openlayers的一次尝试
    如何写好css系列之button
    mockjs,json-server一起搭建前端通用的数据模拟框架
    AIX中的/etc/inittab文件
    AIX中crontab和at 定时任务
    AIX中的服务管理
    AIX系统的备份和恢复
    AIX中磁带设备的使用
  • 原文地址:https://www.cnblogs.com/cat47/p/12270025.html
Copyright © 2020-2023  润新知