CN107391171B - 一种解决iOS热修复问题的方法以及用户终端 - Google Patents

一种解决iOS热修复问题的方法以及用户终端 Download PDF

Info

Publication number
CN107391171B
CN107391171B CN201710448247.3A CN201710448247A CN107391171B CN 107391171 B CN107391171 B CN 107391171B CN 201710448247 A CN201710448247 A CN 201710448247A CN 107391171 B CN107391171 B CN 107391171B
Authority
CN
China
Prior art keywords
class
objective
encrypted
digital signature
hot repair
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201710448247.3A
Other languages
English (en)
Other versions
CN107391171A (zh
Inventor
陈强
陈显财
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Guangdong Wangjin Holdings Co ltd
Original Assignee
Guangdong Wangjin Holdings Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Guangdong Wangjin Holdings Co ltd filed Critical Guangdong Wangjin Holdings Co ltd
Priority to CN201710448247.3A priority Critical patent/CN107391171B/zh
Publication of CN107391171A publication Critical patent/CN107391171A/zh
Application granted granted Critical
Publication of CN107391171B publication Critical patent/CN107391171B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/572Secure firmware programming, e.g. of basic input output system [BIOS]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/64Protecting data integrity, e.g. using checksums, certificates or signatures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • G06F8/656Updates while running
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/32Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
    • H04L9/3247Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials involving digital signatures
    • H04L9/3249Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials involving digital signatures using RSA or related signature schemes, e.g. Rabin scheme

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Health & Medical Sciences (AREA)
  • Bioethics (AREA)
  • General Health & Medical Sciences (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种解决iOS热修复问题的方法以及用户终端,方法一方面通过避开respondsToSelector方法和performSelector方法,通过使用runtime Library中的class_getInstanceMethod和class_getClassMethod方法,同样实现了查询Objective‑C类的方法是否存在的方法,以及运用NSInvocation和forwardInvocation实现消息的重定向,同样实现了消息的转发调用。本发明通过改进目前开源技术中存在的敏感函数问题,使具有热修复功能的产品能顺利通过苹果公司严格的审核。

Description

一种解决iOS热修复问题的方法以及用户终端
技术领域
本发明涉及IOS软件开发领域,具体涉及热修复功能开发领域。
背景技术
热修复作为一种快速解决IT产品线上异常的技术手段对于移动应用相关重要,特别在iOS平台上,由于苹果公司的审核周期一般较长,如果通过发布新的版本去修复上一版本出现的异常问题,则需要较长的周期,从而导致异常扩散,不仅影响App功能的正常使用,更严重损害产品的声誉和用户的体验,导致用户流失.而在开源的技术方案中,iOS平台实现热修复的功能的开源技术也不少,比如流行的JSPatch,Weex,RN等,但就在2017年3月8日左右,苹果公司针对运用这些热修复功能的产品提出了严厉的警告,甚至下架了多款使用以上热修复功能的产品,腾讯等大公司都有相关产品审核被拒。
行业内一片惊慌,各个产品都马上停止新上架的产品采用以上被点名的热修复技术,同时对第三方库是否加入以上热修复能力也进行严格的检查。而这些技术,之所以被苹果警告甚至审核拒绝最主要的原因是安全问题。一方面是没有遵守苹果公司的规定,调用了苹果禁止在应用商店使用的敏感函数如:dlopen(),dlsym(),respondsToSelector,performSelector,method_exchangeImplementations()等几个方法。
而另一方面是在使用这些动态热修复的过程中,没有进行安全方面的技术保障,导致容易被不法分子通过中间人攻击的手段篡改热修复的代码,下发恶意代码,形成严重的安全隐患,破坏苹果的生态***。
发明内容
为了克服现有技术的不足,本发明的目的之一在于提供一种解决iOS热修复问题的方法,解决和改进目前开源技术中存在的敏感函数问题和热修复安全性问题,使具有热修复功能的产品能顺利通过苹果公司严格的审核。
本发明的目的之二在于提供一种用户终端,解决和改进目前开源技术中存在的敏感函数问题和热修复安全性问题,使具有热修复功能的产品能顺利通过苹果公司严格的审核。
为实现上述目的之一,本发明所采用的技术方案如下:
一种解决iOS热修复问题的方法,包括以下步骤:
S101、解析内存中的热修复JavaScript脚本,生成热修复解析脚本;
S201、通过JavaScriptCore加载热修复解析脚本,利用闭包将热修复解析脚本中引用的Objective-C的信息回调至Objective-C中;
S301、通过NSClassFromString方法判断Objective-C中是否有所述信息中的类名所对应的类,若是,则执行步骤S401,若否,则在Objective-C中动态创建对应的类,并执行步骤S401;
S401、替换并缓存所述信息中的类名所对应的Objective-C中的类及其父类的消息重定向方法forwardInvocation;
S501、通过runtime Library中的class_getInstanceMethod方法和class_getClassMethod方法判断Objective-C中是否有所述信息中的方法名所对应的方法,若是,则执行步骤S601,若否,则执行步骤S701;
S601、通过runtime Library中的class_replaceMethod方法将所述信息中的方法名所对应的Objective-C中的方法的实现替换为消息转发的实现;
S701、通过runtime Library中的class_addMethod方法在所述信息中的方法名所对应的Objective-C中的方法中增加消息转发的实现;
S801、执行热修复的消息转发过程。
优选的,在步骤S801中,热修复的消息转发过程包括两种情况,当方法的实现在Objective-C中,执行第一种情况,包括以下步骤:
由热修复JavaScript脚本通过闭包将待调用信息回调至Objective-C中;
在Objective-C中通过runtime Library获取NSMethodSignature实例,并结合闭包返回的待调用信息构造成NSInvocation实例;
在Objective-C中执行NSInvocation实例中的invoke方法进行消息转发;
当JavaScript脚本向Objective-C的类增加了新的方法且执行到该新的方法时,执行第二种情况,包括以下步骤:
在Objective-C中调用消息重定向方法forwardInvocation;
在Objective-C中通过NSInvocation实例获取JavaScript脚本中对应方法调用的参数;
在Objective-C中通过JavaScriptCore提供的JSValue实例调用callWithArguments方法并传入参数,以实现调用JavaScript脚本中对应的方法并返回结果。
优选的,在步骤S101之前还包括热修复文件的下发步骤:
S001、从服务器端获取加密热修复文件;
S002、对加密热修复文件中的加密MD5数字签名进行解密,得到MD5数字签名;
S003、将所述MD5数字签名的值与计算获取到的加密热修复文件所得到的MD5值进行比较,若相同,则执行步骤S004,若不相同,则结束流程;
S004、将加密热修复文件进行解密并加载至内存中,生成热修复JavaScript脚本。
优选的,在服务器端中,通过XXTEA算法加密热修复文件生成所述加密热修复文件,并通过RSA私钥加密XXTEA解密密钥;
在步骤S004中,通过RSA公钥解密XXTEA解密密钥得到XXTEA密钥,再通过XXTEA密钥将加密热修复文件进行解密。
优选的,在服务器端中,通过计算加密热修复文件的MD5值生成所述MD5数字签名,并通过RSA私钥加密MD5数字签名,得到所述加密MD5数字签名;
在步骤S002中,通过RSA公钥对加密MD5数字签名进行解密。
为实现上述目的之二,本发明所采用的技术方案如下:
一种用户终端,包括:
存储器,用于存储程序指令;
处理器,用于运行所述程序指令,以执行以下步骤:
S101、解析内存中的热修复JavaScript脚本,生成热修复解析脚本;
S201、通过JavaScriptCore加载热修复解析脚本,利用闭包将热修复解析脚本中引用的Objective-C的信息回调至Objective-C中;
S301、通过NSClassFromString方法判断Objective-C中是否有所述信息中的类名所对应的类,若是,则执行步骤S401,若否,则在Objective-C中动态创建对应的类,并执行步骤S401;
S401、替换并缓存所述信息中的类名所对应的Objective-C中的类及其父类的消息重定向方法forwardInvocation;
S501、通过runtime Library中的class_getInstanceMethod方法和class_getClassMethod方法判断Objective-C中是否有所述信息中的方法名所对应的方法,若是,则执行步骤S601,若否,则执行步骤S701;
S601、通过runtime Library中的class_replaceMethod方法将所述信息中的方法名所对应的Objective-C中的方法的实现替换为消息转发的实现;
S701、通过runtime Library中的class_addMethod方法在所述信息中的方法名所对应的Objective-C中的方法中增加消息转发的实现;
S801、执行热修复的消息转发过程。
优选的,在步骤S801中,热修复的消息转发过程包括两种情况,当方法的实现在Objective-C中,执行第一种情况,包括以下步骤:
由热修复JavaScript脚本通过闭包将待调用信息回调至Objective-C中;
在Objective-C中通过runtime Library获取NSMethodSignature实例,并结合闭包返回的待调用信息构造成NSInvocation实例;
在Objective-C中执行NSInvocation实例中的invoke方法进行消息转发;
当JavaScript脚本向Objective-C的类增加了新的方法且执行到该新的方法时,执行第二种情况,包括以下步骤:
在Objective-C中调用消息重定向方法forwardInvocation;
在Objective-C中通过NSInvocation实例获取JavaScript脚本中对应方法调用的参数;
在Objective-C中通过JavaScriptCore提供的JSValue实例调用callWithArguments方法并传入参数,以实现调用JavaScript脚本中对应的方法并返回结果。
优选的,在步骤S101之前还包括热修复文件的下发步骤:
S001、从服务器端获取加密热修复文件;
S002、对加密热修复文件中的加密MD5数字签名进行解密,得到MD5数字签名;
S003、将所述MD5数字签名的值与计算获取到的加密热修复文件所得到的MD5值进行比较,若相同,则执行步骤S004,若不相同,则结束流程;
S004、将加密热修复文件进行解密并加载至内存中,生成热修复JavaScript脚本。
优选的,在服务器端中,通过XXTEA算法加密热修复文件生成所述加密热修复文件,并通过RSA私钥加密XXTEA解密密钥;
在步骤S004中,通过RSA公钥解密XXTEA解密密钥得到XXTEA密钥,再通过XXTEA密钥将加密热修复文件进行解密。
优选的,在服务器端中,通过计算加密热修复文件的MD5值生成所述MD5数字签名,并通过RSA私钥加密MD5数字签名,得到所述加密MD5数字签名;
在步骤S002中,通过RSA公钥对加密MD5数字签名进行解密。
相比现有技术,本发明的有益效果在于:
针对当前iOS***热修复技术中存在的两大问题进行技术的改进,一是通过避开苹果提到的敏感函数,采用正规的技术方案,解决审核过程中由于没有遵守苹果公司的审核条文而导致的审核被拒绝的问题。二是通过采用更安全复杂的加密技术解决热修复在使用过程中可能会遇到中间人攻击的情况。
附图说明
图1为本发明实施例一的解决iOS热修复问题的方法的流程图;
图2为本发明实施例一的Objective-C的消息转发原理图;
图3为本发明实施例二的用户终端的结构图。
具体实施方式
下面,结合附图以及具体实施方式,对本发明做进一步描述:
实施例一:
参考图1,本发明提供了一种解决iOS热修复问题的方法,包括以下步骤:
S001、从服务器端获取加密热修复文件;
S002、对加密热修复文件中的加密MD5数字签名进行解密,得到MD5数字签名;
S003、将所述MD5数字签名的值与计算获取到的加密热修复文件所得到的MD5值进行比较,若相同,则执行步骤S004,若不相同,则结束流程;
S004、将加密热修复文件进行解密并加载至内存中,生成热修复JavaScript脚本;
S101、解析内存中的热修复JavaScript脚本,生成热修复解析脚本;
S201、通过JavaScriptCore加载热修复解析脚本,利用闭包将热修复解析脚本中引用的Objective-C的信息回调至Objective-C中;
S301、通过NSClassFromString方法判断Objective-C中是否有所述信息中的类名所对应的类,若是,则执行步骤S401,若否,则在Objective-C中动态创建对应的类,并执行步骤S401;
S401、替换并缓存所述信息中的类名所对应的Objective-C中的类及其父类的消息重定向方法forwardInvocation;
S501、通过runtime Library中的class_getInstanceMethod方法和class_getClassMethod方法判断Objective-C中是否有所述信息中的方法名所对应的方法,若是,则执行步骤S601,若否,则执行步骤S701;
S601、通过runtime Library中的class_replaceMethod方法将所述信息中的方法名所对应的Objective-C中的方法的实现替换为消息转发的实现;
S701、通过runtime Library中的class_addMethod方法在所述信息中的方法名所对应的Objective-C中的方法中增加消息转发的实现;
S801、执行热修复的消息转发过程。
其中,在步骤S801中,热修复的消息转发过程包括两种情况,当方法的实现在Objective-C中,执行第一种情况,包括以下步骤:
由热修复JavaScript脚本通过闭包将待调用信息回调至Objective-C中;
在Objective-C中通过runtime Library获取NSMethodSignature实例,并结合闭包返回的待调用信息构造成NSInvocation实例;
在Objective-C中执行NSInvocation实例中的invoke方法进行消息转发;
当JavaScript脚本向Objective-C的类增加了新的方法且执行到该新的方法时,执行第二种情况,包括以下步骤:
在Objective-C中调用消息重定向方法forwardInvocation;
在Objective-C中通过NSInvocation实例获取JavaScript脚本中对应方法调用的参数;
在Objective-C中通过JavaScriptCore提供的JSValue实例调用callWithArguments方法并传入参数,以实现调用JavaScript脚本中对应的方法并返回结果。
进一步的,在服务器端中,通过XXTEA算法加密热修复文件生成所述加密热修复文件,并通过RSA私钥加密XXTEA解密密钥;
在步骤S004中,通过RSA公钥解密XXTEA解密密钥得到XXTEA密钥,再通过XXTEA密钥将加密热修复文件进行解密。
在服务器端中,通过计算加密热修复文件的MD5值生成所述MD5数字签名,并通过RSA私钥加密MD5数字签名,得到所述加密MD5数字签名;
在步骤S002中,通过RSA公钥对加密MD5数字签名进行解密。
下面结合本发明的方法作进一步详细说明。
一方面,步骤S001-S004解决了热修复安全性问题。热修复功能除了能敏捷地修复线上App的异常问题外,还能进行各种代码的下发,如果被不法分子所利用,对产品和用户都会产生严重的安全问题,本发明结合XXTEA加密和RSA非对称加密解决安全性问题。
服务器端通过对热修复文件代码进行XXTEA加密后,计算出MD5作为数字签名通过私钥加密后进行下发,由于私钥是保密的,该签名无法被修改;同时通过XXTEA加密的热修复文件也是保密的,XXTEA加密密钥也通过私钥加密,无法被修改。这样,就避免了中间人攻击,因为修改了这三个内容中的任何一个,都会导致热修复文件代码无法正常解密。
另一方面,步骤S101-S801解决了两个敏感方法导致不能上架的问题。一个是respondsToSelector方法,该方法主要是用在iOS***动态运行时判断某个类是否响应传入的方法,如果响应,则返回YES,如果不响应,则返回NO。以JSPatch为例子,使用该方法的主要目的是通过该方法判断热修复文件的JS脚本中下发的类方法是否是Objective-C类已经存在的方法,如果存在,则进行方法的覆盖,如果不存在,则通过Objective-C的runtime机制向该类增加脚本中该类新增的方法,使用该敏感方法无法正常上架苹果商店。另一个是performSelector方法,该方法主要用在iOS***动态运行时消息发起对象进行消息的调用,若消息发起对象不能响应该消息方法,***会抛出异常情况。在热修复中,通过该方法,可以让脚本在动态加载的过程中调用Objective-C相应的方法。同样地,苹果把该方法在热修复这个技术上列入了敏感方法,因此审核过程中使用该方法存在很大的技术风险。
步骤S101-S801的详细说明如下:
对JavaScript脚本进行解析,进行Objective-C(简称OC,iOS开发语言)方法的格式化替换,格式化替换的目的是使得JavaScript(简称JS,脚本语言)脚本里的OC方法调用可以方便地通过JS字符串的解析提取出函数的类,方法名字以及参数。
把解析完后的脚本内容通过JavaScriptCore(简称JSCore,公共库)的上下文实例JSContext(JS脚本的上下文环境)进行加载.JSCore提供了通过上下文实例创建JS方法,并可以通过block闭包(是OC中由函数和与其相关的引用环境组合而成的实体)在JS方法被调用时返回参数到OC环境中。通过预先设置好的JS方法,在热修复脚本中调用这些方法,就可以实现把脚本中引用的OC的类名,方法名,参数值等信息回传给OC的过程,实现JS脚本回调OC环境的过程。同时闭包的方法也提供了JS调用OC方法的途径。
把脚本用到的信息回传给OC环境的过程后,接下来要处理如何通过这些类名,方法名以及参数去调用OC环境的相应的类的方法。首先是通过NSClassFromString(获取类的C语言方法)方法判断类名对应的类是否存在OC环境中,向NSClassFromString传入类名,存在则返回该类,不存在则返回空。如果不存在,则通过给定的父类(也叫超类,生成一个新的类需要继承一个超类)的名字(脚本中父类的名字规定必须是OC环境中已存在的类)以继承的方式动态创建并注册一个新的类。
在类已经动态创建或存在的情况下,替换并缓存类和其父类的消息重定向方法forwardInvocation。替换重定向方法的目的是为了让JS中要替换的OC的方法以及JS新增的方法可以通过消息转发机制来进行消息转发.缓存是为了JS可回调同名方法对应原来的OC的方法实现。
当完成了对forwardInvocation的处理后,需要对JS中用到的OC的方法和新增的方法进行判断,这里用到了runtime Library(动态运行时的底层库)中的方法class_getInstanceMethod和class_getClassMethod来判断方法实现是否存在,class_getInstanceMethod和class_getClassMethod都需要传入类名和方法名作为参数,如果该类实现了该方法,则返回结果不为空,如果该类没有实现该方法,则返回结果为空。两个方法不同的是前者是判断OC类的实例方法,后者是判断OC类的类方法。
需要说明的是,OC都是通过消息转发执行的,正常情况下消息转发机制在第一步会进行方法实现IMP(OC方法对应的具体实现的指针)的查找,一旦查找到方法实现IMP就访回执行方法,不进行下一步的消息转发。但如果把方法的实现直接改成消息转发的实现_objc_msgForward(是一个IMP类型的函数指针,是用于消息转发的,当向一个对象发送一条消息,但它并没有实现的时候,_objc_msgForward会尝试做消息转发),那调用该类的这个方法时就不进行方法实现IMP的查询,而直接进行消息转发,调用消息重定向方法forwardInvocation:并返回类型为NSInvocation(NSInvocation是iOS消息传递和方法调用的一个类)的实例,实例中保存了方法所属的对象,方法名称,参数和返回值。
通过上面的判断,就知道类的方法是否存在,然后通过class_replaceMethod方法和class_addMethod方法进行类的方法替换和增加,把原有的类的方法实现替换成统一的消息转发的实现_objc_msgForward,增加的方法的实现也是_objc_msgForward,这样这些JS修复的OC方法和新增的方法都不会直接去查找方法实现IMP,而都统一跳转去消息转发函数forwardInvocation并返回NSInvocation实例。
步骤S101-S701完成了热修复脚本的加载过程,下面就是热修复脚本的执行过程,进行消息转发。热修复脚本执行的过程有两种情况,一种是JS通过闭包传参给OC调用OC的实例或者类的方法,该情况主要是方法的实现代码是在OC中。另一种是OC调用JS中新增的方法,该情况是热修复脚本增加了OC类的方法或者增加了新的类和方法。
第一种情况JS通过闭包回调传给OC环境要调用的类的实例,方法,参数等信息,然后OC拿到这些信息后,通过获取方法签名NSMethodSignature(该类为对方法的参数、返回类似进行封装,协同NSInvocation实现消息转发)实例,结合闭包返回的信息构造消息转发NSInvocation实例,然后执行该实例的方法invoke,OC环境会自动根据***的消息转发机制进行消息转发,实现OC方法的调用。
第二种情况是OC调用JS的实现,当热修复向OC的类新增了新的方法后,其实现实际上还是通过JS代码实现,所以当JS中的代码调用中执行到该新增方法时,由于在前面的步骤已经对该方法的实现替换成消息转发的实现,所以会进入消息重定向的方法forwardInvocation。这时可以通过NSInvocation实例解析成JS的方法,然后通过JSCore提供的方法callWithArguments(OC执行JS方法的函数),让JS方法的JSValue实例(OC中对JS进行封装的类)调用callWithArguments并传入参数,就可以实现OC回调JC方法实现并返回结果。
通过上述步骤,不使用respondsToSelector方法,通过使用runtime Library中的class_getInstanceMethod和class_getClassMethod方法,同样实现了查询Objective-C类的方法是否存在的方法。不使用performSelector方法,主要是运用NSInvocation和forwardInvocation实现消息的重定向,同样实现了消息的转发调用。
OC的消息转发原理如图2所示,其消息转发过程描述如下:
1)动态方法解析
向当前类发送resolveInstanceMethod:消息,检查是否动态向类添加了方法,如果返回YES,则***认为方法已经被添加,则会重新发送消息。
2)快速消息转发
检查当前类是否实现forwardingTargetForSelector:方法,若实现则调用,如果方法返回值为非nil或非self的对象,则向返回的对象重新发送消息。
3)常规消息转发
Runtime发送methodSignatureForSelector:消息获取selector对应方法的签名,如果有方法签名返回,则根据方法签名创建描述消息的NSInvocation,向当前对象发送forwardInvocation:消息,如果没有方法签名返回,即返回值为nil,则向当前对象发送doesNotRecognizeSelector:消息,应用崩溃退出。
基于上述消息转发的原理,在加载脚本的时候先勾住脚本中引用的类的消息重定向方法forwardInvocation,然后通过runtimeLibrary的方法class_replaceMethod、class_addMethod,将脚本中引用的Objective-C的类的相应的方法进行替换或者增加。而当脚本方法的调用时,通过runtime Library获取方法签名NSMethodSignature,然后用方法签名构造NSInvocation实例变量,用该变量执行消息重定向,完成常规消息的转发。整个消息转发过程避免了直接使用performSelector方法。
实施例二:
如图3所示,本发明提供了一种用户终端,包括:
存储器,用于存储程序指令;
处理器,用于运行所述程序指令,以执行以下步骤:
S101、解析内存中的热修复JavaScript脚本,生成热修复解析脚本;
S201、通过JavaScriptCore加载热修复解析脚本,利用闭包将热修复解析脚本中引用的Objective-C的信息回调至Objective-C中;
S301、通过NSClassFromString方法判断Objective-C中是否有所述信息中的类名所对应的类,若是,则执行步骤S401,若否,则在Objective-C中动态创建对应的类,并执行步骤S401;
S401、替换并缓存所述信息中的类名所对应的Objective-C中的类及其父类的消息重定向方法forwardInvocation;
S501、通过runtime Library中的class_getInstanceMethod方法和class_getClassMethod方法判断Objective-C中是否有所述信息中的方法名所对应的方法,若是,则执行步骤S601,若否,则执行步骤S701;
S601、通过runtime Library中的class_replaceMethod方法将所述信息中的方法名所对应的Objective-C中的方法的实现替换为消息转发的实现;
S701、通过runtime Library中的class_addMethod方法在所述信息中的方法名所对应的Objective-C中的方法中增加消息转发的实现;
S801、执行热修复的消息转发过程。
优选的,在步骤S801中,热修复的消息转发过程包括两种情况,当方法的实现在Objective-C中,执行第一种情况,包括以下步骤:
由热修复JavaScript脚本通过闭包将待调用信息回调至Objective-C中;
在Objective-C中通过runtime Library获取NSMethodSignature实例,并结合闭包返回的待调用信息构造成NSInvocation实例;
在Objective-C中执行NSInvocation实例中的invoke方法进行消息转发;
当JavaScript脚本向Objective-C的类增加了新的方法且执行到该新的方法时,执行第二种情况,包括以下步骤:
在Objective-C中调用消息重定向方法forwardInvocation;
在Objective-C中通过NSInvocation实例获取JavaScript脚本中对应方法调用的参数;
在Objective-C中通过JavaScriptCore提供的JSValue实例调用callWithArguments方法并传入参数,以实现调用JavaScript脚本中对应的方法并返回结果。
优选的,在步骤S101之前还包括热修复文件的下发步骤:
S001、从服务器端获取加密热修复文件;
S002、对加密热修复文件中的加密MD5数字签名进行解密,得到MD5数字签名;
S003、将所述MD5数字签名的值与计算获取到的加密热修复文件所得到的MD5值进行比较,若相同,则执行步骤S004,若不相同,则结束流程;
S004、将加密热修复文件进行解密并加载至内存中,生成热修复JavaScript脚本。
优选的,在服务器端中,通过XXTEA算法加密热修复文件生成所述加密热修复文件,并通过RSA私钥加密XXTEA解密密钥;
在步骤S004中,通过RSA公钥解密XXTEA解密密钥得到XXTEA密钥,再通过XXTEA密钥将加密热修复文件进行解密。
优选的,在服务器端中,通过计算加密热修复文件的MD5值生成所述MD5数字签名,并通过RSA私钥加密MD5数字签名,得到所述加密MD5数字签名;
在步骤S002中,通过RSA公钥对加密MD5数字签名进行解密。
对本领域的技术人员来说,可根据以上描述的技术方案以及构思,做出其它各种相应的改变以及形变,而所有的这些改变以及形变都应该属于本发明权利要求的保护范围之内。

Claims (8)

1.一种解决iOS热修复问题的方法,其特征在于,包括以下步骤:
S101、解析内存中的热修复JavaScript脚本,生成热修复解析脚本;
S201、通过JavaScriptCore加载热修复解析脚本,利用闭包将热修复解析脚本中引用的Objective-C的信息回调至Objective-C中;
S301、通过NSClassFromString方法判断Objective-C中是否有所述信息中的类名所对应的类,若是,则执行步骤S401,若否,则在Objective-C中动态创建对应的类,并执行步骤S401;
S401、替换并缓存所述信息中的类名所对应的Objective-C中的类及其父类的消息重定向方法forwardInvocation;
S501、通过runtime Library中的class_getInstanceMethod方法和class_getClassMethod方法判断Objective-C中是否有所述信息中的方法名所对应的方法,若是,则执行步骤S601,若否,则执行步骤S701;
S601、通过runtime Library中的class_replaceMethod方法将所述信息中的方法名所对应的Objective-C中的方法的实现替换为消息转发的实现;
S701、通过runtime Library中的class_addMethod方法在所述信息中的方法名所对应的Objective-C中的方法中增加消息转发的实现;
S801、执行热修复的消息转发过程,当方法的实现在Objective-C中,执行第一种情况,包括以下步骤:
由热修复JavaScript脚本通过闭包将待调用信息回调至Objective-C中;
在Objective-C中通过runtime Library获取NSMethodSignature实例,并结合闭包返回的待调用信息构造成NSInvocation实例;
在Objective-C中执行NSInvocation实例中的invoke方法进行消息转发;
当JavaScript脚本向Objective-C的类增加了新的方法且执行到该新的方法时,执行第二种情况,包括以下步骤:
在Objective-C中调用消息重定向方法forwardInvocation;
在Objective-C中通过NSInvocation实例获取JavaScript脚本中对应方法调用的参数;
在Objective-C中通过JavaScriptCore提供的JSValue实例调用callWithArguments方法并传入参数,以实现调用JavaScript脚本中对应的方法并返回结果。
2.根据权利要求1所述的解决iOS热修复问题的方法,其特征在于,在步骤S101之前还包括热修复文件的下发步骤:
S001、从服务器端获取加密热修复文件;
S002、对加密热修复文件中的加密MD5数字签名进行解密,得到MD5数字签名;
S003、将所述MD5数字签名的值与计算获取到的加密热修复文件所得到的MD5值进行比较,若相同,则执行步骤S004,若不相同,则结束流程;
S004、将加密热修复文件进行解密并加载至内存中,生成热修复JavaScript脚本。
3.根据权利要求2所述的解决iOS热修复问题的方法,其特征在于,在服务器端中,通过XXTEA算法加密热修复文件生成所述加密热修复文件,并通过RSA私钥加密XXTEA解密密钥;
在步骤S004中,通过RSA公钥解密XXTEA解密密钥得到XXTEA密钥,再通过XXTEA密钥将加密热修复文件进行解密。
4.根据权利要求2所述的解决iOS热修复问题的方法,其特征在于,在服务器端中,通过计算加密热修复文件的MD5值生成所述MD5数字签名,并通过RSA私钥加密MD5数字签名,得到所述加密MD5数字签名;
在步骤S002中,通过RSA公钥对加密MD5数字签名进行解密。
5.一种用户终端,其特征在于,包括:
存储器,用于存储程序指令;
处理器,用于运行所述程序指令,以执行以下步骤:
S101、解析内存中的热修复JavaScript脚本,生成热修复解析脚本;
S201、通过JavaScriptCore加载热修复解析脚本,利用闭包将热修复解析脚本中引用的Objective-C的信息回调至Objective-C中;
S301、通过NSClassFromString方法判断Objective-C中是否有所述信息中的类名所对应的类,若是,则执行步骤S401,若否,则在Objective-C中动态创建对应的类,并执行步骤S401;
S401、替换并缓存所述信息中的类名所对应的Objective-C中的类及其父类的消息重定向方法forwardInvocation;
S501、通过runtime Library中的class_getInstanceMethod方法和class_getClassMethod方法判断Objective-C中是否有所述信息中的方法名所对应的方法,若是,则执行步骤S601,若否,则执行步骤S701;
S601、通过runtime Library中的class_replaceMethod方法将所述信息中的方法名所对应的Objective-C中的方法的实现替换为消息转发的实现;
S701、通过runtime Library中的class_addMethod方法在所述信息中的方法名所对应的Objective-C中的方法中增加消息转发的实现;
S801、执行热修复的消息转发过程,当方法的实现在Objective-C中,执行第一种情况,包括以下步骤:
由热修复JavaScript脚本通过闭包将待调用信息回调至Objective-C中;
在Objective-C中通过runtime Library获取NSMethodSignature实例,并结合闭包返回的待调用信息构造成NSInvocation实例;
在Objective-C中执行NSInvocation实例中的invoke方法进行消息转发;
当JavaScript脚本向Objective-C的类增加了新的方法且执行到该新的方法时,执行第二种情况,包括以下步骤:
在Objective-C中调用消息重定向方法forwardInvocation;
在Objective-C中通过NSInvocation实例获取JavaScript脚本中对应方法调用的参数;
在Objective-C中通过JavaScriptCore提供的JSValue实例调用callWithArguments方法并传入参数,以实现调用JavaScript脚本中对应的方法并返回结果。
6.根据权利要求5所述的用户终端,其特征在于,在步骤S101之前还包括热修复文件的下发步骤:
S001、从服务器端获取加密热修复文件;
S002、对加密热修复文件中的加密MD5数字签名进行解密,得到MD5数字签名;
S003、将所述MD5数字签名的值与计算获取到的加密热修复文件所得到的MD5值进行比较,若相同,则执行步骤S004,若不相同,则结束流程;
S004、将加密热修复文件进行解密并加载至内存中,生成热修复JavaScript脚本。
7.根据权利要求6所述的用户终端,其特征在于,在服务器端中,通过XXTEA算法加密热修复文件生成所述加密热修复文件,并通过RSA私钥加密XXTEA解密密钥;
在步骤S004中,通过RSA公钥解密XXTEA解密密钥得到XXTEA密钥,再通过XXTEA密钥将加密热修复文件进行解密。
8.根据权利要求6所述的用户终端,其特征在于,在服务器端中,通过计算加密热修复文件的MD5值生成所述MD5数字签名,并通过RSA私钥加密MD5数字签名,得到所述加密MD5数字签名;
在步骤S002中,通过RSA公钥对加密MD5数字签名进行解密。
CN201710448247.3A 2017-06-14 2017-06-14 一种解决iOS热修复问题的方法以及用户终端 Active CN107391171B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710448247.3A CN107391171B (zh) 2017-06-14 2017-06-14 一种解决iOS热修复问题的方法以及用户终端

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710448247.3A CN107391171B (zh) 2017-06-14 2017-06-14 一种解决iOS热修复问题的方法以及用户终端

Publications (2)

Publication Number Publication Date
CN107391171A CN107391171A (zh) 2017-11-24
CN107391171B true CN107391171B (zh) 2020-06-09

Family

ID=60331893

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710448247.3A Active CN107391171B (zh) 2017-06-14 2017-06-14 一种解决iOS热修复问题的方法以及用户终端

Country Status (1)

Country Link
CN (1) CN107391171B (zh)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108052407A (zh) * 2017-12-13 2018-05-18 深圳乐信软件技术有限公司 一种应用程序崩溃防护方法、装置、设备及存储介质
CN109375932B (zh) * 2018-09-18 2022-03-01 广州虎牙信息科技有限公司 一种app热修复脚本构建的方法、装置、终端及存储介质
CN110321135B (zh) * 2019-06-28 2023-04-11 百度在线网络技术(北京)有限公司 热修复方法、装置、设备及计算机可读存储介质
CN110457151B (zh) * 2019-07-10 2022-01-28 五八有限公司 热修复方法、装置及可读存储介质
CN110427319B (zh) * 2019-07-22 2023-06-30 上海易点时空网络有限公司 基于ios的轻量级热修复方法及装置、存储介质
CN111857782B (zh) * 2020-07-27 2021-11-16 企查查科技有限公司 界面更新方法、装置、计算机设备和存储介质
CN112579094B (zh) * 2020-12-15 2024-05-14 上海赛可出行科技服务有限公司 一种基于模板代码匹配的轻量级热修复方法
CN114461226A (zh) * 2022-04-07 2022-05-10 广州易方信息科技股份有限公司 解决强制依赖的方法及装置
CN115296999B (zh) * 2022-09-28 2023-01-10 深圳依时货拉拉科技有限公司 移动端热修复方法、装置、热修复***及可读存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9438491B1 (en) * 2014-03-11 2016-09-06 Apteligent, Inc. Service monitor for monitoring a network connection to track the performance of an application running on different mobile devices
CN106227554A (zh) * 2016-07-08 2016-12-14 百度在线网络技术(北京)有限公司 一种在ios***中进行应用热更新的方法和装置

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9438491B1 (en) * 2014-03-11 2016-09-06 Apteligent, Inc. Service monitor for monitoring a network connection to track the performance of an application running on different mobile devices
CN106227554A (zh) * 2016-07-08 2016-12-14 百度在线网络技术(北京)有限公司 一种在ios***中进行应用热更新的方法和装置

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
iOS JSPatch 热修复实现原理详解;石虎132;《https://blog.csdn.net/shihuboke/article/details/73042691》;20170611;1-14 *
JSPatch被拒之完美解决方案;JackLee18;《https://blog.csdn.net/hanhailong18/article/details/64443350》;20170321;1-4 *
如何对类方法进行 Method Swizzling;佚名;《https://juejin.im/entry/581b23d4c4c9710055727f1a》;20161103;1-5 *

Also Published As

Publication number Publication date
CN107391171A (zh) 2017-11-24

Similar Documents

Publication Publication Date Title
CN107391171B (zh) 一种解决iOS热修复问题的方法以及用户终端
US9582668B2 (en) Quantifying the risks of applications for mobile devices
US9438631B2 (en) Off-device anti-malware protection for mobile devices
CN103563290B (zh) 公共加密体系结构服务中组合密钥控制信息的方法和***
US20110276805A1 (en) System and Method for Third Party Creation of Applications for Mobile Appliances
EP3270318B1 (en) Dynamic security module terminal device and method for operating same
CN1869927B (zh) 设备控制器、控制设备的方法及其程序
EP3186943B1 (en) Device verification prior to registration
CN104980397A (zh) 即时通信方法、***和终端
CN105975867B (zh) 一种数据处理方法
CN107870793B (zh) 一种应用程序中加载so文件的方法及装置
CN111159658B (zh) 字节码处理方法、***、装置、计算机设备和存储介质
CN107196761B (zh) 一种保护应用程序中的核心函数的方法
CN109697370A (zh) 数据库数据加解密方法、装置、计算机设备和存储介质
KR101499535B1 (ko) 컴퓨터 실행 가능한 하이브리드 어플리케이션 수행 방법, 이를 수행하는 컴퓨터 실행 장치 및 이를 저장한 기록 매체
CN109286604B (zh) 实现容器服务的方法、装置以及电子设备
CN115730319A (zh) 数据处理方法、装置、计算机设备和存储介质
Tran et al. Security issues in android application development and plug-in for android studio to support secure programming
CN112416395A (zh) 一种热修复更新方法和装置
Tedeschi et al. Information security and threats in mobile appliances
Choi et al. Large‐Scale Analysis of Remote Code Injection Attacks in Android Apps
CN109995534B (zh) 一种对应用程序进行安全认证的方法和装置
WO2019134278A1 (zh) 聊天加密方法、聊天解密方法、装置、电子终端及可读存储介质
AU2013237707A1 (en) Prevention of forgery of web requests to a server
US11171935B2 (en) Mobile device system and method for preventing network signal interception and hacking

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
PP01 Preservation of patent right

Effective date of registration: 20210922

Granted publication date: 20200609

PP01 Preservation of patent right