吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 328|回复: 7
收起左侧

[讨论] 64位编译如何声明裸函数?

[复制链接]
董督秀 发表于 2024-6-4 21:31
    VS2019在默认编译器下,32位编译可以通过(naked)关键字声明裸函数;但在64位编译,则提示未定义naked标识或者禁止使用此扩展。我知道换编译器可以解决,但是如果非要使用默认的编译器实现声明64位裸函数,应该如何做?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

捷豹网络丶贱仔 发表于 2024-6-4 22:59
[C] 纯文本查看 复制代码
#include <windows.h>

// 裸函数示例
void MyNakedFunction()
{
    __asm {
        // 你的汇编代码
        // 例如:mov eax, 1
        // 注意:64位下不能直接使用内联汇编,需要使用__asm块
    }
}

// 64位下实现裸函数
void My64BitNakedFunction()
{
    __asm {
        push rbx
        // 你的汇编代码
        // 例如:mov rax, 1
        pop rbx
        ret
    }
}

int main()
{
    My64BitNakedFunction();
    return 0;
}
捷豹网络丶贱仔 发表于 2024-6-4 23:00
需要注意的是,在64位编译器下,不能直接使用内联汇编(__asm),而是需要使用编译器内置的汇编器或外部汇编器。你可以使用微软提供的__asm块来实现64位的裸函数。
总结来说,虽然默认编译器不支持64位的__declspec(naked),但你可以使用内联汇编和其他编译器指令来实现类似的效果。如果需要更复杂的汇编代码,建议使用外部汇编器。

免费评分

参与人数 1吾爱币 +1 收起 理由
董督秀 + 1 换编译器肯定能解决问题。问题是,如果不换编译器,如何实现此需求?

查看全部评分

捷豹网络丶贱仔 发表于 2024-6-4 23:17
捷豹网络丶贱仔 发表于 2024-6-4 23:00
需要注意的是,在64位编译器下,不能直接使用内联汇编(__asm),而是需要使用编译器内置的汇编器或外部汇 ...

1.首先,创建一个汇编文件(例如 naked_function.asm),并在其中编写你的裸函数:
[C++] 纯文本查看 复制代码
   ; naked_function.asm
   section .text
   global NakedFunction

   NakedFunction:
       ; 你的汇编代码
       ; 保存寄存器
       push rax
       push rcx
       push rdx

       ; 你的汇编代码在这里

       ; 恢复寄存器
       pop rdx
       pop rcx
       pop rax

       ret



2.在你的C++代码中,声明这个外部函数:


[C++] 纯文本查看 复制代码
   extern "C" void NakedFunction();

   int main() {
       NakedFunction();
       return 0;
   }



3.在Visual Studio中,将汇编文件添加到你的项目中,并确保项目设置允许使用汇编文件。
右键点击你的项目,选择“属性”。
在“配置属性” -> “C/C++” -> “命令行”中,添加以下选项:


[C++] 纯文本查看 复制代码
     /FAcs



在“配置属性” -> “链接器” -> “输入”中,确保汇编文件被正确引用。

免费评分

参与人数 1吾爱币 +1 收起 理由
董督秀 + 1 这个方法有局限性,只能写裸汇编;在32位的naked

查看全部评分

 楼主| 董督秀 发表于 2024-6-4 23:32
捷豹网络丶贱仔 发表于 2024-6-4 23:17
1.首先,创建一个汇编文件(例如 naked_function.asm),并在其中编写你的裸函数:
[mw_shl_code=cpp,tr ...

64位用这个方法有局限性,只能写裸汇编;在32位的naked声明之后,不仅能写裸汇编,还能参杂API或者其他函数/方法调用。我的需求是,在不换编译器的情况下,实现64位naked声明。
爱飞的猫 发表于 2024-6-5 06:49
MSVC 编译到 x64 目标时不可以。

官方文档:

Note that the naked attribute is only valid on x86 and ARM, and is not available on x64.
https://learn.microsoft.com/en-us/cpp/cpp/naked-cpp?view=msvc-170
 楼主| 董督秀 发表于 2024-6-5 10:27
爱飞的猫 发表于 2024-6-5 06:49
MSVC 编译到 x64 目标时不可以。

官方文档:

如果不换msvc编译器,能自己实现一个64位编译的naked声明吗?

点评

c/cpp 语言层应该不行。 单独的汇编文件可以。 msvc 也可以用 clang 编译器,这个可以内连汇编,但是语法不太一样。  详情 回复 发表于 2024-6-5 18:03
爱飞的猫 发表于 2024-6-5 18:03
董督秀 发表于 2024-6-5 10:27
如果不换msvc编译器,能自己实现一个64位编译的naked声明吗?

c/cpp 语言层应该不行。

单独的汇编文件可以。

msvc 也可以用 clang 编译器,这个可以内连汇编,但是语法不太一样。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-6-28 10:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表