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

时间:2014-01-07 00:07:53

标签: 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
        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中使用汇编代码,我在谷歌搜索我的问题,但我找不到与我的问题相关的任何主题。 提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您可以尝试__declspec(naked)属性(http://msdn.microsoft.com/en-us/library/h5w10wxs.aspx):

  

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