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);