我正在尝试为一个“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中使用汇编代码,我在谷歌搜索我的问题,但我找不到与我的问题相关的任何主题。 提前感谢您的帮助。
答案 0 :(得分:3)
您可以尝试__declspec(naked)
属性(http://msdn.microsoft.com/en-us/library/h5w10wxs.aspx):
对于使用naked属性声明的函数,编译器 生成没有prolog和epilog代码的代码。你可以用它 使用内联编写自己的prolog / epilog代码序列的功能 汇编代码。裸函数在写作时特别有用 虚拟设备驱动。请注意,裸属性仅对有效 x86和ARM,在x64上不可用