要使用release编译,否则因为VC会在fun call前面加jump得到错误的函数地址。其实用new都是可以的,#include <stdio.h>
#include <string.h>
#include <windows.h>
typedef int (*pIntFun)(int);typedef pIntFun (*ppFunFun)(int);_declspec(naked)
void virtual_start(){};int fun0(int parm)
{
return ++parm;
}
int fun1(int parm)
{
return --parm;
}
int fun2(int parm)
{
return parm*parm;
}pIntFun funX(int idx)
{
switch(idx%3)
{
case 0:
return fun0;
case 1:
return fun1;
case 2:
return fun2;
default:
return NULL;
}
}
_declspec(naked)
void virtual_end(){};
/*typedef unsigned long DWORD;
typedef unsigned char BYTE;
typedef const char* LPCSTR;
typedef void* LPVOID;*/void main()
{ DWORD len=(DWORD)virtual_end-(DWORD)virtual_start;
len+=16;
LPVOID ptr=new BYTE[len]; ppFunFun pfunX=(ppFunFun)((DWORD)ptr+DWORD(funX)-DWORD(virtual_start));
memcpy(ptr,virtual_start,len);
for(int i=0;i<10;i++)
{
printf("i=%d: %d\n",i,pfunX(i)(i));
} delete []ptr;}
------------------------------------------------------------------------------
看看这个,从别人的帖子里拷的,看看他怎么得到代码的长度的。
#include <string.h>
#include <windows.h>
typedef int (*pIntFun)(int);typedef pIntFun (*ppFunFun)(int);_declspec(naked)
void virtual_start(){};int fun0(int parm)
{
return ++parm;
}
int fun1(int parm)
{
return --parm;
}
int fun2(int parm)
{
return parm*parm;
}pIntFun funX(int idx)
{
switch(idx%3)
{
case 0:
return fun0;
case 1:
return fun1;
case 2:
return fun2;
default:
return NULL;
}
}
_declspec(naked)
void virtual_end(){};
/*typedef unsigned long DWORD;
typedef unsigned char BYTE;
typedef const char* LPCSTR;
typedef void* LPVOID;*/void main()
{ DWORD len=(DWORD)virtual_end-(DWORD)virtual_start;
len+=16;
LPVOID ptr=new BYTE[len]; ppFunFun pfunX=(ppFunFun)((DWORD)ptr+DWORD(funX)-DWORD(virtual_start));
memcpy(ptr,virtual_start,len);
for(int i=0;i<10;i++)
{
printf("i=%d: %d\n",i,pfunX(i)(i));
} delete []ptr;}
------------------------------------------------------------------------------
看看这个,从别人的帖子里拷的,看看他怎么得到代码的长度的。
解决方案 »
- VC关于CFile类写入结构体的问题。
- MFC编译的问题,using mfc in a static lib 和using mfc in a shared dll的区别
- 哪位大哥教教我waveInOpen()
- 小弟刚学COM,GGMM们能不能推荐几本好书?
- 在win2k下的应用程序如何获得管理员权限
- 谁能介绍一下CreateKernelThread它的参数和个各参数的定义?有msdn的朋友帮我查一下
- 如何才能实现往FlexGrid或(DBGrid) 控件中填加数据?谢谢大家。
- 求教:CRUNTIME类
- 难道没人知道com+的问题???
- MFC下的OCX,在IE中全屏
- 关于屏幕输出的问题
- 一点小问题
这段代码我试了但好像有问题,我只把PRINTF改成了TRACE。
>> 回复人:Kevin_qing(Kevin) (2001-7-9 15:55:12)
>>最简单的办法,设置单步中断,然后计数 这样有一个问题,就是这段程序中有循环,jmp的情况下不适用。实际上,没有简单的方法,只有根据CPU的指令集的手册,一条条的解码(disassemble)计算。
不过可以在单步中断里面识别这几个指令,然后修改相应的返回地址。其实最大的问题是,不知道这个代码是否可以顺利运行,假如它里面有iretd之类的特权指令,实在没有什么简单方法来计数。只能查表了
http://developer.intel.com/design/pentium/MANUALS/INDEX.HTMsee Instruction set reference manual, "Instruction Formats and encodings"
use "manuals" as keywords.