zoukankan      html  css  js  c++  java
  • hotpatch热修补

    查看系统函数的反汇编代码时会发现开头有个"mov edi,edi"(2字节),再往前则是5个nop指令(当然这不会引人注意),可是"mov edi,edi"有什么用了.

    上网搜索"mov edi,edi",结果让人惊奇,据说系统函数都添加了这段"无用"的代码,为的是Hot Patching,详细内容请自行搜索.

    通 过改写代码来挂接API时,一般是移动前几个字节加入jump指令,对于"mov edi,edi"开头的函数也习惯性的这样处理.可现在情况不同了,这7个字节提供了方便,文中提到了更好的办法,在mov指令处(即函数开始处)使用一 个短跳转指令(2字节)到上面的nop位置,这5个字节可以插入长跳转或call到远处.

    想做个什么,现在这类型的函数修改都可以这样千 篇一律,那我要做一个可以hook所有这些函数的接口,之后在自己的dll内根据函数地址分流. 以后想要hook某api只要修改这7个字节,就可以在我们自己的dll函数内收到信息(包括原函数地址,参数列表),还可以选择是否执行原函数.

    实现包含几部分
    1. 修改待hook api地址处的7个字节(5个nop和mov edi,edi),呼叫接口函数,call偏移为(接口函数地址-原函数地址)
    2. 接口函数的编写,需要取得原函数地址,参数列表后呼叫分流函数
    3. 分流函数,根据函数地址区分函数,做后续处理

    一般的hook需要5字节,lock 什么的,也最多同时操作4字节,如果要修改5字节,严格说来是要使用同步的,以防止其他CPU访问正被修改的指令。

    hotpatch的技法则是首先在函数上方,一般会因为对齐,或者编译时使用/hotpatch选项而预留出几字节的空间,首先在这些空间里写入一 个5字节的远程跳转,然后再将函数的俩字节mov edi,edi指令换成一个近跳转,跳到上方的长跳转中,2字节的修改。此种技法完全不用考虑同步...

  • 相关阅读:
    如何参与linux 内核开发
    绘制dot 图
    GITHUB 提交错误 Error: Permission denied (publickey) 解决
    atomic_read
    linux 获取cpu 个数
    【转】 管理CPU 亲和性
    【转】 申请对齐某种结构体大小的buffer
    WePY框架开发的小程序中使用 echarts折线图
    vue + css3 实现主题色切换
    vue 中 const { x } = this 的用法
  • 原文地址:https://www.cnblogs.com/bitxj/p/2722538.html
Copyright © 2011-2022 走看看