要使用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;}
------------------------------------------------------------------------------
看看这个,从别人的帖子里拷的,看看他怎么得到代码的长度的。

解决方案 »

  1.   

    楼上大哥,我想你理解错我的意思了,我想得到指令长度,不是代码长度。
    这段代码我试了但好像有问题,我只把PRINTF改成了TRACE。
      

  2.   

    还是自己查的准一些!  不同级别的CPU都会不同的!
      

  3.   


    >> 回复人:Kevin_qing(Kevin) (2001-7-9 15:55:12)  
    >>最简单的办法,设置单步中断,然后计数  这样有一个问题,就是这段程序中有循环,jmp的情况下不适用。实际上,没有简单的方法,只有根据CPU的指令集的手册,一条条的解码(disassemble)计算。
      

  4.   

    同意楼上的
    不过可以在单步中断里面识别这几个指令,然后修改相应的返回地址。其实最大的问题是,不知道这个代码是否可以顺利运行,假如它里面有iretd之类的特权指令,实在没有什么简单方法来计数。只能查表了
      

  5.   

    这本书上说指令的第一个字节的最右一位(叫W位)是指出这个指令是字节指令还是字指令,此外可以根据REG和MOD位的状态求出操作数长度,加起来就是指令长度,我就是想用这种方法。
      

  6.   

    那位兄弟帮我找找INTEL关于X86指令集的白皮书
      

  7.   


    http://developer.intel.com/design/pentium/MANUALS/INDEX.HTMsee Instruction set reference manual, "Instruction Formats and encodings"
      

  8.   


    use "manuals" as keywords.
      

  9.   

    Great!我看了一下,那可不是好弄懂的东东,不过学懂以后肯定有用,谢谢xxxbird兄,接分!