c语言怎么将一段自定义的buff转换成可执行的代码
c语言如何将一段自定义的buff转换成可执行的代码
我想做到的是自定义一个函数,例如 void helloworld() {printf("hello world\n");},然后将helloworld的内存赋值给一个buff,可以通过memcpy(buf, helloworld, 200);,然后将buf强转为helloworld的函数类型,执行buf。我想要的效果是跟执行真正的helloworld函数一样。我尝试了总是不可以执行。
下面是我使用过的策略,到(*func2)();就出现异常。
char* pfnRaw = (char*)HELLOTEST;
memcpy(testbuff2, HELLOTEST, 30);
PFNHELLOWORLD func = (PFNHELLOWORLD)(char*)testbuff2;
PFNHELLOWORLD func2 = (PFNHELLOWORLD)func;
VirtualProtect(func2,5,PAGE_EXECUTE_READWRITE,&dwOldProtect);
(*func2)();//不可以
func2 = (PFNHELLOWORLD)pfnRaw;
(*func2)();//只有用原始的才可以
其实我最根本就是想动态改变HELLOTEST的运行流程。虽然调用的是HELLOTEST,但是通过更改testbuff2的内存,我可以将它调用到其他的函数中。
------解决方案--------------------
看这里
http://bbs.****.net/topics/390125961
------解决方案--------------------
函数指针,实在不行自己嵌入汇编,自己控制!
------解决方案--------------------
function name is not an array!
------解决方案--------------------
为什么不用函数指针来完成就好了呢?
------解决方案--------------------
楼主强,怎么知道函数的长度?
如果可以,这种代码会被当成病毒来处理。
而且当代的操作系统都有内存保护。只有指定的内存区域可执行代码。
------解决方案--------------------
使用virtualprotect将你要改变的内存属性改为PAGE_EXCUTE_READWRITE,在xp下只要有readwrite权限即可,在vista和2008还有win7下必须有excute权限
------解决方案--------------------
testbuff2你在调用时最好使用汇编调用,以你现在的写法我不知道你清不清楚是谁在平栈,他有几个参数,用OD下在你要的位置上断点好好看看他是怎么平栈的吧,还有只是改变内存属性的话VirtualProtect(testbuff2,5,PAGE_EXECUTE_READWRITE,&dwOldProtect);即可,还有你只改变了5个字节,在执行到大于5字节的位置时在某些操作系统下将会出现问题
我想做到的是自定义一个函数,例如 void helloworld() {printf("hello world\n");},然后将helloworld的内存赋值给一个buff,可以通过memcpy(buf, helloworld, 200);,然后将buf强转为helloworld的函数类型,执行buf。我想要的效果是跟执行真正的helloworld函数一样。我尝试了总是不可以执行。
下面是我使用过的策略,到(*func2)();就出现异常。
char* pfnRaw = (char*)HELLOTEST;
memcpy(testbuff2, HELLOTEST, 30);
PFNHELLOWORLD func = (PFNHELLOWORLD)(char*)testbuff2;
PFNHELLOWORLD func2 = (PFNHELLOWORLD)func;
VirtualProtect(func2,5,PAGE_EXECUTE_READWRITE,&dwOldProtect);
(*func2)();//不可以
func2 = (PFNHELLOWORLD)pfnRaw;
(*func2)();//只有用原始的才可以
其实我最根本就是想动态改变HELLOTEST的运行流程。虽然调用的是HELLOTEST,但是通过更改testbuff2的内存,我可以将它调用到其他的函数中。
C
内存转换为函数
------解决方案--------------------
看这里
http://bbs.****.net/topics/390125961
------解决方案--------------------
函数指针,实在不行自己嵌入汇编,自己控制!
------解决方案--------------------
function name is not an array!
------解决方案--------------------
为什么不用函数指针来完成就好了呢?
------解决方案--------------------
楼主强,怎么知道函数的长度?
如果可以,这种代码会被当成病毒来处理。
而且当代的操作系统都有内存保护。只有指定的内存区域可执行代码。
------解决方案--------------------
使用virtualprotect将你要改变的内存属性改为PAGE_EXCUTE_READWRITE,在xp下只要有readwrite权限即可,在vista和2008还有win7下必须有excute权限
------解决方案--------------------
testbuff2你在调用时最好使用汇编调用,以你现在的写法我不知道你清不清楚是谁在平栈,他有几个参数,用OD下在你要的位置上断点好好看看他是怎么平栈的吧,还有只是改变内存属性的话VirtualProtect(testbuff2,5,PAGE_EXECUTE_READWRITE,&dwOldProtect);即可,还有你只改变了5个字节,在执行到大于5字节的位置时在某些操作系统下将会出现问题