最近在读梁肇新的《编程高手箴言》,对其中的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后面的地址当做跳转地址而不是偏移,也就是没有进行地址修正。
不知道我上述的理解是否正确,请知道的大侠不吝赐教!
非常感谢
他是通过改写:
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后面的地址当做跳转地址而不是偏移,也就是没有进行地址修正。
不知道我上述的理解是否正确,请知道的大侠不吝赐教!
非常感谢
eb是短跳啊,我记得短跳也是要计算地址的啊!
不是这个意思,我是问他改写的jmp后面的地址没有通过计算,而我写过的都是通过计算得到的,想知道他这么写是否正确!谢谢!