我正在尝试为“ crackme”程序编写密钥生成程序。有一个很长的哈希函数,将它花费一些时间将其重写为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中搜索了我的问题,但是找不到与我的问题相关的任何主题。预先感谢您的任何帮助。
您可以尝试使用该__declspec(naked)
属性(http://msdn.microsoft.com/en-us/library/h5w10wxs.aspx):
对于用裸属性声明的函数,编译器生成的代码没有序言和结语代码。您可以使用此功能通过内联汇编代码编写自己的序言/结尾代码序列。裸函数在编写虚拟设备驱动程序时特别有用。请注意,裸属性仅在x86和ARM上有效,而在x64上不可用
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句