C和汇编混合编程---栈平衡

最近在搞C和汇编混合编程,对栈平衡有点小理解,记录一下

  1. 当我们调用一个API或者子程序时时,API和子程序可以理解为函数,我们不必在返回的时候平衡栈里面的函数参数,但C语言库函数要我们自己平衡栈数据,
    比如下面的程序:
#include "stdio.h"
#include "windows.h"int main(int argc, char* argv[])
{printf("begin\n");HINSTANCE libHandle;char *dll="user32.dll";libHandle=LoadLibrary(dll);__asm{xor ebx,ebxpush ebxpush 0x61626364push 0x65666768mov  eax,esppush ebxpush eaxpush eaxpush ebx	mov  eax,dword ptr[MessageBox]call eax//mov esp,0x450add esp,12}return 0;
}

这段程序的功能是弹出MessageBox,我们最后平衡栈数据用到add esp,12,为什么是12呢?一共push了7次,应该是28啊!因为在stacall标准中,我们是不用考虑MessageBox参数的,MessageBox一共4个参数,

	push ebxpush eaxpush eaxpush ebx	

这4个push是不用我们管得,所以是12。但有一个我们要注意就是wsprintf,这个需要我们自己去平衡栈里面的参数数据
下面是调试的结果:
在运行到push 0x65666768,esp的值是
在这里插入图片描述
当运行完call eax,esp的值
在这里插入图片描述
两个值是相同的

调用C语言库函数时:


#include "stdio.h"
int main(){char *str="hello\n";__asm{push strcall printf}return 0;
}

在这里插入图片描述

  1. 进入asm和出asm时,esp的值要相同。比如说,我们程序进入__asm后,esp的值是0,那么在出asm时,一定要让esp的值变成0。
    上面的程序,假设执行 xor ebx,ebx前,esp=0,当我们出asm时,esp的值一定要为0,不然会报错,上面的add esp,12就是这个目的,如果我们把这个去掉,在运行,就会报下面的错误
    在这里插入图片描述
    在举个例子:

int main(){__asm{push 0;}return 0;
}

这段程序也会报上面的错误

写在最后:
这些是和同学讨论出来的,如果有什么不对的地方希望指出来

自己很菜,在学了点汇编后,自己摸索C和汇编混合编程的,很多东西还不懂,会继续努力的。

以后会继续补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何创建Java程序

(1),点击 (2),点击OK (3),File->New->Project… (4),Java Project->Next> (5),Project name随便填(这里以qweqwe为例) 然后Finish (6),鼠标右击qweqwe(随便名称都可以)->New->Class (7),同理,…

c语言数据转移,重温C语言(2)之数据

一 数据类型数据就是代表某些信息的数字和字符。按计算机的储存方式可分为两大基本类型:整数类型和浮点数类型。1 关键字初始C90C99intsigned_Boollongvoid_Complexshort_Imaginaryunsignedcharfloatdouble2 存储单元首先得记住,计算机内部都是以二进制进…

对esp和ebp分析来了解函数的调用过程

esp:扩展栈指针寄存器,是指针寄存器的一种,用于存放函数栈顶指针(栈顶指针) ebp:扩展基址指针寄存器,也被称为帧指针寄存器,用于存放函数栈底指针(栈底指针)。…

仿射变换 c语言,c语言数字图像处理(三):仿射变换

仿射变换及坐标变换公式几何变换改进图像中像素间的空间关系。这些变换通常称为橡皮模变换,因为它们可看成是在一块橡皮模上印刷一幅图像,然后根据预定的一组规则拉伸该薄膜。在数字图像处理中,几何变换由两个基本操作组成:(1)坐标…

C和汇编混合编程----实现浮点数的加减乘除

加法 C程序: #include "stdio.h"int main() {float a1.0;float b2.34;float c;cab;printf("c%f",c);return 0; }反汇编之后,实现加法的关键程序 5: float a1.0; 00401028 C7 45 FC 00 00 80 3F mov dword ptr [eb…

【Wordpress】分享500多款国外WordPress经典主题 其之三

从国外网站上淘来的WordPress主题,以前都是放在本人博客xcodeland.mooo.com上的后来空间挂掉了就转到这里来与大家分享。 modernclean 下载地址 just-business 下载地址 redrum 下载地址 aneducation 下载地址 artsie 下载地址 eveningalone 下载地址 wasabi …

C和混编混合编程----strcpy缓存溢出原理

今天老师给了一到程序,让我们分析分析原理,关于strcpy缓存溢出原理的,反汇编一遍遍调试,终于看明白了,记录一下 C程序: #include "string.h" #include "stdio.h" char *shellcode&quo…

C和汇编混合编程--------函数调用后ebp、esp值问题

今天老师又给了一个程序,让我们分析,记录一下分析过程 程序: #include "stdio.h" #include "string.h"char *shellcode"\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00"; void fun1(int a, int b) {print…

android游戏黑屏,第五人格游戏进不去黑屏解决办法

小编今天给各位玩家朋友们带来的是第五人格游戏进不去黑屏解决办法,很多的玩家朋友们在第五人格更新后都出现了黑屏、游戏无法进入等情况,这应该怎么办呢?小编把解决方法给大家整理在了下方,感兴趣的小伙伴们快来跟小编一起往下看…

线性表----顺序表

线性表的定义 线性表是具有相同数据类型的n个数据元素的有限序列, 逻辑特性 除第一个元素外,每个元素只有一个前驱,除最后一个元素外,每个元素都有一个后继 物理结构 线性表的存储结构有顺序存储结构和链式存储结构&#xff…

树、二叉树、二叉搜索树_检查二叉树是否为BST(二叉搜索树)

树、二叉树、二叉搜索树Description: 描述: This article describes how to check whether a given tree is BST or not? This problem came in coding round of Microsoft. 本文介绍如何检查给定的树是否是BST ? 这个问题来自微软的编码回合。 Probl…

栈溢出利用-----jmp esp

通过jmp esp利用栈溢出&#xff0c;首先我们要找出jmp esp 的地址&#xff0c;因为系统不同&#xff0c;通用jmp esp的地址可能不同&#xff0c;下面的代码是找出jmp esp的地址的&#xff1a; #include<windows.h> #include<iostream.h>#include<tchar.h> i…

android 队列上传图片,话说android端七牛图片上传

七牛图片上传业务流程如下图(这是官方的图)&#xff1a;由上图可知&#xff0c;要想实现图片上传&#xff0c;是要三端进行交互的(我刚刚开始以为只要七牛服务器跟客户端交互就行)接下来步骤如下&#xff1a;1、首先肯定是要有一个七牛的账号&#xff0c;并创建一个空间2、客户…

bst 删除节点_C ++程序查找具有N个节点的BST数量(加泰罗尼亚编号)

bst 删除节点Problem statement: C program to find number of binary search trees with n nodes. 问题陈述&#xff1a; C 程序查找具有n个节点的二进制搜索树的数量。 Input format: single integer n 输入格式&#xff1a;单整数n Constraints: 0<n<15 约束&#x…

android intent实验,Android开发课程实验报告③ intent的使用

Android开发课程实验报告author&#xff1a;065实验四&#xff1a;intent实验报告目录实验目的初学移动应用公开发中的Android开发&#xff0c;实验四的主要内容为intent的使用&#xff0c;通过这一次实验&#xff0c;掌握基本的intent使用方法。具体实验分析实验第一步&#x…

利用xor给shellcode加壳

首先看我们的shellcode&#xff0c;执行弹出cmd 没有shellcode&#xff1a; #include "stdio.h" #include "windows.h" #include <string.h> #include "stdlib.h"int main(int argc, char* argv[]) {printf("begin\n");HINSTAN…

华为mate50鸿蒙,华为Mate50Pro首次曝光,5000mAh+鸿蒙OS+120Hz,太强

自从去年九月份以来&#xff0c;关于华为旗舰的消息越来越少了&#xff0c;主要的原因想必大家也是知道的。现在华为究竟还能不能继续正常发布新旗舰&#xff0c;答案也很微妙&#xff0c;不过我们可以肯定的是&#xff0c;华为绝不会放弃手机业务&#xff0c;这是余承东多次亲…

数数小木块

描述 在墙角堆放着一堆完全相同的正方体小木块&#xff0c;如下图所示&#xff1a; 因为木块堆得实在是太有规律了&#xff0c;你只要知道它的层数就可以计算所有木块的数量了。 现在请你写个程序 给你任一堆木块的层数&#xff0c;求出这堆木块的数量. 输入 第一行是一个整…

信息安全主动攻击和被动攻击_信息安全中的主动和被动攻击 网络安全

信息安全主动攻击和被动攻击安全攻击 (Security Attacks) The attack in cryptography means that our data or sent messages or any kind of information is accessed by some anonymous user without our permission. An attack simply means to alter, destroy, implant or…

线性表---双链表

双链表是单链表的拓展&#xff0c;单链表结点中只有一个指向其后继的指针&#xff0c;双链表有两个结点&#xff0c;一个指向其后继的指针&#xff0c;另一个指向前驱。 为什么要引入双链表呢&#xff1f; 这就要说单链表只有一个指针了&#xff0c;使得单链表只能从结点依次顺…