• 热修复技术沉思:jspatch


    硬修复:

    直接修改工程源码,重新发版;

    冷修复:

    打补丁包,使用动态库和hook技术,在程序启动时完成问题代码修复;案例:iOS逆向工程;

    特征:不修改原始代码、补丁发布、目前不支持动态发布;

    热修复:

    可执行文件内直接继承热修复启动机制;

    程序启动后热修复引擎动态检查家在补丁包,完成动态hook;

    原理:

    1、修复引擎包含更新检查;

    2、消息重定向;将需要修改的功能和新添加的功能重定向到JPForwardInvocation;

    在JPForwardInvocation中区别对待无修改和修改过的函数;

    修改过的函数最终会调用js进行解释执行;

    3、js包含的修改过的功能最终会解释为oc执行;

    这个方法成功调用会经历哪些流程呢?

    基本上这就是一个Patch方法调用的流程。
    首先点击按钮调用handlebtn方法,其IMP未找到跑到消息转发流程,经过resolveInstanceMethod->forwardingTargetForSelector->forwardInvocation等方法,因为最后的forwardInvocation方法被用method swizzling 转换成了JPForwardInvocation,所以JPForwardInvocation被调用。
    首先查找方法对应的JPSelector是否存在,如果不存在调用原forward方法,如果存在调用JPSelector对应的IMP。
    记得上一篇我们在patch(即demo.js)加载时说过,会将Patch方法以JSValue的形式存储在OC的列表__JSOverrideMethods里面。
    这个JPSelector的IMP的功能就是找到以JSValue形式存储的Patch方法,然后调用它。

    https://www.mobilezhao.com/?tag=jspatch

  • 相关阅读:
    jQuery
    我的微信公众号被封了
    安装pillow
    win 10 无线标志都不出现
    msfvenom 摄像头
    Python list的定义和删改
    Python md5解密
    Python 同ip网站查询(制作网站接口)
    python 带参数运行
    Python 查看本机WiFi密码
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10945381.html
Copyright © 2020-2023  润新知