首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

非托管函数挂钩,堆栈/寄存器问题与调用约定?

非托管函数挂钩(Unmanaged Function Hooks)是一种在软件开发中常用的技术,用于在托管代码(Managed Code)中调用非托管代码(Unmanaged Code)的过程中进行拦截、修改或扩展非托管函数的行为。

堆栈/寄存器问题与调用约定是指在函数调用过程中涉及到的堆栈和寄存器的管理问题,以及函数调用时所遵循的调用约定。

堆栈是用于存储函数调用过程中的局部变量、函数参数和返回值等数据的一种数据结构。在函数调用时,会将函数的参数和返回地址等信息压入堆栈中,然后执行函数体内的代码,最后再从堆栈中弹出返回地址并返回。

寄存器是CPU内部的一组高速存储器,用于存储临时数据和指令执行过程中的中间结果。在函数调用过程中,一些函数参数和返回值可能会存储在寄存器中,而不是堆栈中,以提高执行效率。

调用约定是指函数调用时所遵循的一套规则,包括参数传递方式、寄存器使用规则、堆栈管理方式等。不同的编程语言和编译器可能采用不同的调用约定,常见的调用约定有C调用约定、stdcall调用约定、fastcall调用约定等。

非托管函数挂钩和堆栈/寄存器问题与调用约定在软件开发中具有重要的意义。通过使用非托管函数挂钩技术,开发人员可以在托管代码中对非托管函数进行拦截和修改,以实现一些特定的需求,如性能优化、错误处理、安全检查等。而堆栈/寄存器问题与调用约定的理解和处理能力,则对于编写高效、稳定和可靠的代码至关重要。

腾讯云提供了一系列与云计算相关的产品和服务,可以帮助开发者构建和管理云原生应用、进行数据存储和处理、实现人工智能和物联网等功能。具体推荐的腾讯云产品和产品介绍链接地址可以根据具体需求和场景进行选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

请教关于C语言形参和实参存储单元的问题

首先我们限定一下问题,只限于cdecl的调用约定函数没有被编译器做inline的优化(C++才有inline,但是C编译器也可能自己把函数调用优化掉)。...除了cdecl以外,C中其他常用的调用约定包括stdcall和fastcall,C++中还有一个thiscall(用于调用类的成员函数)。fastcall会使用寄存器来传递一部分参数。...stdcall除了返回时自动清理堆栈以外,cdecl在使用参数上区别不大。thiscall调用约定使用寄存器传递this指针参数。...是x86中的调用约定,x64中已经不同了,查了一下相关的资料,在Windows上和Windows上,使用的调用约定是有差异的。...另外,调用方在栈上额外分配32个字节(但是不需要初始化),给RCX、RDX、R8、R9四个参数,这样被调用函数在需要使用这四个寄存器的时候可以把这四个参数直接存到堆栈里对应的位置上,腾出寄存器的空间。

1.2K30

模拟隐蔽操作 - 动态调用(避免 PInvoke 和 API 挂钩

使用它,我们展示了如何从内存或磁盘动态调用托管代码,同时避免 API 挂钩和可疑导入。...这是您传入要调用托管代码的函数原型的地方。...这让 Delegate 在调用函数时知道如何设置 CPU 寄存器堆栈。如果将此通常在 C# 中从内存中调用托管代码的方式(通过自注入 shellcode)进行比较,这会容易得多!...您必须以完全正确的方式编组数据,确保您传入的数据结构在内存中的格式和布局托管代码所期望的相同。您还必须指定正确的调用约定。这很烦人。...用于将托管 API 调用托管函数 (Delegate) 挂钩的通用函数。 结论 DInvoke 是一个框架,用于在不使用 Pinvoke 的情况下从托管代码动态执行托管代码。

2.1K00
  • 2020-09-04:函数调用约定了解么?

    fastcall调用约定和stdcall类似,它意味着: 1) 函数的第一个和第二个DWORD参数(或者尺寸更小的)通过ecx和edx传递,其他参数通过从右向左的顺序压栈; 2) 被调用函数清理堆栈;...Fast Calling Convention,快速调用约定。通过使用寄存器解决效率问题。...主要用于解决this指针问题,使用寄存器传递this指针。返回方式同__stdcall. 5.__nakedcall 这是一个很少见的调用约定,一般程序设计者建议不要使用。...__pascal 基于Pascal语言的调用约定,参数从左至右入栈(cdecl相反)。被调用者负责在返回前清理堆栈。...要求尽可能在寄存器中传递参数。函数名改编为”@@函数名@参数字节数十进制”。这是微软自己添加的标准。 8.syscall cdecl类似,参数被从右到左推入堆栈中。

    59910

    关于this指针

    this指针是类中非静态成员函数的第一个默认隐含参数,编译器自动传递和维护,用户不可显示传递 函数调用约定 是指当一个函数调用时,函数的参数会被传递给被调用函数,返回值会被返回给调用函数,总之,就是函数调用被调函数之间关于参数传递...,返回值传递,堆栈清理,寄存器使用的一种约定。...对于_cdecl调用约定,为什么是调用者而不是函数体自己来平衡堆栈呢?...这里我们重点说一下_thiscall调用约定: 它只能用在类的成员函数上 参数从右向左进行压栈 若参数个数确定,this指针通过ecx寄存器传递给被调用者;若参数不确定,this指针在所有参数被压栈后压入堆栈...对于参数不确定的函数调用者清理堆栈,否则函数自己清理堆栈问题:this指针是否可以为空?

    42910

    C语言 | C++ 堆栈工作机制

    参数入栈的顺序是由函数调用约定 (Calling Convention) 决定的,我们将在后面一个专门的章节来讲解调用约定。...堆栈特性分析 上一节中,一个完整的堆栈帧已经建立起来,现在函数可以开始正式执行代码了。本节我们对堆栈的特性进行分析,有助于了解函数堆栈帧的依赖关系。...函数调用约定(calling convention) 函数调用约定 (calling convention) 指的是进入函数时,函数的参数是以什么顺序压入堆栈的,函数退出时,又是由谁(Caller还是...常用的调用约定有以下3种: 1)__cdecl。这是 VC 编译器默认的调用约定。其规则是:参数从右向左压入堆栈函数退出时由 caller 清理堆栈中的参数。...类成员函数默认使用的调用约定

    7.8K88

    详解CC++堆栈的工作机制

    堆栈特性分析 上一节中,一个完整的堆栈帧已经建立起来,现在函数可以开始正式执行代码了。本节我们对堆栈的特性进行分析,有助于了解函数堆栈帧的依赖关系。 1....首先,caller和callee在这个问题上要有一个“约定”,由于caller是不知道callee内部是如何执行的,因此caller需要从callee的函数声明就可以知道应该从什么地方取得返回值。...函数调用约定(calling convention) 函数调用约定(calling convention)指的是进入函数时,函数的参数是以什么顺序压入堆栈的,函数退出时,又是由谁(Caller还是Callee...常用的调用约定有以下3种: 1)__cdecl。这是VC编译器默认的调用约定。其规则是:参数从右向左压入堆栈函数退出时由caller清理堆栈中的参数。...类成员函数默认使用的调用约定。其规则是:参数从右向左压入堆栈,x86构架下this指针通过ECX寄存器传递,函数退出时由callee清理堆栈中的参数,x86构架下this指针通过ECX寄存器传递。

    48320

    5.5 汇编语言:函数调用约定

    说到函数我们必须要提起调用约定这个名词,而调用约定离不开栈的支持,栈在内存中是一块特殊的存储空间,遵循先进后出原则,使用pushpop指令对栈空间执行数据压入和弹出操作。...默认的调用约定调用方平栈,不定参数的函数可以使用,参数通过堆栈传递.STDCALL:被调方平栈,不定参数的函数无法使用,参数默认全部通过堆栈传递.FASTCALL32:被调方平栈,不定参数的函数无法使用...V:类Linux系统默认约定,前八个参数放入(RDI,RSI, RDX, RCX, R8, R9),剩下的参数压栈保存.首先先来写一段函数版的堆栈使用案例,案例中模拟了编译器如何生成Main函数栈帧以及如何对栈帧初始化和使用的流程...STDCALLCDECL只在参数平衡上有所不同,其余部分都一样,但该约定不定参数函数无法使用。...它通常采用被调用者平衡堆栈的方式,类似于STDCALL调用约定。但是,FASTCALL约定规定函数的前两个参数在ECX和EDX寄存器中传递,节省了压入堆栈所需的指令。

    32620

    使用 Unicorn 模拟器运行具有不同 CPU 架构的代码

    如果我使用调试器,我通常会尝试在地址处放置一个断点0x100007ed8——一个strcmp实际执行字符串比较和分析寄存器函数调用。...根据arm64 调用 convetion前 8 个参数通过寄存器传递x0- x7。...正如我们在调用之前看到的那样strcmp,我们有ldur x1, [x29, -8]一条指令从内存中加载一个值,该值x29寄存器指向递减的8寄存器x1,并将add x0, sp, #13其添加13到sp...根据调用约定,这些应该是上面源代码中我们dec_key和变量的地址。key 让我们在模拟器中运行这段代码,x0并x1在strcmp调用之前转储内容。...设置堆栈指针的初始值,随着堆栈向下增长,该指针应指向堆栈顶部。 我们的check_key函数接受一个参数,该参数通过思想x0寄存器传递。

    2.2K10

    5.5 汇编语言:函数调用约定

    说到函数我们必须要提起调用约定这个名词,而调用约定离不开栈的支持,栈在内存中是一块特殊的存储空间,遵循先进后出原则,使用pushpop指令对栈空间执行数据压入和弹出操作。...CDECL:C/C++默认的调用约定调用方平栈,不定参数的函数可以使用,参数通过堆栈传递. STDCALL:被调方平栈,不定参数的函数无法使用,参数默认全部通过堆栈传递....首先先来写一段函数版的堆栈使用案例,案例中模拟了编译器如何生成Main函数栈帧以及如何对栈帧初始化和使用的流程,笔者通过自己的理解写出了Debug版本的一段仿写代码。...STDCALLCDECL只在参数平衡上有所不同,其余部分都一样,但该约定不定参数函数无法使用。...它通常采用被调用者平衡堆栈的方式,类似于STDCALL调用约定。但是,FASTCALL约定规定函数的前两个参数在ECX和EDX寄存器中传递,节省了压入堆栈所需的指令。

    26620

    .NET简谈互操作(三:基础知识之DllImport特性)

    ) .NET简谈互操作(五:基础知识之Dynamic平台调用) .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 我们继续.NET互操作学习,上一篇文章中我们介绍了托管代码怎么托管代码...特性中的EntryPoint可选属性; 图2: EntryPoint属性是用来确定非托管方法的入口点是什么,在图1中,我的托管代码的入口点名称是add,也就是说明一个问题,系统在识别托管代码名称是靠...,在托管代码进行托管代码入口点查找时,会通过CallingConvention中的值进行确认托管入口点的调用约定,上篇文章中我们提到了调用约定的一些概念, extern "C" _declspec(...,我们来看_stdcall调用的相关概念说明:函数的参数自右向左通过栈传递,被调用函数在返回前清理传送参数的内存栈;意思是说,有被调用方来清理调用堆栈; 还有_declspec(dllexport)关键代码...(由于本人C++出身所以未能总结出自己的一套理解思路,再此先用一下网摘的说明) 总结:本篇文章重点是讲解DLLImport关键特性的使用,在P/Invoke过程中的基本约定需要用该特性来表示,由于托管托管在实现方面是不一样的

    69310

    V8 有了全新的超快速优化 JS 编译器,性能提高 5-15%

    Sparkplug 巧妙地简化了所有这些问题,具体方法就是保持一个“解析器兼容的堆栈框架”。 稍微解释下。堆栈框架(Stack frame)是代码执行存储函数状态的方式。...这是针对所有函数类型的常规堆栈布局;然后是关于如何传递参数,以及函数如何在其框架中存储值的约定。...在 V8 中,我们有针对 JavaScript 框架的约定,即在调用函数之前将参数(包括接收器)以相反的顺序推入堆栈,并且堆栈上的前几个槽为:被调用的当前函数;被调用的上下文;以及传递的参数数量。...对于 Ignition 解析器来说,约定变得更加显式。Ignition 是基于寄存器的解析器,这意味着存在一些虚拟寄存器(请勿机器寄存器混淆!)...这些寄存器要执行的字节码数组指针,以及该数组中当前字节码的偏移量一起存储在解析器的堆栈框架中: V8 解析器堆栈框架 Sparkplug 会有意创建并维护一个解析器的框架相匹配的框架布局;只要解析器存储一个寄存器

    75910

    ndk C++ 编译器的函数名修饰规则

    DLLDLL可以有自己的数据段,但没有自己的堆栈,使用调用进程的栈,调用它的应用程序相同的堆栈模式。...函数调用约定和名字修饰规则不匹配引起的常见问题 函数调用时如果出现堆栈异常,十有八九是由于函数调用约定不匹配引起的。...在参数传递中,有两个很重要的问题必须得到明确说明: 当参数个数多于一个时,按照什么顺序把参数压入堆栈 函数调用后,由谁来把堆栈恢复原状 在高级语言中,通过函数调用约定来说明这两个问题。...被调用函数_function处 push ebp // 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复 mov ebp,esp // 保存堆栈指针...函数调用约定导致的常见问题 如果定义的约定和使用的约定不一致,则将导致堆栈被破坏,导致严重问题,下面是两种常见的问题函数原型声明和函数体定义不一致 DLL导入函数时声明了不同的函数约定

    2K31

    MIPS架构深入理解11-向MIPS移植软件之编程语言

    甚至,你可以让编译器根据一些约定,自行选择使用的寄存器。 比如说,下面的这段代码,调用乘法指令mul,就可以在绝大数的MIPS架构CPU上运行。我们可以注意到,mul指令后面跟着三个源操作数。...inline内联函数,这意味着应该使用该函数逻辑代码的拷贝去替代调用这个函数的地方的代码(这允许局部寄存器优化)。...有符号无符号字符类型 早期的C编译器,char类型一般用于string,通常是signed char类型;这与为了获取更大整数值的约定是一致的。...堆栈的使用 尽管MIPS架构缺乏对堆栈的支持,但是MIPS-C编译器还是实现了一个常规的栈结构,主要就是按照某种约定,指定通用寄存器作一些特殊的用途,比如使用哪几个寄存器传递函数参数,使用哪个寄存器作为...话虽如此,不要想当然的认为,堆栈就可以安全的移植了。必要的时候,使用下面的2个方法-宏和库函数-解决堆栈问题: stdargs: 使用头文件,定义宏,允许函数接收可变参数。

    1.2K30

    CC++ 反汇编:关于函数调用约定

    说到函数我们必须要提起调用约定这个名词,而调用约定离不开栈的支持,栈在内存中是一块特殊的存储空间,遵循先进后出原则,使用pushpop指令对栈空间执行数据压入和弹出操作。...栈结构在内存中占用一段连续存储空间,通过espebp这两个栈指针寄存器来保存当前栈起始地址结束地址,每4个字节保存一个数据。...一般编译器实现调用调用约定无外乎以下这几种: CDECL:C/C++默认的调用约定调用方平栈,不定参数的函数可以使用,参数通过堆栈传递....stdcall 被调用者平栈: stdcallcdecl只在参数平衡上有所不同,其余部分都一样,但该约定不定参数函数无法使用。...fastcall 被调用者平栈: fastcall效率最高,它可利用寄存器传递参数,一般前两个或前四个参数用寄存器传递,其余参数传递则转换为栈传递,此约定不定参数函数无法使用。

    62810

    听GPT 讲Rust源代码--compiler(25)

    CallAbi trait定义了函数调用的各种规则和约定,包括参数传递、堆栈布局、寄存器使用以及返回值处理等。...以下是其中一些关键内容: 函数参数传递:根据NVPTX64的规范,函数参数在寄存器堆栈之间进行传递。Nvptx64结构体中定义了用于获取函数调用时不同类型参数的寄存器分配和堆栈管理的方法。...ABI 调用约定定义了函数参数如何传递、寄存器如何使用以及异常处理等规则,以确保编译后的代码可以正确地目标平台的二进制接口进行交互。...根据目标平台的规则,函数参数可以通过寄存器传递、堆栈传递或混合传递。...Heterogeneous:这个结构体表示一组具有不同类型和大小的连续寄存器

    14410

    ebpf_ebpf需要修改内核吗

    另外,新增的BPF_CALL指令使得调用内核函数更加便利。...寄存器: R0:一般用来表示函数返回值,包括整个 BPF 代码块(其实也可被看做一个函数)的返回值; R1~R5:一般用于表示内核预设函数的参数; R6~R9:在 BPF 代码中可以作存储用,其值不受内核预设函数影响...来自维基百科) 钩子 eBPF 程序是事件驱动的,当内核或应用程序通过某个挂钩点时运行。预定义的挂钩包括系统调用函数输入/退出、内核跟踪点、网络事件和其他几个。...无法读取包含未初始化内容(从未写过内容)的寄存器,读取会导致加载失败。寄存器R0-R5的内容通过存储特殊值来捕获未初始化寄存器的所有读取,从而在函数调用中标记为不可读。...进行了类似的检查以读取堆栈上的变量,并确保没有指令写入只读帧指针寄存器。? 3、检验者使用eBPF程序类型(稍后介绍)来限制可以从eBPF程序调用哪些内核功能以及可以访问哪些数据结构。

    74011

    1.4 编写简易ShellCode弹窗

    1.4.2 探讨STDCALL调用约定 既然获取到了相应的内存地址,那么接下来就需要通过汇编来编写可执行代码片段了,在编写这段代码之前,先来了解一下汇编语言的调用约定,在汇编语言中,要想调用某个函数,需要使用...我们以32位应用程序为例,在32位应用程序内通常使用STDCALL调用约定,它定义了函数在被调用时,参数传递、返回值传递以及栈的使用等方面的规则,该调用约定的规则如下所示: 参数传递:参数从右向左依次压入栈中...返回值传递:函数返回时将返回值存储在EAX寄存器中。 栈的使用:函数调用前,调用者将参数压入栈中;被调用者在返回前清理栈,以确保栈的平衡。...函数调用:在调用函数之前,调用者将返回地址(Return Address)和EBP寄存器的值保存在栈中,并将ESP寄存器指向参数列表的最后一个元素;在函数返回之后,调用者通过将之前保存的EBP和返回地址弹出栈中...总之,stdcall调用约定将参数按照从右到左的顺序压入栈中,由被调用者清理栈,返回值存储在EAX寄存器中,函数调用者和被调用者都需要遵循一定的栈使用规则。

    30810

    1.4 编写简易ShellCode弹窗

    1.4.2 探讨STDCALL调用约定既然获取到了相应的内存地址,那么接下来就需要通过汇编来编写可执行代码片段了,在编写这段代码之前,先来了解一下汇编语言的调用约定,在汇编语言中,要想调用某个函数,需要使用...我们以32位应用程序为例,在32位应用程序内通常使用STDCALL调用约定,它定义了函数在被调用时,参数传递、返回值传递以及栈的使用等方面的规则,该调用约定的规则如下所示:参数传递:参数从右向左依次压入栈中...返回值传递:函数返回时将返回值存储在EAX寄存器中。栈的使用:函数调用前,调用者将参数压入栈中;被调用者在返回前清理栈,以确保栈的平衡。...函数调用:在调用函数之前,调用者将返回地址(Return Address)和EBP寄存器的值保存在栈中,并将ESP寄存器指向参数列表的最后一个元素;在函数返回之后,调用者通过将之前保存的EBP和返回地址弹出栈中...总之,stdcall调用约定将参数按照从右到左的顺序压入栈中,由被调用者清理栈,返回值存储在EAX寄存器中,函数调用者和被调用者都需要遵循一定的栈使用规则。

    26320
    领券