ASM 调用 C/C++ 函数

admin 2024年11月22日16:32:41评论54 views字数 1225阅读4分5秒阅读模式
在 MASM 中,使用 externdef 、extern、extrn 伪指令进行调用外部函数。其中 externdef 伪指令最通用。

externdef 的语法格式:

externdef symbol:type

symbol 是用户想要定义的外部符号,type 是该符号的类型,定义外部函数时,类型是 proc。

比如调用 printf() 函数,语句为:

externdef printf:proc

定义外部函数时,应将 externdef 伪指令放在 ”.code“ 段中。
externdef 伪指令不允许向 printf() 函数指定需要传递的参数,call 指令也不提供指定参数的机制。需要使用 x86_64 的 RXC、RDX、R8、R9 寄存器,向 printf() 函数传递最多 4 个参数。
printf() 函数要求第一个参数是格式化字符串的地址,因此在调用 printf() 函数之前,应将字符串的地址加载到 RCX 寄存器,值得注意的是该字符串以 0 为结尾(ASCII码0是空终止符)。
如果格式化字符串包含格式说明符(如 %s、%d),则必须在 RDX、R8、R9 中传递适当的参数值。
小 demo:调用 C/C++ 的 printf() 函数打印 "hello word !"
在 VS 中新建空项目,在源文件添加新建项 main.asm。
;filename: main.asm    option casemap:none    ;所有符号区分大小写    .data    ;该段用于定义已初始化的数据fmtStr byte 'hello word !', 10, 0;fmtStr是定义的变量名,ASCII码10是换行符,ASCII码0是空终止符    .code    ;这个部分是写可执行指令的地方externdef printf:proc;externdef伪指令放在该段中    public asmFunc    ;public伪指令声明asmFunc可被外部访问asmFunc procsub rsp, 56;减少栈指针RSP的值56个字节,在栈上分配空间    lea rcx, fmtStr    ;将fmtStr的地址加载到rcx寄存器中。printf期望在rcx中接收格式字符串    call printf    ;调用printf函数打印字符串    add rsp, 56    ;平栈    ret    ;返回到调用方asmFunc endp    end
在源文件添加新建项 源.cpp。
//filename: 源.cpp#include <stdio.h>extern "C"{    void asmFunc(void); // 调用汇编写的 asmFunc 函数}// extern "C" 防止 C++ 编译器的名称篡改int main(void) {    printf("Call asmFuncn");    asmFunc();    printf("Returned from asmFunc");}
在资源管理器中右键生成依赖项->生成自定义,勾选 masm。

ASM 调用 C/C++ 函数

设置 main.asm 的属性。

ASM 调用 C/C++ 函数

在 asmFunc(); 处打了断点。
ASM 调用 C/C++ 函数
正常输出。

ASM 调用 C/C++ 函数

原文始发于微信公众号(走在网安路上的哥布林):ASM 调用 C/C++ 函数

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月22日16:32:41
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ASM 调用 C/C++ 函数https://cn-sec.com/archives/3425074.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息