x64汇编第四讲,c / C++中调用x64汇编
x64汇编第四讲,c / C++中调用x64汇编
一丶简介
1.说明
在x86下,我们的C/C++调用汇编可以直接 __asm进行内联.
或者也可以直接静态链接
具体详情可以参考以前博客:
https://www.cnblogs.com/iBinary/p/7555503.html
其实在我们x64下跟x32调用一样.只不过不支持内联汇编了.还是支持你编译成obj的方式进行调用.你声明一下就可以使用了.
现在我们用新的方法.直接编写一个 x64ASM文件即可.
二丶C/C++调用 asm64.asm函数.
1.配置asm参与生成
首先我们创建一个C/C++空项目.使用VS创建.这个应该很简单.不在截图了.
然后创建一个.c 或者.cpp文件.里面先按照征程写法,编写你的程序.
如下:
可以正常执行
然后我们添加一个.asm文件的后缀名. 这个文件跟添加.cpp文件一样.自己更改为.asm即可.
如下:
最重要的一步
你有这个文件,但是不能参加到项目的生成中来.所以你需要改一下 这个文件的属性.让其可以参与项目生成,且编译的时候编译成汇编格式.
如下:
从项目中生成 选择否代表你这个文件要参与生成.
第二个就是选择工具,选择自定义即可.因为我设置过了.所以左侧有自定义
生成工具
设置命令行编译.以及输出
如下:
命令行:
ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm
$(IntDir)%(fileName).obj
或者
$(IntDir)%(fileName).obj;%(Outputs)
此时我们asm就可以参与生成了.
2.给Asm文件添加函数代码
此时文件可以生成了.你就可以编写x64代码了.如下
.data
.const
.code
addNumber proc
mov rax,rcx
add rax,rdx
ret
addNumber endp
end
3.C/C++调用asm的函数
上面我们写了 asm函数.我们C/C++调用的时候声明一下即可使用
如上面代码我们操作了 rcx,rdx 说明我们的参数有两个.
如下:
如果你的工程比较大.那么你可以为你的64asm汇编文件添加一个头文件
头文件中进行函数声明. 以 C方式导出.
你的CPP文件中包含这个头文件即可.
4.汇编调用C++函数
首先C++ 函数需要在.h文件中导出。
例如:
xxx.h
extern "C"
{
void targetFunction(void);
void myfunction(void);
__int64 g_xxxvalue =100000;
}
而后汇编中的代码如下:
EXTERN targetFunction:PROC;引用外部函数
EXTERN g_retAddr:DQ
.DATA
.const
.CODE
fakefunction proc
push rax;
push rbx;
push rcx;
push rdx;
push rsi;
push rdi;
push r8;
push r9;
push r10;
push r11;
push r12;
push r13;
push r14;
push r15;
pushfq;
call targetFunction;
popfq;
pop r15;
pop r14;
pop r13;
pop r12;
pop r11;
pop r10;
pop r9;
pop r8;
pop rdi;
pop rsi;
pop rdx;
pop rcx;
pop rbx;
pop rax;
;恢复原始指令跳转到原函数
push rbp;
push rdi;
sub rsp,0E8h;
mov rax,g_retAddr;
jmp rax;
fakefunction endp
end
最后参考第三步,将fakefunction导出给C/C++ 函数使用即可。
上面的例子就是一个x64 Hook下的模型。 其中fakefunction就是对应之前的x86下的裸函数(_declspec(naked) xxx)
三丶简单例子
3.1 调用Windows Api
汇编
.data
g_Title db "HelloWorld" ,0
g_Text db "xxx" ,0
.const
.code
extrn MessageBoxA:proc;
callMessageBox PROC
sub rsp,28h
xor r9,r9;
lea r8,g_Title;
lea rdx ,g_Text
xor rcx,rcx
call MessageBoxA;
add rsp,28h
ret
callMessageBox endp
end
Cpp中导出调用
extern "C" void callMessageBox();
四丶其它方式配置
4.1 Vs工程直接配置
首先 对自己的工程进行右键.
操作图如下:
在生成自定义文件里面选择 masm
对其打勾
而后对自己工程中的 asm文件进行右键属性
设置. 在里面的 常规-项类型
中选择Microsoft Macro Assembler
随后我们的程序直接编译即可. 使用方式同上. Asm里面是汇编代码. 外部需要 Extern声明导出.
PS: 选择Asm生成的时候注意你配置的是Debug\64 还是 Release\64 否则在不同工程环境下编译会出错.
坚持两字,简单,轻便,但是真正的执行起来确实需要很长很长时间.当你把坚持两字当做你要走的路,那么你总会成功. 想学习,有问题请加群.群号:725864912(收费)群名称: 逆向学习小分队 群里有大量学习资源. 以及定期直播答疑.有一个良好的学习氛围. 涉及到外挂反外挂病毒 司法取证加解密 驱动过保护 VT 等技术,期待你的进入。
详情请点击链接查看置顶博客 https://www.cnblogs.com/iBinary/p/7572603.html
本文来自博客园,作者:iBinary,未经允许禁止转载 转载前可联系本人.对于爬虫人员来说如果发现保留起诉权力.https://www.cnblogs.com/iBinary/p/10959448.html
欢迎大家关注我的微信公众号.不定期的更新文章.更新技术. 关注公众号后请大家养成 不白嫖的习惯.欢迎大家赞赏. 也希望在看完公众号文章之后 不忘 点击 收藏 转发 以及点击在看功能. QQ群: