CN110290204B - 一种浏览器过代理的实现方法、装置及终端设备 - Google Patents

一种浏览器过代理的实现方法、装置及终端设备 Download PDF

Info

Publication number
CN110290204B
CN110290204B CN201910554962.4A CN201910554962A CN110290204B CN 110290204 B CN110290204 B CN 110290204B CN 201910554962 A CN201910554962 A CN 201910554962A CN 110290204 B CN110290204 B CN 110290204B
Authority
CN
China
Prior art keywords
network
browser
memory
data
memory address
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
CN201910554962.4A
Other languages
English (en)
Other versions
CN110290204A (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.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen 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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201910554962.4A priority Critical patent/CN110290204B/zh
Publication of CN110290204A publication Critical patent/CN110290204A/zh
Application granted granted Critical
Publication of CN110290204B publication Critical patent/CN110290204B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L65/00Network arrangements, protocols or services for supporting real-time applications in data packet communication
    • H04L65/1066Session management
    • H04L65/1073Registration or de-registration
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/01Protocols
    • H04L67/02Protocols based on web technology, e.g. hypertext transfer protocol [HTTP]
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/50Network services
    • H04L67/56Provisioning of proxy services

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Signal Processing (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Theoretical Computer Science (AREA)
  • Multimedia (AREA)
  • Business, Economics & Management (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • General Business, Economics & Management (AREA)
  • Information Transfer Between Computers (AREA)
  • Computer And Data Communications (AREA)

Abstract

本申请提供的浏览器过代理的实现方法、装置及终端设备,通过将浏览器引擎加载至系统内存,确定浏览器引擎中的预定静态变量在内存中对应的内存地址并向该地址写入预定网络协议的协议信息,以及将所写入的协议信息传递至网络代理层,实现了在网络代理层对预定网络协议进行注册,在该注册的基础上,后续,则可利用网络代理层对浏览器的网络请求进行过代理。由此,本申请提供了一种通过写内存方式将网络协议注册至网络代理层、进而在网络代理层对网络请求进行过代理的技术方案,基于本申请方案,有效解决了过代理缺陷的问题。

Description

一种浏览器过代理的实现方法、装置及终端设备
技术领域
本申请属于应用层网络请求过代理技术领域,尤其涉及一种浏览器过代理的实现方法、装置及终端设备。
背景技术
过代理,通常指的是让应用的所有网络请求都交给某个网络代理层进行处理,在网络代理层统一控制每个网络请求的请求与响应,在需要时还可以在网络代理层增加额外的处理逻辑。
这个网络代理层在苹果公司的移动操作系统iOS上通常是指NSURLProtocol,NSURLProtocol是苹果公司提供的一套用于接管应用的网络请求的接口,iOS平台基于NSURLProtocol来实现对支持浏览器引擎(WebKit)的iOS应用的浏览器(WKWebView)过代理。其中,iOS平台的浏览器引擎源码里提供了如下的私有API(Application ProgrammingInterface,应用程序编程接口):[WKBrowsingContextControllerregisterSchemeForCustomProtocol:],现有iOS平台通过调用该私有API进行过代理注册来实现网络请求的过代理,即,通过调用该私有API将网络协议如http/https等注册至NSURLProtocol,在此基础上,针对应用的网络请求如http/https请求,可通过将其走系统的NSURLProtocol代理协议,实现对网络请求的过代理。
然而,苹果公司的上述私有API已被浏览器引擎标记为废弃,调用该私有API的应用在应用商店存在下架风险,一旦被举报或审核发现,就会被下架处理;另外该私有API还面临着维护性问题,可能会随时在升级后的新系统(如新的iOS系统)里无法使用。由此,提供一种在不调用任何私有API的情况下进行浏览器过代理的实现方案十分必要。
发明内容
有鉴于此,本申请的目的在于提供一种浏览器过代理的实现方法、装置及终端设备,用于实现在不调用任何私有API的情况下进行浏览器过代理,以规避私有API因审核、检测、举报或系统升级后的废弃等问题所导致的过代理缺陷。
为实现上述目的,一方面,本申请提供了一种浏览器过代理的实现方法,该方法包括:
将浏览器引擎加载至系统内存;
确定所述浏览器引擎中的预定静态变量在内存中对应的内存地址;
向所述内存地址写入预定网络协议的协议信息;
利用所述浏览器引擎的网络接口将内存中的所述协议信息传递至网络代理层,以实现在所述网络代理层注册所述预定网络协议;
若浏览器产生网络请求,则将浏览器的网络请求传递至所述网络代理层,以使得利用所述网络代理层对所述网络请求进行过代理。
又一方面,本申请还提供了一种浏览器过代理的实现装置,该装置包括:
加载单元,用于将浏览器引擎加载至系统内存;
确定单元,用于确定所述浏览器引擎中的预定静态变量在内存中对应的内存地址;
写内存单元,用于向所述内存地址写入预定网络协议的协议信息;
注册单元,用于利用所述浏览器引擎的网络接口将内存中的所述协议信息传递至网络代理层,以实现在所述网络代理层注册所述预定网络协议;
过代理单元,用于若浏览器产生网络请求,则将浏览器的网络请求传递至所述网络代理层,以使得利用所述网络代理层对所述网络请求进行过代理。
再一方面,本申请还提供了一种终端设备,该终端设备包括:
存储器,用于存储程序;
处理器,用于执行所述程序,所述程序至少用于:
将浏览器引擎加载至系统内存;
确定所述浏览器引擎中的预定静态变量在内存中对应的内存地址;
向所述内存地址写入预定网络协议的协议信息;
利用所述浏览器引擎的网络接口将内存中的所述协议信息传递至网络代理层,以实现在所述网络代理层注册所述预定网络协议;
若浏览器产生网络请求,则将浏览器的网络请求传递至所述网络代理层,以使得利用所述网络代理层对所述网络请求进行过代理。
由以上方案可知,本申请提供的浏览器过代理的实现方法、装置及终端设备,通过将浏览器引擎加载至系统内存,确定浏览器引擎中的预定静态变量在内存中对应的内存地址并向该地址写入预定网络协议的协议信息,以及利用浏览器引擎的网络接口将所写入的协议信息传递至网络代理层,实现了在网络代理层对所述预定网络协议进行注册,在该注册的基础上,后续,若浏览器产生了网络请求,则可利用网络代理层对所述网络请求进行过代理。由此,本申请提供了一种通过写内存方式将所需的网络协议注册至网络代理层、进而在网络代理层对网络请求进行过代理的技术方案,基于本申请方案,无需调用浏览器引擎的任何私有API即可实现浏览器过代理,有效规避了私有API因审核、检测、举报或系统升级后的废弃等问题所导致的过代理缺陷。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1是本申请实施例中一种浏览器过代理的实现方法所适用的终端设备的一种组成结构示意图;
图2是本申请实施例中一种浏览器过代理的实现方法的一种流程示意图;
图3是现有技术中iOS的WebKit的私有API在调用各接口函数时所对应的函数调用依赖关系示意图;
图4是本申请实施例中确定静态变量对应的内存地址的实现流程图;
图5是iOS的浏览器引擎可执行文件Mach-O的文件结构示意图;
图6是浏览器引擎可执行文件Mach-O在被加载至内存后操作系统进程所对应的内存布局示意图;
图7是本申请实施例中一种浏览器过代理的实现方法的另一种流程示意图;
图8是本申请实施例中基于hook技术将js侧数据转发至网络代理层的逻辑示意图;
图9是本申请实施例中在进行过代理时,浏览器网页、客户端应用、网络代理层与操作系统网络层之间的数据流向关系图;
图10是本申请实施例中在iOS平台上实现WKWebView过代理场景下的处理逻辑示意图;
图11是本申请实施例中一种浏览器过代理的实现装置的一种结构示意图;
图12是本申请实施例中一种浏览器过代理的实现装置的一种结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
作为本申请实施例的一个方面,本申请提供了一种浏览器过代理的实现方法,该方法可通过写内存方式实现在不调用任何私有API的情况下进行浏览器过代理,以规避私有API因审核、检测、举报或系统升级后的废弃等问题所导致的过代理缺陷。
可选的,上述浏览器过代理的实现方法可以应用在终端设备中,作为一种典型的应用场景,其可以应用于智能手机、平板电脑等移动终端中支持浏览器引擎的应用也即浏览器类应用中,比如,具体应用于支持浏览器引擎WebKit的iOS应用中等。
参阅图1,其示出了本申请实施例的浏览器过代理实现方法所适用的终端设备的一种组成结构示意图。在图1中,该终端设备可以包括:处理器101和存储器102。当然,还可以包括通信接口103、输入单元104、显示器105和通信总线106。
其中,处理器101、存储器102、通信接口103、输入单元104及显示器105,均通过通信总线106完成相互间的通信。
在本申请实施例中,该处理器101,可以为中央处理器(Central ProcessingUnit,CPU),特定应用集成电路(application-specific integrated circuit,ASIC),数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件等。
该处理器101可以调用存储器102中存储的程序。
存储器102中用于存放一个或者一个以上程序,程序可以包括程序代码,所述程序代码包括计算机操作指令,在本申请实施例中,该存储器102中至少存储有用于实现以下功能的程序:
将浏览器引擎加载至系统内存;
确定所述浏览器引擎中的预定静态变量在内存中对应的内存地址;
向所述内存地址写入预定网络协议的协议信息;
利用所述浏览器引擎的网络接口将内存中的所述协议信息传递至网络代理层,以实现在所述网络代理层注册所述预定网络协议;
若浏览器产生网络请求,则将浏览器的网络请求传递至所述网络代理层,以使得利用所述网络代理层对所述网络请求进行过代理。
在一种可能的实现方式中,该存储器102可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、以及至少一个功能(比如声音播放功能、图像播放功能等)所需的应用程序等;存储数据区可存储根据计算机的使用过程中所创建的数据,比如,用户数据、用户访问数据以及音频数据等等。
此外,存储器102可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
通信接口103可以为通信模块的接口,如GSM模块的接口。
输入单元104可以为触摸感应单元、键盘等等。显示器105可以包括显示面板,如触摸显示面板等。
当然,图1所示的终端设备结构并不构成对本申请实施例中终端设备的限定,在实际应用中该终端设备可以包括比图1所示的更多或更少的部件,或者组合某些部件。
以下将基于本申请实施例涉及的上述共性方面,对本申请实施例进一步详细说明。如图2所示,为本申请实施例提供的一种浏览器过代理的实现方法的流程示意图,该方法包括:
步骤S201、将浏览器引擎加载至系统内存。
本实施例将主要以应用于移动终端中支持浏览器引擎WebKit的应用也即浏览器类应用这一典型场景为例,对本申请的方法进行说明。
如上文所述,iOS平台的浏览器引擎源码里提供了如下的私有API:[WKBrowsingContextControllerregisterSchemeForCustomProtocol:],现有iOS平台通过调用该私有API进行过代理注册来实现网络请求的过代理,即,通过调用该私有API将网络协议如http/https等注册至NSURLProtocol,在此基础上,针对应用的网络请求如http/https请求,可通过将其走系统的NSURLProtocol代理协议,实现对网络请求的过代理。
申请人经过对iOS平台的浏览器引擎的上述私有API进行研究,发现该私有API本质是通过调用registerSchemeForCustomProtocol接口、registerGlobalURLSchemeAsHavingCustomProtocolHandlers接口以及globalURLSchemeWithCustomProtocolHandler接口这几个接口函数,来实现向网络代理层NSURLProtocol指定所需处理的网络协议,进而实现这些网络协议在网络代理层NSURLProtocol的注册。该API在调用各接口函数时对应的实际函数调用依赖关系具体可参阅图3所示,其中,以需要向网络代理层注册http、https为例,所述egisterSchemeForCustomProtocol接口用于将http或https的字符串传给图3中的WebProcessPool层,registerGlobalURLSchemeAsHavingCustomProtocolHandlers接口是用于将上层传入的http、https字符串注册到网络代理层NSURLProtocol,让NSURLProtocol可以来处理http、https请求,globalURLSchemeWithCustomProtocolHandler接口是用于获取一个集合,这个集合指明了什么协议可以被网络代理层处理,例如http、https等。
基于以上研究,可以发现,iOS平台的浏览器引擎WebKit本身是设计支持了WKWebView过NSURLProtocol代理功能的,且底层能力基本完备,只是上述各API接口(即图3中所示出的各接口函数)是私有的、不提供给上层的客户端应用使用,同时申请人发现iOS平台的浏览器引擎WebKit的这套设计本质是按图3示出的依赖关系通过调用各接口,来修改浏览器引擎中的静态HashSet对象这一静态变量进而实现向网络代理层添加注册http、https网络协议的。由此,可以确定出,只要让这个静态变量的内容有http和https字符串,就能够间接实现浏览器过代理。
鉴于此,本申请提出了一种通过直接对该静态变量进行写内存,即直接向该静态变量在内存中对应的位置处写入所需的网络协议信息,来间接实现浏览器过代理的技术构思。
基于上述技术构思,在实现本申请方案时,需要首先将浏览器引擎加载至系统内存,其中,具体地,可以在每一支持浏览器引擎WebKit的应用也即浏览器类应用启动时,将浏览器引擎所对应的可执行文件加载至系统内存中,浏览器引擎所对应的可执行文件中包括了上述的静态变量,由此,实现了为针对该静态变量的写内存提供了基础。
步骤S202、确定所述浏览器引擎中的预定静态变量在内存中对应的内存地址。
在针对上述静态变量进行写内存时,必然需要首先确定该静态变量在内存中对应的内存地址,以下将详细陈述确定该静态变量在内存中对应的内存地址的实现过程。
参阅图4,具体可通过以下处理来确定出该静态变量在内存中对应的内存地址:
步骤S401、确定所述预定静态变量对应的内存地址相比于该预定静态变量所属的数据块的起始内存地址的第一偏移;
步骤S402、确定所述数据块的起始内存地址相比于所述浏览器引擎的可执行文件的起始内存地址的第二偏移;
步骤S403、确定所述浏览器引擎的可执行文件在加载至内存时所对应的随机偏移;
步骤S404、利用所述第一偏移、所述第二偏移及所述随机偏移,计算所述预定静态变量在内存中对应的内存地址。
具体地,iOS的可执行文件是一个Mach-O文件,Mach-O文件的文件结构具体可参阅图5所示,包括文件头Headder、命令区(commands)和数据区(data),dyld(the dynamiclink editor,苹果的动态链接器)在创建进程文件时,会从Mach-O文件里找到对应的代码段和main函数由此找到程序入口,同时也会加载动态库,而WebKit就是其中的一个动态库。当应用启动过程中在加载创建进程时,系统会按顺序加载所依赖的动态库。其中WKWebView就在WebKit.framework这个动态库中,dyld加载WebKit.framework时会将其数据段映射到程序的内存地址空间中,默认权限为可读可写。
浏览器引擎的Mach-O可执行文件在被加载至内存后其操作系统进程所对应的内存布局具体可参阅图6,其中,未初始化的静态变量存放在Mach-O的DATA segment所对应的__bss section处。因此该静态变量的内存地址就在__bss section所指向的内存区域中,从而,只要确定出__bss section和该静态变量地址的偏移关系,就能够获知浏览器类应用每次启动时进程中映射的该静态变量的内存地址。
Mach-O文件在被dyld加载到进程地址空间后,会在其原始文件的虚拟地址基础上加一个随机偏移,并将加上该随机偏移后所得的和值作为其在内存中的地址,然后会把Mach-O文件对应的__DATA段各个section的内容全量映射到连续的进程内存空间,即在其内存布局结构中的BSS(Block Started By Symbol)中的__bss section区内存放连续未初始化静态变量。由此,只要找到上述未初始化的静态变量(HashSet)相对于该Mach-O文件的偏移量,然后将偏移量加上该随机偏移值,即可得到该未初始化的静态变量(HashSet)的内存地址。被映射到进程内存空间__bss section的内存,其权限是可读可写,从而,针对上述的静态变量(HashSet),能够具备直接访问其内存地址、修改其内存内容的权限。
本实施例假设上述未初始化的静态变量(HashSet)在浏览器引擎Mach-O文件的__bss section内的块内偏移(也即该静态变量的内存地址相对于该块在内存中的初始内存地址的第一偏移)为offx,该__bss section块的初始内存地址相对于所述浏览器引擎的Mach-O文件的初始内存地址偏移为base(也即所述第二偏移),Mach-O文件加载至内存后对应的随机偏移为slide,则该未初始化的静态变量(HashSet)的内存地址y如下:
y=offx+base+slide
由此,只要确定出上述的第一偏移offx、第二偏移base,随机偏移slide这三个参量的值,就可以获知上述静态变量的内存地址。
这里,需要说明的是,正常情况下,标准的Mach-O文件都是存放在__DATA segment的__bss section块内的,而比较特殊的是,浏览器引擎的该静态变量(HashSet)则是存放在Mach-O的__DATA_DIRTY segment段对应的__bss section块内;因此,具体实施中,可基于这一实际情况来确定上述三个参量的取值。
上述三个参量中的第一偏移offx,是上述静态变量(HashSet)相对于其所属的数据块__bss section的块内偏移,只要找到哪里访问了y2(即编译后得到的Mach-O产物中该静态变量的虚拟地址),便能间接推导出offx,计算公式如下:
y2=offx+base 2;
其中,base2是上述静态变量(HashSet)所属的数据块__bss section相对于Mach-O的虚拟地址,可以直接通过遍历Mach-O的section来查找得到__DATA_DIRTY segment段内的该__bss section块的起始地址,并将该起始地址作为base2的值。
根据Mach-O文件的特性,y2只能在代码段内找到,即哪里访问了y2,y2的值就能在哪里被找到。发明人经研究发现,y2具体在图3所示各接口函数中的globalURLSchemesWithCustomProtocolHandlers函数内被访问,而Mach-O文件在加载至内存时被映射至上述图6中的__TEXT代码段中,因此只要在__TEXT代码段内找到这个函数,并根据最终访问y2的汇编代码来确定y2即可。
如下是最终访问y2的汇编代码:
0x1f196b748<+0>:subsp,sp,#0x50;=0x50
0x1f196b74c<+4>:stp x22,x21,[sp,#0x20]
0x1f196b750<+8>:stp x20,x19,[sp,#0x30]
0x1f196b754<+12>:stp x29,x30,[sp,#0x40]
0x1f196b758<+16>:add x29,sp,#0x40;=0x40
0x1f196b75c<+20>:mov x19,x0
0x1f196b760<+24>:ldr x8,[x19]
0x1f196b764<+28>:cbz x8,0x1f196b7c0;<+120>
0x1f196b768<+32>:adrp x8,169719
0x1f196b76c<+36>:ldrb w9,[x8,#0x948]
0x1f196b770<+40>:tbz w9,#0x0,0x1f196b7d4;<+140>
0x1f196b774<+44>:adrp x0,169719
0x1f196b778<+48>:add x0,x0,#0x930;=0x930
0x1f196b77c<+52>:add x8,sp,#0x8;=0x8
0x1f196b780<+56>:mov x1,x19
0x1f196b784<+60>:bl0x1f16f168c;WTF::HashTable<WTF::String,
WTF::String,WTF::IdentityExtractor,WTF::ASCIICaseInsensitiveHash,
WTF::HashTraits<WTF::String>,
WTF::HashTraits<WTF::String>>::add(WTF::String const&)
由上述的汇编代码,可以获知在进程地址0x1f196b784处,执行了该静态变量(HashSet)的add(即往HashSet里添加元素或内容)方法,其中x0寄存器就是y2的值,可以根据以上指令来计算出y2的值。此时:
y2=PC&(2^12)+169719*(2^12)+0x930
其中,PC是指PC寄存器的值(指向当前指令地址),当前PC=0x1f196b774。
在确定出y2的基础上,进一步结合上述的计算式y2=offx+base 2,便可以确定出offx的值。
对于上述三个参量中的第二偏移base,可直接调用dyld接口函数获取到浏览器引擎中相应framework中的某个segment的进程加载后地址,通过调用dyld Mach-O相关接口,遍历该framework的segment_command,找到该静态变量(HashSet)对应的__bss section即可。
对于上述三个参量中的随机偏移slide,可以根据指定的动态库名字,如WebKit,遍历所有加载的动态库获取到其加载到内存的起始地址与随机偏移(即地址空间配置随机加载aslr偏移)。
在此基础上,则可以基于上述的计算式y=offx+base+slide最终计算出上述静态变量(HashSet)的运行时内存地址。
步骤S203、向所述内存地址写入预定网络协议的协议信息。
在确定出所述静态变量(HashSet)在内存中对应的内存地址后,可进一步根据实际需求向所述内存地址写入预定网络协议的协议信息。
其中,通过对浏览器引擎的源码进行了解,获知,上述的静态变量(HashSet)具体为一如下结构的结构体:
class HashTable{
ValueType*m_table;//8字节,指向table数据区
unsigned m_tableSize;//4字节,获取内存总数capacity
unsigned m_tableSizeMask;//4字节,mask标记用于hash
unsigned m_keyCount;//4字节,指向元素个数size
unsigned m_deletedCount;//4字节,指向删除个数
}
根据C++内存对齐规则(为现有技术,这里不再详述),上述静态变量(HashSet)的实际内存布局即是一个24字节的内存区域,其中m_table是其String指针,指向存储了实际数据的链表,如具体可以指向存储了http、https等协议的协议表,tableSize是表的当前内存占用大小,tableSizeMask是一个掩码用来做哈希映射使用,keyCount表示总元素个数。在找到该HashSet结构后,便可以根据实际需要动态的填充m_table内容以及m_keyCount、m_tableSize、m_tableSizeMask等的值,将其内容填充为所需的http、https等网络协议的相关内容,由此即可达到将Hashset的内存指向改为所需要的http、https等网络协议的目的。
另外,需要说明的是,对于未初始化的C++静态变量,会有一个守护变量(guardvariable)的概念。其中,守护变量用于保证所对应的静态变量如上述的HashSet仅被初始化一次。由此,在填充上述静态变量(HashSet)的结构体内存后,需要同时修改其所对应的守护变量的值,以告知进程该静态变量(HashSet)已经初始化过了,不需要再重新初始化填充内存。
其中,守护变量位于相对应静态变量内存末尾的接下来8字节处,由此,具体可以在上述静态变量(HashSet)内存末尾的接下来8字节处对其守护变量进行设置,示例性地,具体可以设置为1(具体实施中,可以根据实际设计对该数值进行设置,不必限定为1),以此来表明所述静态变量(HashSet)已被初始化。
步骤S204、利用所述浏览器引擎的网络接口将所述预定网络协议的协议信息传递至网络代理层,以实现在所述网络代理层注册所述预定网络协议。
在实现对上述静态变量(HashSet)进行写内存,具体将所需网络协议的协议信息写入所述静态变量(HashSet)所对应的内存地址后,可进一步由所述浏览器引擎的网络接口读取所述静态变量的内存中写入的相应网络协议信息,进而将所读取的网络协议信息如http、https的相关信息等传递至网络代理层,由此,实现所述http、https等网络协议在所述网络代理层的注册,之后,便可在网络代理层处理http、https等网络协议的网络请求。
步骤S205、若浏览器产生网络请求,则将浏览器的网络请求传递至所述网络代理层,以使得利用所述网络代理层对所述网络请求进行过代理。
在将http、https等网络协议注册至所述网络代理层后,一旦浏览器产生了网络请求,便可将所产生的网络请求传递至所述网络代理层,以使得在所述网络代理层对所述网络请求进行过代理,如对网络请求进行拦截或转发等。
本申请实施例提供的浏览器过代理的实现方法,通过将浏览器引擎加载至系统内存,确定浏览器引擎中的预定静态变量在内存中对应的内存地址并向该地址写入预定网络协议的协议信息,以及利用浏览器引擎的网络接口将所写入的协议信息传递至网络代理层,实现了在网络代理层对所述预定网络协议进行注册,在该注册的基础上,后续,若浏览器产生了网络请求,则可利用网络代理层对所述网络请求进行过代理。由此,本申请提供了一种通过写内存方式将所需的网络协议注册至网络代理层、进而在网络代理层对网络请求进行过代理的技术方案,基于本申请方案,无需调用浏览器引擎的任何私有API即可实现浏览器过代理,有效规避了私有API因审核、检测、举报或系统升级后的废弃等问题所导致的过代理缺陷。
浏览器本质是XPC(Cross Process Communication,跨进程通信)通信,在基于上述的静态变量写内存方式实现对浏览器进行过代理时,只能将浏览器的请求url(UniformResource Locator,统一资源定位符)等信息通过XPC传递到客户端应用的网络代理层,而对于浏览器进程端的js数据,如浏览器上传的接口数据(post),表单数据(form),存储在用户本地端的数据(cookie)等则无法被XPC传输至网络代理层NSURLProtocol,从而在进行浏览器过代理时会导致此类数据丢失,针对该问题,本申请提出了进一步的解决方案。
在本申请的一可选实施例中,参阅图7示出的浏览器过代理实现方法的另一流程示意图,该方法还可以包括以下处理步骤,以解决在进行过代理时存在的上述数据丢失的问题:
步骤S206、利用预先注入的钩子抓取浏览器的预定类型数据;
所述预定类型数据,即可以为上述的在对浏览器进行过代理时,浏览器基于XPC无法传递至客户端网络代理层的各类js数据,如具体可以是浏览器上传的接口数据(post),表单数据(form),存储在用户本地端的数据(cookie)中的一种或多种等。
步骤S207、利用所述浏览器引擎的消息处理器将所述预定类型的数据转发至所述网络代理层。
浏览器引擎与客户端应用间的XPC通信协议是透明的,无法尝试通过XPC的方式来把这些丢失数据以某种方式传递过来,为克服该问题,本实施例提出了一种基于hook(钩子)技术的间接转发数据的技术构思,以此实现将这些数据从js侧传递到客户端应用的网络代理层侧。
其中,可预先向js侧(js是浏览器引擎所提供的)注入hook,基于注入的hook来抓取js侧的post、form、cookie等数据,然后,利用浏览器引擎的消息处理器(messageHandler.postMessage)将所抓取的js侧数据传递至网络代理层。
对于上述的三类数据,可分别通过以下过程实现对其进行数据抓取:
1)利用预先注入的hook,通过挂钩所述浏览器引擎的第一类接口,抓取所述浏览器上传的接口数据;
每一个post请求本质都是一个XMLHttpRequest,由此,本实施例利用预先注入的hook,通过挂钩XMLHttpRequest的构造函数,以及挂钩浏览器引擎提供的open、send这些标准js接口(即所述第一类接口),来间接获取到post的数据。如图8所示,之后,可把每次获取的post数据通过浏览器引擎的消息处理器messageHandlder发送给客户端应用的网络代理层NSURLProtocol进行处理。
2)利用预先注入的hook,通过挂钩所述浏览器引擎的第二类接口,抓取所述浏览器上传的表单。
同理,表单form的本质是一个HTMLFormElement,本实施例基于预先注入的hook通过挂钩其submit等标准js接口(即所述第二类接口),来获得表单form每次提交和发送的数据,之后再利用浏览器引擎的消息处理器messageHandler将获取的表单form数据发送给客户端应用的网络代理层NSURLProtocol进行处理。
3)利用预先注入的hook,通过挂钩所述浏览器引擎的第三类接口,抓取所述浏览器的存储在用户本地端的数据。
对于js侧cookie数据,则可以通过挂钩其对应的set、get这些标准的js接口(即所述第三类接口)来实现cookie数据的获取,之后再将获取的cookie数据通过浏览器引擎的消息处理器messageHandler及时同步到客户端应用的网络代理层即可。
参考图9示出的进行过代理时,浏览器网页、客户端应用、网络代理层与操作系统网络层之间的数据流向关系图,客户端应用在收到hook的js数据(post、form、Cookie等)时,将这些数据在网络代理层NSURLProtocol的接口代理侧进行数据的请求封装,具体把数据封装为NSURLRequest并发送给系统的网络层,由此最终实现将这些数据发送至网络端进行处理。
本实施例基于hook技术通过间接转发数据,有效地解决了浏览器过代理时所存在的post、form、Cookie等js侧数据丢失无法传递至网络代理层的问题,确保了这些数据的完整、有效传输。
为了便于理解,以下进一步结合本方案的一种应用场景进行介绍。该应用场景示例性地具体为在iOS平台上实现WKWebView过代理的场景。
参考图10示出的在iOS平台上对WKWebView进行过代理的处理逻辑示意图,具体可通过以下处理过程实现对iOS应用的WKWebView过代理:
步骤S1001、在iOS应用启动时,将WebKit的可执行文件Mach-O加载至内存;
步骤S1002、在iOS应用的启动初始化阶段,确定Mach-O的静态变量HashSet在内存中所对应的内存地址并执行写内存,向其中写入http、https相关信息;
需要说明的是,在应用的启动初始化阶段,对静态变量HashSet在内存中所对应的内存地址进行写内存,仅为本申请的一优选实施例,但不形成对本申请的限制,实际实施中,还可以在其他环节(而非应用的启动初始化阶段)执行该处理,但应至少保证在使用WebKit之前完成该静态变量HashSet的写内存。
步骤S1003、由WebKit的网络接口读取对该静态变量HashSet写内存时写入的http、https相关信息;
步骤S1004、将从内存读取的http、https相关信息注册至网络代理层NSURLProtocol;
步骤S1005、当WebKit有http、https请求时,将http、https请求传递至代理层NSURLProtocol;
步骤S1006、在网络代理层NSURLProtocol对http、https请求进行过代理;
步骤S1007、基于注入的hook抓取WKWebView的post、form、cookie这些js侧数据;
步骤S1008、利用WebKit的消息处理器messageHandler.postMessage将抓取的js侧数据转发给网络代理层NSURLProtocol;
步骤S1009、在网络代理层对hook的js数据进行过代理。
本申请实施例的浏览器过代理的实现方法,相比于现有技术至少存在以下优势:提出了一种通过运行时修改加载后的浏览器引擎的静态变量内存的方式,来达到不使用任何私有API就能够进行浏览器过代理的目的,从而,无需调用浏览器引擎的任何私有API就可以实现浏览器过代理,有效规避了私有API因审核、检测、举报或系统升级时的废弃等问题而导致的各种浏览器过代理缺陷;另外,还通过js hook的方式将丢失的js层数据转发给了客户端网络代理层进行处理,解决了post、form、cookie等js侧数据丢失的问题,从而最终提供了一整套浏览器非私有API完美过代理的能力。
另一方面,本申请还提供了一种浏览器过代理的实现装置。
参阅图11,其示出了本申请浏览器过代理的实现装置的一种结构示意图,该装置具体可应用于终端设备中,其中,本申请装置所适用的该终端设备的组成结构可以参见前文的相关介绍,这里不再赘述。
如图11所示,本实施例的浏览器过代理的实现装置可以包括:
加载单元1101,用于将浏览器引擎加载至系统内存;
确定单元1102,用于确定所述浏览器引擎中的预定静态变量在内存中对应的内存地址;
写内存单元1103,用于向所述内存地址写入预定网络协议的协议信息;
注册单元1104,用于利用所述浏览器引擎的网络接口将内存中的所述协议信息传递至网络代理层,以实现在所述网络代理层注册所述预定网络协议;
过代理单元1105,用于若浏览器产生网络请求,则将浏览器的网络请求传递至所述网络代理层,以使得利用所述网络代理层对所述网络请求进行过代理。
在一种可能的实现方式中,所述加载单元1101,具体用于将所述浏览器引擎的可执行文件加载至系统内存;
所述确定单元1102,具体用于:
确定所述预定静态变量对应的内存地址相比于该预定静态变量所属的数据块的起始内存位置的第一偏移;确定所述数据块的起始内存地址相比于所述浏览器引擎的可执行文件的起始内存地址的第二偏移;确定所述浏览器引擎的可执行文件在加载至内存时所对应的随机偏移;利用所述第一偏移、所述第二偏移及所述随机偏移,计算所述预定静态变量在内存中对应的内存地址。
在一种可能的实现方式中,所述预定静态变量为一个结构体,则所述写内存单元1103,具体用于:在应用的启动初始化阶段,向所述预定静态变量的结构体对应的内存地址写入超文本传输协议http和/或超文本传输安全协议https的协议信息。
在一种可能的实现方式中,所述写内存单元1103,还用于:在所述预定静态变量的守护变量在内存中对应的内存地址处修改所述守护变量的值,以用于基于修改后的值表明所述预定静态变量已被初始化。
在一种可能的实现方式中,参考图12示出的浏览器过代理的实现装置的另一结构示意图,该装置还可以包括:数据抓取及转发单元1106,用于利用预先注入的钩子抓取浏览器的预定类型数据,以及利用所述浏览器引擎的消息处理器将所述预定类型的数据转发至所述网络代理层;其中,所述预定类型数据为所述网络请求中无法传递至所述网络代理层的数据。
在一种可能的实现方式中,所述数据抓取及转发单元1106利用预先注入的钩子抓取浏览器的预定类型数据,具体包括:利用预先注入的钩子,通过挂钩所述浏览器引擎的第一类接口,抓取所述浏览器上传的接口数据;利用预先注入的钩子,通过挂钩所述浏览器引擎的第二类接口,抓取所述浏览器上传的表单数据;利用预先注入的钩子,通过挂钩所述浏览器引擎的第三类接口,抓取所述浏览器的存储在用户本地端的数据。
另一方面,本申请还提供了一种存储介质,该存储介质中存储有计算机程序,所述计算机程序被处理器加载并执行时,实现如上任意一个实施例中所描述的浏览器过代理的实现方法。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
为了描述的方便,描述以上系统或装置时以功能分为各种模块或单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
最后,还需要说明的是,在本文中,诸如第一、第二、第三和第四等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。

Claims (10)

1.一种浏览器过代理的实现方法,其特征在于,包括:
将浏览器引擎加载至系统内存;
确定所述浏览器引擎中的预定静态变量在内存中对应的内存地址;
向所述内存地址写入预定网络协议的协议信息;
利用所述浏览器引擎的网络接口将内存中的所述协议信息传递至网络代理层,以实现在所述网络代理层注册所述预定网络协议;
若浏览器产生网络请求,则将浏览器的网络请求传递至所述网络代理层,以使得利用所述网络代理层对所述网络请求进行过代理。
2.根据权利要求1所述的方法,其特征在于,所述将浏览器引擎加载至系统内存,包括:
将所述浏览器引擎的可执行文件加载至系统内存;
所述确定所述浏览器引擎中的预定静态变量在内存中对应的内存地址,包括:
确定所述预定静态变量对应的内存地址相比于该预定静态变量所属的数据块的起始内存地址的第一偏移;
确定所述数据块的起始内存地址相比于所述浏览器引擎的可执行文件的起始内存地址的第二偏移;
确定所述浏览器引擎的可执行文件在加载至内存时所对应的随机偏移;
利用所述第一偏移、所述第二偏移及所述随机偏移,计算所述预定静态变量在内存中对应的内存地址。
3.根据权利要求1所述的方法,其特征在于,所述预定静态变量为一个结构体,所述向所述内存地址写入预定网络协议的协议信息,包括:
在应用的启动初始化阶段,向所述预定静态变量的结构体对应的内存地址写入超文本传输协议http和/或超文本传输安全协议https的协议信息。
4.根据权利要求3所述的方法,其特征在于,在向所述内存地址写入预定网络协议的协议信息时,该方法还包括:
在所述预定静态变量的守护变量在内存中对应的内存地址处修改所述守护变量的值,以用于基于修改后的值表明所述预定静态变量已被初始化。
5.根据权利要求1所述的方法,其特征在于,在将浏览器的网络请求传递至所述网络代理层的情况下,所述方法还包括:
利用预先注入的钩子抓取浏览器的预定类型数据;其中,所述预定类型数据为所述网络请求中无法传递至所述网络代理层的数据;
利用所述浏览器引擎的消息处理器将所述预定类型的数据转发至所述网络代理层。
6.根据权利要求5所述的方法,其特征在于,所述利用预先注入的钩子抓取浏览器的预定类型数据,包括:
利用预先注入的钩子,通过挂钩所述浏览器引擎的第一类接口,抓取所述浏览器上传的接口数据;
利用预先注入的钩子,通过挂钩所述浏览器引擎的第二类接口,抓取所述浏览器上传的表单数据;
利用预先注入的钩子,通过挂钩所述浏览器引擎的第三类接口,抓取所述浏览器的存储在用户本地端的数据。
7.一种浏览器过代理的实现装置,其特征在于,包括:
加载单元,用于将浏览器引擎加载至系统内存;
确定单元,用于确定所述浏览器引擎中的预定静态变量在内存中对应的内存地址;
写内存单元,用于向所述内存地址写入预定网络协议的协议信息;
注册单元,用于利用所述浏览器引擎的网络接口将内存中的所述协议信息传递至网络代理层,以实现在所述网络代理层注册所述预定网络协议;
过代理单元,用于若浏览器产生网络请求,则将浏览器的网络请求传递至所述网络代理层,以使得利用所述网络代理层对所述网络请求进行过代理。
8.根据权利要求7所述的装置,其特征在于,所述加载单元,具体用于将所述浏览器引擎的可执行文件加载至系统内存;
所述确定单元,具体用于:
确定所述预定静态变量对应的内存地址相比于该预定静态变量所属的数据块的起始内存位置的第一偏移;确定所述数据块的起始内存地址相比于所述浏览器引擎的可执行文件的起始内存地址的第二偏移;确定所述浏览器引擎的可执行文件在加载至内存时所对应的随机偏移;利用所述第一偏移、所述第二偏移及所述随机偏移,计算所述预定静态变量在内存中对应的内存地址。
9.根据权利要求7所述的装置,其特征在于,还包括:
数据抓取及转发单元,用于利用预先注入的钩子抓取浏览器的预定类型数据;并利用所述浏览器引擎的消息处理器将所述预定类型的数据转发至所述网络代理层;
其中,所述预定类型数据为所述网络请求中无法传递至所述网络代理层的数据。
10.一种终端设备,其特征在于,包括:
存储器,用于存储程序;
处理器,用于执行所述程序,所述程序至少用于:
将浏览器引擎加载至系统内存;
确定所述浏览器引擎中的预定静态变量在内存中对应的内存地址;
向所述内存地址写入预定网络协议的协议信息;
利用所述浏览器引擎的网络接口将内存中的所述协议信息传递至网络代理层,以实现在所述网络代理层注册所述预定网络协议;
若浏览器产生网络请求,则将浏览器的网络请求传递至所述网络代理层,以使得利用所述网络代理层对所述网络请求进行过代理。
CN201910554962.4A 2019-06-25 2019-06-25 一种浏览器过代理的实现方法、装置及终端设备 Active CN110290204B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910554962.4A CN110290204B (zh) 2019-06-25 2019-06-25 一种浏览器过代理的实现方法、装置及终端设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910554962.4A CN110290204B (zh) 2019-06-25 2019-06-25 一种浏览器过代理的实现方法、装置及终端设备

Publications (2)

Publication Number Publication Date
CN110290204A CN110290204A (zh) 2019-09-27
CN110290204B true CN110290204B (zh) 2022-05-17

Family

ID=68005563

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910554962.4A Active CN110290204B (zh) 2019-06-25 2019-06-25 一种浏览器过代理的实现方法、装置及终端设备

Country Status (1)

Country Link
CN (1) CN110290204B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111475314B (zh) * 2020-04-03 2024-02-27 深信服科技股份有限公司 一种网络请求的处理方法、装置、设备及存储介质
CN114520995A (zh) * 2022-01-11 2022-05-20 宝宝巴士股份有限公司 一种无侵入监听应用网络流量使用的实现方法

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100153836A1 (en) * 2008-12-16 2010-06-17 Rich Media Club, Llc Content rendering control system and method
CN104038510B (zh) * 2013-03-04 2018-11-09 腾讯科技(深圳)有限公司 iOS系统透明代理的实现方法及系统
CN103607454B (zh) * 2013-11-20 2017-03-08 Tcl通讯(宁波)有限公司 Android系统浏览器设置私有代理服务器的方法
EP3149548B1 (en) * 2014-05-30 2021-06-23 Apple Inc. Controller networks for an accessory management system
CN106294403A (zh) * 2015-05-21 2017-01-04 阿里巴巴集团控股有限公司 跨网络操作数据库的方法、系统、客户端和服务器
CN106941500B (zh) * 2017-04-25 2020-02-14 西安诺瓦星云科技股份有限公司 基于浏览器的多设备控制方法及系统
CN108809763B (zh) * 2018-06-14 2022-03-25 武汉斗鱼网络科技有限公司 一种网络性能参数采集方法、终端装置及存储介质
CN109726122A (zh) * 2018-12-13 2019-05-07 平安普惠企业管理有限公司 私有api检测方法、装置、计算机设备及存储介质

Also Published As

Publication number Publication date
CN110290204A (zh) 2019-09-27

Similar Documents

Publication Publication Date Title
EP2948846B1 (en) Resource calling for hybrid applications
CN107203555B (zh) 页面加载处理方法及装置
US20140149995A1 (en) Browser Kernel Switching Method
US20140208326A1 (en) File presenting method and apparatus for a smart terminal
CN111666497B (zh) 应用程序的加载方法、装置、电子设备及可读存储介质
WO2014139300A1 (en) Method and device for loading a plug-in
CN110780930B (zh) 启动Android系统的方法、装置、电子设备及存储介质
CN105138376A (zh) 混合模式应用、其网页资源升级方法、移动终端以及系统
CN111427596B (zh) 一种软件升级的方法、装置及终端设备
CN110290204B (zh) 一种浏览器过代理的实现方法、装置及终端设备
KR20140031831A (ko) 오버라이딩 가상 함수 호출에 대한 지원을 포함하는 isa 브릿징
CN110365724B (zh) 任务处理方法、装置及电子设备
CN111177026A (zh) 一种修改变量内存布局的方法、装置及计算机设备
CN112667246B (zh) 应用功能扩展的方法、装置及电子设备
CN112988284A (zh) 应用程序启动方法、装置、计算机设备和存储介质
KR20140101412A (ko) 콜백을 이용하는 isa 브리징
CN109800370A (zh) 网页页面的显示方法、装置、计算机设备及存储介质
CN111880952A (zh) 应用程序跳转方法、装置、电子设备和存储介质
JP5643449B1 (ja) 端末装置に表示画面を表示させるサーバ及び方法
CN112115056A (zh) 一种项目部署方法和装置、服务器、存储介质
US20110271249A1 (en) Remotable project
CN107092601B (zh) 资源文件构建方法、资源文件应用方法及装置
CN114637946A (zh) 资源数据的处理方法、装置及电子设备
US11379653B2 (en) Rendering method for on-demand loading of PDF file on network
CN114356446A (zh) 一种进程间事件的处理方法、装置、设备以及存储介质

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