c生成函数并调用它

c生成函数并调用它,c,x86,runtime,code-generation,C,X86,Runtime,Code Generation,从功能范围复制: void* func_runtime=VirtualAlloc(0, size=(((__end)-(__start)))+1, MEM_COMMIT, PAGE_EXECUTE_READWRITE); 但当我运行这个程序时,我可以: CopyMemory((void*)(__func_runtime),start,size-1); moviesi,尤指 按0E4FD14h 呼叫dword ptr ds:[0E55598h]; 这里的地址是指向该函数参数的“指针”,该参数也

从功能范围复制:

void* func_runtime=VirtualAlloc(0, size=(((__end)-(__start)))+1, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
但当我运行这个程序时,我可以:

CopyMemory((void*)(__func_runtime),start,size-1);
moviesi,尤指
按0E4FD14h
呼叫dword ptr ds:[0E55598h];
这里的地址是指向该函数参数的“指针”,该参数也是指针

指向指针的指针

使用:

你想调用func,它是一个指针。当你的呼救声传来时。。。函数,这将生成指向该指针的新指针。二级指针

void CallRuntimeFunction(void* address) {
_asm {
    mov ecx,[address] //we get address of "func"
    mov ecx,[ecx]   //we get "func"
    call [ecx]      //we jump func(ecx is an address. yes)
    }
}
是的func是一个指针


重要提示:检查编译器的“调用约定”选项。尝试decl one

确保函数代码生成和调用之间的缓存(指令和数据)无效。有关更多信息,请参见自修改代码。

如果此操作不起作用,请先尝试使用带有“lea”指令的changin first“mov”操作,甚至在它未进入功能之前。引发的异常是
违规读取位置
。在添加这些括号后,它引发了相同的异常:S。在将
mov
更改为
lea
后,它进入了另一个函数。编译器调用的约定是什么?快速呼叫?十二月?stdcall?我认为您应该尝试使用相同的地址标签(sectionname,out){mov[out],offset sectionname};旁注:不要使用以
开头的名称。是的,像这样?00125 68 00 00推力偏移_C@_0CB@ cFiopkp@?5?5?5?6?5?5?5?3?$FCI?5?5?5?5?5长度?3?$Fi?VC++10我知道这一点,因为我测试了
printf
它是推送和调用。
mov         esi,esp  
push        0E4FD14h  
call        dword ptr ds:[0E55598h] ; <--- printf ,after that I don't know what is it
add         esp,4  
cmp         esi,esp  
call        000B9DBB  ; <--- here
mov         dword ptr [ebp-198h],0  
lea         ecx,[ebp-34h]  
call        000B9C17  
mov         eax,dword ptr [ebp-198h]
jmp         000D01CB  
ret  
void CallRuntimeFunction(void* address) {
    __asm {
        call address
    }
}
void CallRuntimeFunction(void* address) {
_asm {
    mov ecx,[address] //we get address of "func"
    mov ecx,[ecx]   //we get "func"
    call [ecx]      //we jump func(ecx is an address. yes)
    }
}
void* func = CreateFunction(_start,_end);