如何将函数从反汇编复制到VisualStudio,并能够从C级调用它?

如何将函数从反汇编复制到VisualStudio,并能够从C级调用它?,c,visual-studio,assembly,C,Visual Studio,Assembly,我正在为一个“crackme”程序编写一个keygen。有一个相当长的散列函数,将其重写为C需要一些时间,所以我只想复制它并将其放在_asm括号中。所以我的问题是什么是最好的方法 我试着这样做: void hashFunction(unsigned int * arg1,unsigned int * arg2, unsigned int arg3) { __asm { // pure copy from disassembly PUSHAD

我正在为一个“crackme”程序编写一个keygen。有一个相当长的散列函数,将其重写为C需要一些时间,所以我只想复制它并将其放在_asm括号中。所以我的问题是什么是最好的方法

我试着这样做:

void hashFunction(unsigned int * arg1,unsigned int * arg2, unsigned int arg3)
{
    __asm
    {
        // pure copy from disassembly
        PUSHAD
        MOV ESI,DWORD PTR [ESP+0x24] // accesses the first argument
        MOV DWORD PTR [ESI],0x67452301
        MOV DWORD PTR [ESI+0x4],0xEFCDAB89
        ... 
}
我在玩编译器选项,试图强迫VS忽略创建帧堆栈并禁用优化,但无法使其工作。 VS生成以下代码:

PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI
PUSHAD
MOV ESI,DWORD PTR [ESP+24]  // no longer accesses the first argument
MOV DWORD PTR [ESI],67452301
MOV DWORD PTR [ESI+4],EFCDAB89
VS创建一个帧堆栈,并将一些寄存器推送到堆栈上,这在本例中显然是不需要的。我知道我仍然可以修复它,但我想一定有更好的方法来修复它?这是我第一次在VS中使用汇编代码,我在google中搜索了我的问题,但找不到任何与我的问题相关的主题。
提前感谢您的帮助。

您可以尝试
\u declspec(裸体)
属性():

对于使用裸属性声明的函数,编译器 生成没有prolog和epilog代码的代码。你可以用这个 使用inline编写自己的prolog/epilog代码序列的功能 汇编代码。裸函数在编写时特别有用 虚拟设备驱动程序。请注意,裸属性仅在上有效 x86和ARM,在x64上不可用


你需要帮助来对付你的恶意计划吗?:)您应该能够链接到从程序集编译的对象文件,不是吗?在添加了必要的咒语之后,在MS assembler中为函数创建一个符号表条目。@ddriver哈哈,正如我说的,我只是在解决一个预先制作的crackme:)@millimoose某种解决方案,我会记住的,谢谢