使用汇编语言实现if else 循环函数调用的具体方法
这里EIP的值表示下一次运行需要执行的代码位置
双击EIP红色地址左边代码会自动跳转到对应的代码行有了以下环节接下来添加代码
如果替换的代码占用的字节数小于原始的代码数会自动补充nop空指令
一。实现ifelse
MOVEAX,1表示将1立即数设置给EAX寄存器
CMPEAX,1比较EAX的值和1是否相等Z标志位(如果减法运算结果为0该标志被置为1不为0标志位被置为0)这里EAX=1Z标志=1
JE0101A572表示有条件跳转当Z标志=1(也就是EAX=1)自动跳转到后面指定的0101A572地址就会执行moveEBX,1
JNE0101A578表示有条件跳转当Z标志=0(也就是EAX!=1)自动跳转到后面指定的0101A578地址就会执行moveECX,1
如果需要调试参考如下图
二。实现循环
MOVECX,4表示将4立即数设置给ECX寄存器
DECECX将ECX的值减去1
TESTECX,ECXTEST指令是将ECX和ECX进去逻辑与操作1001&1001一定是自己1001只有当ECX等于0时0&0就是0这个test指令会修改Z标志
位如果ECX等0那么逻辑与Z标志位就是1ECX不等于0Z标志位等于0所以TESTECX,ECX可以判断ECX是否为0
JNE0101A564表示有条件跳转当ECX!=0时z标志位=0跳转到0101A564这个位置继续递减一直循环到ECX=0时此时z标志位=1
不执行跳转循环结束
也可以使用LOOP跳转的位置来进行循环该指令会自动将ECX的值递减1不需要单独控制ECX递减当ECX递减到0时自动退出循环
loop
二。实现函数调用
这里需要明白一下函数调用的实际过程是先将参数压入栈中在c语言中stdcall先压入函数右边的参数这里假设有两个参数10和20
栈的原理是先入后出压入两个参数后call指令会自动压入函数调用完成后下一个执行指令的位置
PUSH10压入第一个参数
PUSH20压入第二个参数
CALL0101A56D调用函数函数的入口地址是0101A56D可以查看如下图片中右下角堆栈的部分分别压入了10,20以及call后面的一句代码的地址
0101A568也就是call完成了执行0101A568这里的代码
call0101A56D会自动跳转到0101A56D代码的位置这里取出栈中(ESP指向栈顶栈顶是call完成后返回的地址)ESP栈顶+4(第二个参数)ESP栈顶+8(第一个参数)
retn8表示函数返回返回就会自动跳转到栈顶指向的地址的代码位置0101A568就会执行(8这个数表示自动将堆栈中两个参数的值出栈抛弃)
jmp0101A57A
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。