关于API Hook的问题(50分)

  • 主题发起人 主题发起人 vim
  • 开始时间 开始时间
V

vim

Unregistered / Unconfirmed
GUEST, unregistred user!
下面的代码是《Delphi下深入Windows核心编程》的一个屏幕取词的代码:<br> &nbsp; &nbsp; &nbsp;{以特权的方式来打开当前进程}<br> &nbsp; &nbsp; &nbsp;hProcess := OpenProcess(PROCESS_ALL_ACCESS,FALSE, GetCurrentProcessID);<br> &nbsp; &nbsp; &nbsp;{生成jmp xxxx的代码,共5字节}<br> &nbsp; &nbsp; &nbsp;Newcode.JmpCode := ShortInt($E9); {jmp指令的十六进制代码是E9}<br> &nbsp; &nbsp; &nbsp;NewCode.FuncAddr := DWORD(NewFunction) - DWORD(OldFunction) - 5;<br> &nbsp; &nbsp; &nbsp;{保存被截函数的前5个字节}<br> &nbsp; &nbsp; &nbsp;move(OldFunction^,OldCode,5);<br> &nbsp; &nbsp; &nbsp;{设置为还没有开始HOOK}<br> &nbsp; &nbsp; &nbsp;AlreadyHook:=false;<br>其中NewCode.FuncAddr := DWORD(NewFunction) - DWORD(OldFunction) - 5;这句代码不是很明白,哪位高手能够帮我解答一下呢??
 
JMP 0X12345678 是5个字节
 
能不能详细地说说,我就是不明白为什么要自定义的函数地址减去旧的函数地址跟着还要减去5
 
$E9这个指令是相对跳转。<br><br>EB  cb JMP rel8 相对短跳转(8位),使rel8处的代码位下一条指令 <br>E9  cw JMP rel16 &nbsp;相对跳转(16位),使rel16处的代码位下一条指令 <br>FF  /4 JMP r/m16 绝对跳转(16位),下一指令地址在r/m16中给出 <br>FF  /4 JMP r/m32 绝对跳转(32位),下一指令地址在r/m32中给出 <br>EA  cb JMP ptr16:16 远距离绝对跳转, 下一指令地址在操作数中 <br>EA  cb JMP ptr16:32 &nbsp;远距离绝对跳转, 下一指令地址在操作数中 <br>FF  /5 JMP m16:16 远距离绝对跳转, 下一指令地址在内存m16:16中 <br>FF  /5 JMP m16:32 &nbsp;远距离绝对跳转, 下一指令地址在内存m16:32中
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部