想象一下我做的事情是这样的:

void *p = malloc (1000);
*((char*)p) = some_opcode;
*((char*)p+1) = another_opcode; // for the sake of the example: the opcodes are ok

....
etc...

我怎么可以定义功能的指称p如果它是一个功能?(我采用VC++2008年express)。

感谢

有帮助吗?

解决方案

一个评论是不够的空间。Joe_Muc是正确的。你不应该的东西码进入存储器获得通过 mallocnew.你会遇到的问题,如果你改变页性页Windows分配.

这不是一个问题,因为使用VirtualAlloc()以及有关WIn32Api是每一个容易的:呼叫 VirtualAlloc( 中)和设置 flProtect[PAGE_EXECUTE_READWRITE][2]

注意,你也许应该做到三分配,一个警卫队网页,该网页为你需要为你的代码,然后又保护页。这会给你一点保护从糟糕代码。

还裹电话到你的电话产生的代码 结构异常的处理.

接下来,窗户X86ABI(调用公约)是不好的记录(我知道我看起来).有一些信息 在这里,, 在这里,, 在这里, 最好的方式来看看事情的工作是看产生的代码编译器。这是很容易做到的 \FA 开关 (有四)。

你可以找到64位叫公约 在这里,.

还有,你仍然可以获得微软的宏汇编 MASM在这里.我让你写你的机器码在MASM并期待在其输出,然后有你的机代码生成器做类似的事情。

英特尔的AMD 处理手册是很好的参考文献-让他们如果没有他们。

其他提示

其实,malloc的可能不会削减它。在Windows上,你可能需要调用类似[的VirtualAlloc(的 http://msdn.microsoft.com/en-us/library/aa366887(VS.85)的.aspx)为了得到的存储器中的可执行页面。

启动小:

void main(void)
{
    char* p = (char*)VirtualAlloc(NULL, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    p[0] = (char)0xC3;  // ret

    typedef void (*functype)();
    functype func = (functype)p;
    (*func)();
}

有关踢得好看与您的代码下一步是保存EBP寄存器。这是留给读者作为练习。 : - )

写这篇文章,我使用malloc运行它,它也工作了。这可能是因为我的Windows 2000服务器上运行一个管理员帐户。 Windows的其他版本可能真正需要的VirtualAlloc调用。谁知道。

如果您有到位正确的操作码,调用可以很简单铸造一个函数指针,并调用它。

typedef void (*voidFunc)();

char *p = malloc (1000);
p[0] = some_opcode;
p[1] = another_opcode; // for the sake of the example: the opcodes are ok
p[n] = // return opcode...

((voidFunc)p)();

不过,请注意,除非你标记页面为可执行,您的处理器可能不会让你执行堆中生成的代码。

我目前还在寻找执行中产生的代码,而答案在这里不给我正是我需要你们送我在正确的轨道。

如果你需要标记页面作为可执行的上POSIX系统(Linux,BSD等), 检查出来的 mmap(2)功能.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top