x86机器码中的编码功能。返回错误的结果

时间:2016-05-12 23:54:37

标签: c# assembly x86 disassembly

我正在做一些二进制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。

我在这里做错了什么?我错过了什么吗?

0 个答案:

没有答案