x86 x64下调用约定浅析】的更多相关文章

x86平台下调用约定 我们都知道x86平台下常用的有三种调用约定,__cdecl.__stdcall.__fastcall.我们分别对这三种调用约定进行分析. __cdecl __cdecl是C/C++的默认调用约定,如果不显示声明调用约定的情况下,就是该调用约定.下面我们来从汇编层次来熟悉这种调用约定. 我写了一个函数,如下: int __cdecl TestCdecl(int a, int b, int c, int d, int e) { return a + b + c + d + e;…
在设计调用约定时,x64 体系结构利用机会清除了现有 Win32 调用约定(如 __stdcall.__cdecl.__fastcall._thiscall 等)的混乱.在 Win64 中,只有一个本机调用约定和 __cdecl 之类的修饰符被编译器忽略.除此之外,减少调用约定行为还为可调试性带来了好处. 需要了解的有关 x64 调用约定的主要内容是:它与 x86 fastcall 约定的相似之处.使用 x64 约定,会将前 4 个整数参数(从左至右)传入指定的 64 位寄存器: RCX: 1s…
C 语言有 __cdecl.__stdcall.__fastcall.naked.__pascal. C++ 语言有 __cdecl.__stdcall.__fastcall.naked.__pascal.__thiscall,比 C 语言多出一种 __thiscall 调用方式. 下面详细介绍如上六种调用方式: 1.__cdecl __cdecl调用约定又称为 C 调用约定,是 C/C++ 语言缺省的调用约定.表示C语言默认的函数调用方法,参数按照从右至左的方式入栈,函数本身不清理栈,此工作由…
根据测试 int main() { ; )); )); int n1 = sizeof(a); int n2 = sizeof(p); // int n3 = sizeof(*p); error int n4 = sizeof(p1); int n5 = sizeof(*p1); } x86下 n1 = 4; n2 = 4; n4 = 4; n5 = 1; x64下 n1 = 4; n2 = 8; n4 = 8; n5 = 1; 小结: 指针在x86下为4个字节长度,在x64下为8个字节长度 i…
起因 项目涉及u3d/wpf端的渲染图形合成,采用了开源项目spout,为了便捷,采用了spout的com版本作为c#端的调用 项目调整后,细节已经捋清楚了. 但是考虑桌面应用采用anypc,根据运行环境自动切换x86/x64,就不想硬编码绑定运行环境了. 故选项后采用 程序选择anypc,运行时动态判断x86/x64,加载对应的com组件 封装代理层,代理层调用对应的x86/x64 com pinvoke 封装分析 项目 LightjamsSpout 我们需要封装的部分是 GLContext和…
k = <rsp> <rip> <frame_count>x64下manual stack walking与x86不同,x86一般情况下有ebp chain,x64没有ebp chain,类似x86的FPOx64下,rsp在函数执行完prologue之后就不会变化(调用约定):所以0.如果函数内执行了call指令,call指令返回地址压栈后,rsp就会减8:1.也就是说,在stack reconstruction时,识别到返回地址所在的栈地址,再加8,就是当前函数执行完…
http://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A 这里描述了在x86芯片架构上的调用约定(calling conventions). 调用约定描述了被调用代码的接口: 原子(标量)参数,或复杂参数独立部分的分配顺序; 参数是如何被传递的(放置在栈上,或是寄存器中,亦或两者混合); 被调用者应保存调用者的哪个寄存器; 调用函数时如何为任务准备堆栈,以及任务完成如何恢复; 这与编程语言中对于大小和格式的分配紧密相…
目录 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 二丶x64汇编 2.1汇编详解 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 在x86下我们汇编的传参如下: push eax call xxx xxx fun proc push ebp 保存栈底 mov ebp,esp 设置ebp sub esp,0C0h 开辟局部变量空间 push ebx 保存寄存器环境 push esi push edi pop edi 恢复寄存器环境 pop esi pop e…
参考:https://bbs.pediy.com/thread-224583.htm 整理成表格方便查询 cdecl(C规范), stdcall(WinAPI默认), fastcall, ATPCS(ARM-Thumb Procedure Call Standard/ARM-Thumb过程调用标准) , thiscall(用于C++中类成员函数) 调用约定\架构 X86 X64 ARM AARCH64 cdecl 参数从右往左依次入栈,调用者实现栈平衡,返回值存放在 EAX 中. X X X s…
VS2012在win7 64位机中x86和x64下基本类型的占用空间大小 #include "stdafx.h" #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { int i = 0; i = sizeof(int); // x86:4 x64:4 i = sizeof(long); // x86:4 x64:4 i = sizeof(void*); // x86:4 x64:8 i = sizeof(s…
cdecl      C语言默认的调用约定,从右往左压栈,由调用者负责清栈,所以参数个数可以不固定: stdcall    windows默认调用方式,从右往左压栈,由被调用者负责栈操作. pascal    pascal语言的调用约定,从左到右压栈,由被调用者负责清栈 Microsoft fastcall   头两个参数(从左到右)存入ECX和EDX,余下的参数存入栈中(从右到左)…
欢迎转载,转载请注明出处:http://www.cnblogs.com/uAreKongqi/p/6012353.html 0x00.前言 提到Dll的注入,立马能够想到的方法就有很多,比如利用远程线程.Apc等等,这里我对Ring3层的Dll注入学习做一个总结吧. 我把注入的方法分成六类,分别是:1.创建新线程.2.设置线程上下背景文,修改寄存器.3.插入Apc队列.4.修改注册表.5.挂钩窗口消息.6.远程手动实现LoadLibrary. 那么下面就开始学习之旅吧! 0x01.预备工作 在涉…
在VC SDK的WinDef.h中,宏WINAPI被定义为__stdcall,这是C语言中一种调用约定,常用的还有__cdecl和__fastcall.这些调用约定会对我们的代码产生什么样的影响?让我们逐个分析. 首先,在x86平台上,用VC编译这样一段代码: int __cdecl TestC(int n0, int n1, int n2, int n3, int n4, int n5) { int n = n0 + n1 + n2 + n3 + n4 + n5; return n; } in…
最近在写一些字符串函数的优化,用到x64汇编,我也是第一次接触,故跟大家分享一下. x86:又名 x32 ,表示 Intel x86 架构,即 Intel 的32位 80386 汇编指令集. x64:表示 AMD64 和 Intel 的 EM64T ,而不包括 IA64 .至于三者间的区别,可自行搜索. x64 跟 x86 相比寄存器的变化,如图: 从图上可以看到,X64架构相对于X86架构的主要变化,是将原来所有的寄存器都扩大了一倍,例如EAX现在扩充成RAX,同时,又新增加了从R8-R15这…
相信对于很多刚接触打包程序的同志来说,关于x86,x64,Any CPU这三个项目平台,以及解决方案配置Debug和Release有什么区别?这个问题一定有许多的困惑,甚至不乏一些已经工作了很久的老程序猿来说都是一个模棱两可的问题.当然,我也是捣腾了好久,才渐渐搞明白它们的区别,以此作个总结: 一 .x86.x64.Any CPU的区别 1.简单的说,它们之间最直接的区别就是:x86平台编译出来的exe(可执行文件)或dll(动态链接库)都是32位的.以此类推,x64对应的则是64位的.而Any…
依稀记得第一次接触Hook的概念是在周伟民先生的书中-><<多任务下的数据结构与算法>>,当时觉得Hook很奇妙,有机会要学习到,正好近段日子找来了MiniHook,就一起分享一下. 本篇文章是在x64下测试与分析jmp+offset类型的Hook,并且逆推测出热补丁的简单用法,MinHook它的中心就是覆盖重写并且可以复原.知道大概的思路后后让我们先来具体的实现MinHook再去做测试. 首先是堆的申请(申请PAGE_SIZE大小自动生长的堆),以下是实现与卸载 1 NTS…
原来的地址 x64系统的判断和x64下文件和注册表访问的重定向(1) x64系统的判断和x64下文件和注册表访问的重定向(2) x64系统的判断和x64下文件和注册表访问的重定向(3) 之前在(3)里面讨论过%ProgramFiles%这个环境变量的指向问题,其实在x64环境下面还有两个环境变量可以使用:%ProgramFiles(x86)%和%ProgramW6432%,如果你的系统安装在C盘,那么对应关系是这样的(注32位系统只有%ProgramFiles%,这里不讨论): %Program…
关于.NET编译的目标平台(AnyCPU,x86,x64)(转) 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有DLL工程的目标平台全部指定成AnyCPU . 下面我们一起看看这个目标平台有什么作用,各选项有什么差别吧. 在VisualStudio中,在编译设置中有如下选项: x86: 将程序集编译为由兼容 x86 的 32 位公共语言运行库运行. x64: 将程序集编译为由支持 AMD64 或 EM64T 指令集的计算机上的 64 位公共语言运行库运行.…
windows7内核分析之x86&x64第二章系统调用 2.1内核与系统调用 上节讲到进入内核五种方式 其中一种就是 系统调用 syscall/sysenter或者int 2e(在 64 位环境里统一使用 syscall/sysret 指令,在 32 位环境里统一使用 sysenter/sysexit 在 compatibility 模式下必须切换到 64 位模式,然后使用 syscall/sysret 指令 注释:32位cpu是x86模式 也叫legacy模式 再说清楚点 就是包含了实模式:可…
https://blog.csdn.net/zuguangboy/article/details/51509670 1,即主程序(编译出来是exe文件的)是x86平台下编译的,而它所依赖的一个项目(或动态链接库)是由x64位平台编译出来的,则会提示“未能加载文件或程序集…或它的某一个依赖性.试图加载格式不正确的程序.”之类的错误.这是因为32位程序不能加载64位的dll,更不能调用其中的类.方法和对象等.反之,若主程序是由x64平台编译出来的,而dll是x86的呢?答案..也是不行的! 2,虽说…
目录(?)[-] TLS技术简介 1 TLS回调函数 2 TLS的数据结构 具体实现及原理 1 VS2015 X64 release下的demo 2 回调函数的具体实现 21 使用IsDebuggerPresent检测调试器 22 使调DebugPort检测调试器 实际测试 1 测试直接执行 2 测试用调试器加载 总 结   1 TLS技术简介 Thread Local Storage(TLS),是Windows为解决一个进程中多个线程同时访问全局变量而提供的机制.TLS可以简单地由操作系统代为…
由8086/8088.x86.Pentium发展到core系列短短40多年间,处理器的时钟频率差点儿已接近极限.尽管如此,自从86年Intel推出386至今除了添加一些有关流媒体的指令如mmx/sse之外.其它新增的大多数指令都能够从最初的指令集中组合实现相同的功能,整个编程模型维持了约有20多年. 1. 处理器体系结构 1.1. 处理器简要结构 我们都知道CPU的根本任务就是运行指令,对计算机来说终于都是一串由"0"和"1"组成的序列. CPU从逻辑上能够划分成3…
很久没有更新博客了(博客园怎么还不更新后台),前几天在写一个Linux 0.11的实验 [1] 时遇到了一个奇葩的Bug,就在这简单记录一下调试过程吧. 现象 这个实验要求在Linux 0.11中实现简单的信号量 [2],但在改动内核代码后运行测试程序总是报错,例如: /* pc_test.c */ #define __LIBRARY__ #include <stdio.h> #include <stdlib.h> #include <semaphore.h> #inc…
<逆向工程核心原理>第30章 记事本WriteFile() API钩取 原文是在x86下,而在x64下函数调用方式为fastcall,前4个参数保存在寄存器中.在原代码基础上进行修改: 1 // myhookdbg.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. 2 // 3 4 #include "pch.h" 5 #include <iostream> 6 #include <windows.h> 7…
首先特别感谢梦老大,本人一直没搞懂异常处理机制,看了他的教程之后终于明白了.在他的教程里我学到了不少东西.第一次在论坛发帖,就说说Win7 x64位下怎么过TP保护.如果有讲错的地方,还望指出.说不定我发帖后一星期TP就会大更新呢.打字排版好辛苦. 先说说内核层,看大家的反应后再说说应用层的保护.(包括解决CE非法问题)调试对象:DXF调试工具:OD.Windbg调试环境:Win7 SP1 X64调试先言:我记得TP最近的一次大更新是在去年的暑假,在那之前的ring0保护和现在的已经大有不同了.…
C++调用约定和名字约定 转自http://www.cppblog.com/mzty/archive/2007/04/20/22349.html 调用约定:__cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法. 1.__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈, 2._cd…
首先,__cdecl,c declaration,C风格声明.或者 c default calling(笔者瞎编的).(那么问题来了,为什么PASCAL风格被称为std?) 调用约定的内容包括三点:参数出入栈顺序,弹栈工作由谁做,以及产生函数名的方式(renaming?) 1. 在参数入栈顺序上,__cdecl和__stdcall没有区别都是从右往左: 2. __cdecl既然是c/c++默认,让我们回忆下下stl中的printf这样的变长参数函数,只有调用者才知道实参的情况,因此由调用者去负责…
对于这次论文项目,最后在写一篇关于工程的博客,那就是在asp.net下调用matlab生成的dll动态链接库.至今关于matlab,c/c++(opencv),c#(asp.net)我总共写了4篇配置的博客,配置问题搞了我们差不多2周多的时间,各种编译不通过,各种链接出问题,各种头疼,甚至都有放弃asp.net下建工程,转用matlab的gui来实现前端界面的念头了.但是在队友的强烈要求下,我不得不硬着头皮搞下这配置问题,最终总结出这4篇配置博客.其中艰辛,恐怕连队友都不甚了解. 当然在实验室同…
标 题: [原创]X64下MmIsAddressValid的逆向及内存寻址解析 作 者: 普通朋友 时 间: 2015-10-21,20:03:52 链 接: http://bbs.pediy.com/showthread.php?t=205143 在内核编程时,经常会用到MmIsAddressValid来检测地址是否有效,结合之前学过的虚拟地址到物理地址之间的转化,所以发一篇对该函数的逆向以及代码还原,x86的资料论坛以及网络有很多了,所以这里楼主只谈一下Win7 x64下的MmIsAddre…
在上期 VOL.1 利用vmware ThinApp 制作非XP下可以运行的IE6 [无插件版](windows vista/7/8  x86/x64 )中,简要介绍了如何利用vmware Thinapp制作单文件版IE6,根据大家的需求,我又做了2个版本的单文件版,这里打包到一起,供网友们下载,欢迎各位分享给你的同学,同事或同行们.(windows 8下的问题正在解决中...)  下载地址: http://pan.baidu.com/share/link?shareid=1495689163&…