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

 更新时间:2020年01月19日 14:26:02   转载 作者:liaomin416100569  
这篇文章主要介绍了使用汇编语言实现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


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

相关文章

  • 汇编语言中mov和lea指令的区别详解

    汇编语言中mov和lea指令的区别详解

    指令(instruction)是一种语句,它在程序汇编编译时变得可执行。本文给大家总结一下汇编语言中mov和lea指令的区别详解,感兴趣的朋友跟随小编一起看看吧
    2020-01-01
  • 汇编语言AAD,DAA,DAS用法解析

    汇编语言AAD,DAA,DAS用法解析

    这篇文章主要介绍了汇编语言AAD,DAA,DAS用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Windows10下利用DOSBOX和MASM32搭建汇编语言开发环境

    Windows10下利用DOSBOX和MASM32搭建汇编语言开发环境

    这篇文章主要介绍了Windows10下利用DOSBOX和MASM32搭建汇编语言开发环境,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 什么是汇编语言

    什么是汇编语言

    汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言
    2020-01-01
  • 汇编 JCC指令表与笔记

    汇编 JCC指令表与笔记

    这篇文章主要介绍了汇编 JCC指令表与笔记,需要的朋友可以参考下
    2020-01-01
  • C 表达式中的汇编指令

    C 表达式中的汇编指令

    这篇文章主要介绍了C 表达式中的汇编指令,需要的朋友可以参考下
    2020-01-01
  • 汇编实现简单选择排序的方法示例

    汇编实现简单选择排序的方法示例

    这篇文章主要介绍了汇编实现简单选择排序的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 详解汇编语言中中括号[]作用及lea和mov指令的区别

    详解汇编语言中中括号[]作用及lea和mov指令的区别

    这篇文章主要介绍了汇编语言中中括号[]作用及lea和mov指令的区别,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 汇编语言之寄存器详解

    汇编语言之寄存器详解

    这篇文章主要介绍了汇编语言之寄存器详解,需要的朋友可以参考下
    2020-01-01
  • 汇编程序输出“Hello world”的实现

    汇编程序输出“Hello world”的实现

    这篇文章主要介绍了汇编程序输出“Hello world”的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01

最新评论