最近在读梁肇新的《编程高手箴言》,对其中的c挂钩有不太明白的地方,望高手帮忙! 
  他是通过改写:
    call agc 
    agc: jmp [ae]
    ae:[函数地址]
  这种通过改写这种形式的机器码中的ae地址的值来达到挂钩的,我想系统自带的挂钩函数也可能是通过这种形式实现的吧
  然后在他的挂钩函数内部主要实现部分如下:
    if(lpbyte[0]==0xff && lpbyte[1]==0x25)
    { 
       lpaddr=(LPDWORD)(&lpbyte[2]);
       dwaddr=lpaddr[0];
       lpaddr=dwaddr;
       dwaddr=lpaddr[0];
       writeProcessMemory(,lpaddr,,,);
       return (lpbyte)dwaddr;
       
     }  我以前对改写机器码的理解是这样的:
   比如:
   0x100001234  e9 1234  jmp 0x10000464b
   0x100001239  c8        retn
   
   也就是jmp后面的跳转地址是通过 3412+100001239=10000464b得到的,而机器码e9后面的实际为偏移。  但是对于梁先生的代码确不是这样的,他仅仅是把e9后面的地址当做跳转地址而不是偏移,也就是没有进行地址修正。
  不知道我上述的理解是否正确,请知道的大侠不吝赐教!
  非常感谢