对于挂接API函数的方法大概有两种,
1)通过修改输入节中的函数地址,
2)用JMP指令修改函数的头几个字节(一般为七个字节)。对于第二种方法,我有个不懂的地方:修改函数的头几个字节是不是用来修改它的基址?函数的那个 头几个字节的形式是怎样的?为什么只是修改五个字节?而不是8个字节(地址)?请高手们指点迷津,谢谢!这是 dongfa(一个红角好多年了~~~) 回复的:指令如下:
// mov eax, pNewFuncAddr
// jmp eaxchar chOldCode[7]; // 备份旧函数地址前7个字节
char chNewCode[7]; // 新的数据
....DWORD dwTemp = (DWORD)pNewAddr;
chNewCode[0] = 0xB8;
memcpy(chNewCode + 1, &dwTemp, sizeof(DWORD));
chNewCode[5] = 0xFF;
chNewCode[6] = 0xE0;
谢谢 dongfa(一个红角好多年了~~~) 再问个问题:
这些字节各自代表着什么含义?

解决方案 »

  1.   

    0xB8 is the first byte of mov eax, pNewFuncAddre instruction
    the rest 4 bytes are just the address0xFF 0xE0 should be jmp eax.In this code, 7 bytes are modified, so there needs to be saved.It's possible to modify 5 bytes only using relative jump instruction:        pProc[0] = 0xE9;
            * (unsigned *) (pProc+1) = (unsigned)pNewProc - (unsigned) (pProc+5);Check http://www.fengyuan.com/article/wmprint.html
      

  2.   

    修改函数的头几个字节就是把入口第1,2条汇编指令变成
    mov eax,你的处理代码入口
    jmp eax
    实现控制权的获得
      

  3.   

    谢谢 FengYuanMSFT(袁峰 www.fengyuan.com) 和  lcstudio(铁板牛牛)