使用汇编语言实现if else 循环函数调用的具体方法

需要使用汇编来演示如下代码 需要下载ollydbg汇编调试器 点击File-Open随意打开一个exe文件 我这里随便找到c:/windows/explorer.exe文件

这里EIP的值表示下一次运行需要执行的代码位置

双击 EIP红色地址 左边代码会自动跳转到对应的代码行 有了以下环节 接下来添加代码

如果替换的代码 占用的字节数 小于原始的代码数 会自动补充 nop空指令

一。实现 if else

MOV EAX,1 表示将1立即数 设置给EAX寄存器

CMP EAX,1 比较EAX的值和1是否相等 Z标志位(如果减法运算 结果为0 该标志被置为1 不为0 标志位被置为0) 这里EAX=1 Z标志=1

JE 0101A572 表示有条件跳转 当Z标志=1(也就是EAX=1) 自动跳转到后面指定的0101A572 地址 就会执行 move EBX,1

JNE 0101A578 表示有条件跳转 当Z标志=0(也就是EAX!=1) 自动跳转到后面指定的0101A578 地址 就会执行 move ECX,1

如果需要调试 参考如下图

二。实现 循环

MOV ECX,4 表示将4立即数 设置给ECX寄存器

DEC ECX 将ECX的值 减去1

TEST ECX,ECX TEST指令是将ECX和ECX进去逻辑与 操作 1001&1001一定是自己1001 只有当ECX等于0时 0&0就是0 这个test指令 会修改Z标志

位 如果ECX等0 那么逻辑与 Z标志位就是1 ECX不等于0 Z标志位等于0 所以TEST ECX,ECX可以判断ECX是否为0

JNE 0101A564 表示有条件跳转 当ECX!=0时 z标志位=0 跳转到0101A564这个位置 继续递减 一直循环到 ECX=0时 此时z标志位=1

不执行跳转循环结束

也可以使用 LOOP 跳转的位置来进行循环 该指令会自动将ECX的值 递减1 不需要单独控制ECX递减 当ECX递减到0时自动退出循环

loop

二。实现 函数调用

这里需要明白一下函数调用的实际过程 是先将 参数压入栈中 在c语言中 stdcall 先压入函数右边的参数 这里假设有两个参数10和20

栈的原理是 先入后出 压入两个参数后 call指令会自动压入 函数调用完成后 下一个执行指令的位置

PUSH 10 压入第一个参数

PUSH 20 压入第二个参数

CALL 0101A56D 调用函数 函数的入口地址是0101A56D 可以查看如下图片中右下角堆栈的部分 分别压入了 10,20 以及call后面的一句代码的地址

0101A568 也就是call完成了执行0101A568 这里的代码

call 0101A56D 会自动跳转到0101A56D 代码的位置 这里取出栈中(ESP指向栈顶 栈顶是call完成后返回的地址) ESP栈顶+4(第二个参数) ESP栈顶+8(第一个参数)

retn 8 表示 函数返回 返回 就会自动跳转到栈顶指向的地址的代码位置0101A568 就会执行 (8这个数 表示自动将堆栈中两个参数的值出栈 抛弃)

jmp 0101A57A

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令

    汇编语言是依赖于计算机的低级的程序设计语言. RCL(带进位循环左移)指令把每一位都向左移,进位标志位复制到 LSB,而 MSB 复制到进位标志位: 如果把进位标志位当作操作数最高位的附加位,那么 RCL 就成了循环左移操作.下面的例子中,CLC 指令清除进位标志位.第一条 RCL 指令将 BL 最高位移入进位标志位,其他位都向左移一位.第二条 RCL 指令将进位标志位移入最低位,其他位都向左移一位: clc                             ; CF = 0 mov bl

  • 使用汇编语言实现if else 循环函数调用的具体方法

    需要使用汇编来演示如下代码 需要下载ollydbg汇编调试器 点击File-Open随意打开一个exe文件 我这里随便找到c:/windows/explorer.exe文件 这里EIP的值表示下一次运行需要执行的代码位置 双击 EIP红色地址 左边代码会自动跳转到对应的代码行 有了以下环节 接下来添加代码 如果替换的代码 占用的字节数 小于原始的代码数 会自动补充 nop空指令 一.实现 if else MOV EAX,1 表示将1立即数 设置给EAX寄存器 CMP EAX,1 比较EAX的值和

  • ArrayList在for循环中使用remove方法移除元素方法介绍

    有时候我们需要在一个ArrayList的for循环中动态删除元素的需求, 废话不多说看代码 List<Integer> list = new ArrayList<Integer>(); list.add(0); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); list.add(7); //正常循环 for (int i = 0; i < list.size(); i++

  • JavaScript实现显示函数调用堆栈的方法

    本文实例讲述了JavaScript实现显示函数调用堆栈的方法.分享给大家供大家参考,具体如下: 许多大型的JavaScript应用程序间的函数调用关系是非常复杂的,在开发或者调试过程中,经常需要跟踪某个函数是由哪些函数调用后才触发执行的,弄清楚这些函数的调用顺序对我们理解代码的数据流向是非常重要的. Firebug提供了console.trace()来显示函数堆栈,在需要调试的地方加上下面的一行代码就能显示该函数调用时的上下文关系.IE6就没有这么方便了,它没有提供显示函数堆栈的工具,当不可避免

  • php对关联数组循环遍历的实现方法

    本文实例讲述了php对关联数组循环遍历的实现方法.分享给大家供大家参考.具体分析如下: php对于类似 $age = array("zhangshan"=>14,"lisi"=>15,"sharejs"=>16); 这样的数组可以通过foreach的方法进行遍历,下面是详细的代码: $age = array("zhangshan"=>14,"lisi"=>15,"sh

  • MySQL实现创建存储过程并循环添加记录的方法

    本文实例讲述了MySQL实现创建存储过程并循环添加记录的方法.分享给大家供大家参考,具体如下: 先创建,然后调用: -- 创建存储过程 DELIMITER;// create procedure myproc() begin declare num int; set num=1; while num <= 24 do insert into t_calendar_hour(hourlist) values(num); set num=num+1; end while; commit; end;/

  • Jquery循环截取字符串的方法(多出的字符串处理成"...")

    如下所示: $('a[rev="title"]').each(function () { var u = $.trim($(this).html()); $(this).html(SetSub(u, 10)) }); SetSub相当于substr 以上这篇Jquery循环截取字符串的方法(多出的字符串处理成"...")就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • jQuery及JS实现循环中暂停的方法

    本文实例讲述了jQuery及JS实现循环中暂停的方法.分享给大家供大家参考.具体分析如下: 问题: jquery对数组进行循环,如果要求每次循环的时候暂停2秒钟,在使用jQuery的.earch循环的时候,无论怎么设置,都不会暂停. setTimeout也只是在第一次执行的时候暂停. 原因猜测: js开始执行多线程? 改进: 改为setInterval来控制循环,达到数组最大值的时候,clearInterval取消循环. 以下是jQuery代码: <script type="text/ja

  • python装饰器-限制函数调用次数的方法(10s调用一次)

    这是博主最近一家大公司的面试题,写一个装饰器,限制函数每10s调用一次.当时是笔试的,只写了大概的代码,回来后温习了python装饰器的基础知识,把代码写完了.决定写篇博客记录下. 装饰器分为带参数得装饰器以及不带参数得装饰器. #不带参数的装饰器 @dec1 @dec2 def func(): ... #这个函数声明等价于 func = dec1(dec2(func)) #带参数的装饰器 @dec(some_args) def func(): ... #这个函数声明等价于 func = dec

  • ajax获得json对象数组 循环输出数据的方法

    如下所示: var obj= [{id: 1, pId: 0, name: "采购商品", open: true}, {id: 2, pId: 1, name: "雨伞2", open: true}, {id: 2, pId: 1, name: "雨伞2", open: true}, {id: 2, pId: 1, name: "雨伞2", open: true}]; var x=''; $.each(obj, functio

随机推荐