• 1384阅读
  • 1回复

[游戏相关]授人以鱼不如授之以渔●HOOK基础篇二:跳转的处理 [复制链接]

上一主题 下一主题
离线啊冲
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2014-05-07
作者:重楼  
日期:2009-09-07
  
HOOK的前提就是把函数运行的时候跳转到我们自己的处理程序来.这是HOOK的第一步也是最重要的一步.  


[attachment=42672]  




图中 JMP PACKASSI.13148F88  对应内存是  E9  5C4372A1      

JMP对应 E9  而 13148F88 则 对应 5C4372A1  如果我们要写入跳转到13148F88的,这个时候我们应该往内存 地址 71A24C27  这里分别写入 E9 13 14 8F 88  这样就程序就会跳转到 13148F88 这个地址.  

这个时候就有个问题了 5C4372A1 是如何得出的呢?  

在CPU的寄存器中, EIP 指向的是 下一条 要执行代码的地址.所以执行71A24C27  :  JMP PACKASSI.13148F88  这条指令的时候 EIP 指向 71A24C2C .  


用JMP跳转到 一个地址 其实在内存里后面跟着的数值其实是一个偏移(详细的请看 王爽 的 汇编语言 JMP部分),那么这么我们就可以理解 其实我们想要跳转的地方 -  EIP 就等于这个偏移.  

我们来计算下 13148F88-71A24C2C  我们用系统自带的计算器 计算一下 得到的值 是 FFFFFFFFA172435C        

这里我们可以发现 这个值不就是我们在内存里的值么.  

这个时候我们又发现有不同的地方了,我们发现内存里的是 5C4372A1  

说到这里我们就要说一下内存的高位低位的问题. 在内存中最小的单位是字节, 也就是说 00-FF 最大储存255的数字, 一个汉字则要占据2个字节.也就是 ** ** .  

往内存里储存一个值,就要像 往水桶里倒水  


[attachment=42673]  


这幅图很清晰的表示了内存地址的存放.当内存地址需要储存一个数值, 如果需要4个字节,那么就会开辟出能储存4个字节的"水桶"然后依次放入.如果是2个字节 那么就是 2个字节的 "水桶" 也就是说E9 AA 在内存中存放的地址是 AA E9    ,  E9 DC  D8 F6  在内存中的存放地址就是 F6 D8 DC E9.  


好了,跳转的处理就处理完了.我们来总结一下  
* JMP 后面跟随的数值其实是 要跳转的地址 - 当前EIP  .这里注意了,有些朋友,可能注意到OD断在JMP的时候 EIP还是指向 JMP这句,其实这是 CPU还没有运行JMP这条指令 这里只是OD指向下一条指令. 当执行到JMP的时候  首先EIP指向下一条, 然后 跳转到 EIP+ 偏移 的地方.  

*内存中的储存方式是 高位放低位.反过来存放  
善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
离线页游辅助

只看该作者 沙发  发表于: 2017-06-28
学习!!!谢谢
很懒
快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个