如何运行一段机器码?
如何直接运行一段机器码?
比如,我把一个文件映射到内存里,用一个指针p指向文件里的某一处,现在我知道这个文件从指针位置开始的二进制机器码是一段有意义的代码,我想运行这段代码,如何做?是直接*p();?
int main(){
void (*p)();
char lp[] = "dasdadfaasf";//假设这段代码是有意义的
p = (void (__cdecl *)(void))lp;
(*p)();
return 0;
}
error C2440: “类型转换”: 无法从“char [12]”转换为“void (__cdecl *)(void)”
//////////////////////////////////////////////////////////////////////////
int main(){
void (*p)();
char *lp = "dasdadfaasf";
p = (void (__cdecl *)(void))lp;
(*p)();
return 0;
}
现在编译通过了,可是执行的时候中断了。我现在的问题有两个,1为什么同是指针第一个编译不行第二个可以
2是第二个中断的原因究竟是lp的代码非法,还是lp的代码编译器根本就没打算执行,谁有没有可以执行的X86代码测试一下????????????
[解决办法]
现在编译通过了,可是执行的时候中断了。我现在的问题有两个,1为什么同是指针第一个编译不行第二个可以
两个都可以,不过第一个需要先转换成char * 或 void *
比如
- C/C++ code
int main(){ void (*p)(); char lp[] = "dasdadfaasf";//假设这段代码是有意义的 p = (void (__cdecl *)(void))(void*)lp; (*p)(); return 0;}
[解决办法]
编译通过不通过这是编译器的规则问题,不好说.
有些类型之间的转换在设计的时候也许设计人员觉得没有必要那么做,所以抱错了.
运行的问题,是系统保护导致的.
你指向的位置的内存属性不是可执行,所以会抱错,需要先设置内存页的属性.
[解决办法]
fun run的值不一样
因为VC里面调用函数的时候是先 jmp
然后call
a:jmp XXXXX
XXXXX:call YYYYY
你那个fun 跟run可能一个是a一个是XXXX