我正在做一些二进制x86编码,但它不起作用,即使二进制数对应于正确的反汇编二进制代码。
我用C#编写了一个程序,只是为了进行原型设计,将字节放在非托管内存中,我创建了一个委托,并执行了它但是我总是得到错误的结果 - 而且我已经使用了更简单的函数但是,例如一个返回4字节数字42的函数。
这是我尝试编码的函数,用C:
呈现int add(int a, int b) {
return a + b;
}
我用GCC编译它。结果在英特尔语法中呈现如下:
push rbp
mov rbp,rsp
mov DWORD PTR [rbp-0x4],edi
mov DWORD PTR [rbp-0x8],esi
mov edx,DWORD PTR [rbp-0x4]
mov eax,DWORD PTR [rbp-0x8]
add eax,edx
pop rbp
ret
机器代码中的内容是:
55
48 89 e5
89 7d fc
89 75 f8
8b 55 fc
8b 45 f8
01 d0
5d
c3
我将这些字节放在内存中,使用VirtualAlloc分配,并通过Marshal.GetDelegateForFunctionPointer检索此类型的委托:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate int Add(int a, int b);
当我调用函数"添加"使用参数2和3我会期望结果为5,但每次调用它时,我会得到不同的数字(可能是地址),如36204020。
我在这里做错了什么?我错过了什么吗?