CN104951375B - 基于函数拦截技术的手机app性能数据采集方法 - Google Patents
基于函数拦截技术的手机app性能数据采集方法 Download PDFInfo
- Publication number
- CN104951375B CN104951375B CN201510373885.4A CN201510373885A CN104951375B CN 104951375 B CN104951375 B CN 104951375B CN 201510373885 A CN201510373885 A CN 201510373885A CN 104951375 B CN104951375 B CN 104951375B
- Authority
- CN
- China
- Prior art keywords
- function
- network
- app
- alternative functions
- intercepted
- 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
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于函数拦截技术的手机APP性能数据采集方法,采集方法的具体实施分为三个步骤:在目标APP启动之前,利用ptrace调用,向zyogte进程中注入自己的动态库S,Inline Hook完成之后;启动app进程,发生网络交互时,应用程序会调用被拦截的网络函数;在替代函数结果处理部分,通过Android或者Linux提供的进程间通信手段,UNIX域套接字,或本地套接字,将数据发送给数据收集进程;这样就完成了对目标APP的网络数据采集。本发明如果需要拦截网络调用,只需要对LibC动态库进行处理。本发明提供的方法修改了目标函数的机器码指令,拦截率是100%。
Description
技术领域
本发明涉及一种手机APP性能数据采集方法,尤其涉及一种基于函数拦截技术的手机APP性能数据采集方法。
背景技术
随着移动互联网的蓬勃发展,各种各样的手机应用客户端(以下简称APP)出现在我们的手机中。目前应用市场中绝大部分的APP都需要有网络交互,网络交互的性能直接影响着APP的用户体验。因此了解全国甚至全球各个地区使用APP的网络性能数据,才能找到提高APP用户体验的方法,这是很多移动互联网公司关心的问题。
现有的网络性能数据获取方法有两种:
第一种是通过网卡抓包的方式来获得的,具体在智能手机上是用TCPDUMP(一种在Windows、Linux、Android上通用的抓包工具)来获得的。其原理,是通过注册虚拟底层网络协议,来获得对网络数据报文的处理权,从而捕获经过智能手机的Wi-Fi模块、2/3/4G数据模块的网络数据报文。利用TCPDUMP获取一款APP的网络性能数据的使用流程是:首先开启TCPDUMP,接着再启动APP,然后退出APP,最后停止TCPDUMP得到网络性能数据。
第二种是ADDRESS HOOK,针对APP进程,注入自己的动态库,并且替换APP进程中动态库外部依赖表中的函数地址来实现对网络函数调用的拦截。其原理是无论是java网络库还是定制JNI动态库来实现网络功能,最终都会经过中间一层的动态库来调用LibC中的真正网络函数。中间层动态库有一个外部依赖表,在中间层动态库被加载到内存的过程中,其外部依赖表会被填充LibC网络函数所在的地址。而前述网络调用过程都会查询这个外部依赖表来访问真正的网络函数。
举java网络库的调用过程来说明,见图1。java网络库会执行相应的类的native函数,转而执行到JNI动态库函数,JNI动态库函数在调用LibC相应的网络函数之前,会查找动态库中的外部项依赖表找到目标函数真实地址,最终函数执行完毕,会一级一级向上栈式返回,最终完成java网络库调用。
使用TCPDUMP抓包获取网络性能数据的缺点有:
1、TCPDUMP本身运行在各种型号的手机上的稳定性很差,经常遇到不能正常停止以及抓到不完整的pcap包的情况。
2、TCPDUMP捕获的是整个系统上的网络通信数据,不能识别出数据是来自哪个进程的。这会导致进行网络数据分析时会夹带非目标程序的DNS、TCP、UDP数据,这会导致基于数据做出的分析出现错误。
3、TCPDUMP的数据获取只能观察数据而不能修改数据。不能实现功能扩展。
ADDRESS HOOK的缺点:
1、替换所有进程加载的动态库函数表。这个导致初始化时间较长。
2、ADDRESS HOOK查找外部依赖项是根据函数名字来匹配的,如果自定义的动态库导出表中,存在与LibC中一样函数名的函数,并且该函数被其他动态库引用,那么HOOK之后可能导致程序执行出现崩溃。
3、动态链接的方式加载动态库来使用的函数,需要拦截dlsym函数。
4、Android中,对于使用函数指针来调用LibC网络库的调用方式,ADDRESS HOOK不能拦截。会导致性能数据不完全。
5这种方式容易被封堵,容易被安全性较高的代码绕过,从而达不到挂钩的效果。
发明内容
为了解决上述技术所存在的不足之处,本发明提供了一种基于函数拦截技术的手机APP性能数据采集方法。其特征在于:
所述采集方法的具体实施步骤为:
步骤一:
在目标APP启动之前,利用ptrace调用,向zyogte进程中注入自己的动态库S,并利用ADDRESS HOOK拦截fork方法,在fork替代函数中完成对LibC中的getaddrinfo,gethostbyname,connect,send,sendto,write,sendmsg,recv,recvfrom,read,recvmsg,close等网络函数和select,poll,epoll_wait等套接字事件监控函数的Inline Hook的初始化过程;这样,由于APP进程是由zygote复制(copy)出来的,当APP进程启动时,就已经完成了对APP进程的Inline Hook;
步骤二:
Inline Hook完成之后,启动app进程,发生网络交互时,应用程序会调用被拦截的网络函数,程序的执行过程是:
首先执行被拦截函数入口的跳转指令,跳转至替代函数,替代函数预处理中会完成一个必要的函数参数再次入栈的过程,然后跳转到克隆指令区,完成被拦截函数被覆盖的前几条指令的执行,再次跳转回被拦截函数入口地址加8或者加10的地址继续执行;由于替代函数完成了参数再次入栈,此时被拦截函数会返回至替代函数继续处理函数执行结果;替代函数执行完毕,会返回到发起函数调用的地方;替代函数预处理部分可以修改函数参数,从而达到扩展程序功能的效果;替代函数结果处理部分可以截获网络信息,获取程序执行状态;
所有被拦截的步骤一中提到的网络函数的执行都是同样的过程;
步骤三:
在替代函数结果处理部分,通过Android或者Linux提供的进程间通信手段,UNIX域套接字,或本地套接字,将数据发送给数据收集进程;这样就完成了对目标APP的网络数据采集。
本发明的优点为:
1、如果需要拦截网络调用,不需要替换所有进程加载的动态库函数表,只需要对LibC动态库进行处理。
2、不存在因其他动态库有相同名字的函数而导致程序运行出错的风险。本发明中提供的方法只对目标动态库中的目标函数进行Inline Hook。
3、用函数指针等手段也不能绕过本发明的拦截方法。安全手段都是为了保证程序功能的正确执行,而目标函数是程序功能正确性的必经之路,本发明修改了目标函数的机器码指令,所以拦截率是100%。
附图说明
下面结合附图和具体实施方式对本发明作进一步详细的说明。
图1为本发明Java网络库、JNI动态库与LibC的关系框图。
图2为本Inline Hook原理图。
图3为Inline Hook执行详解框图。
具体实施方式
本发明的具体实施步骤如下:
步骤一:
在目标APP启动之前,利用ptrace调用,向zyogte进程中注入自己的动态库S,并利用ADDRESS HOOK拦截fork方法,在fork替代函数中完成对LibC中的相关网络函数(getaddrinfo,gethostbyname,connect,send,sendto,write,sendmsg,recv,recvfrom,read,recvmsg,close)和套接字事件监控函数(select,poll,epoll_wait)做Inline Hook的初始化过程;这样,由于APP进程是由zygote复制(copy)出来的,当APP进程启动时,就已经完成了对APP进程的Inline Hook;
这种手段之所以能截获进程网络数据,其原理如下:
安卓下APP程序的网络调用方法分为两种:一是通过调用java的网络库实现,例如java.net.Socket和java.net.HttpURLConnection等;二是通过编写JNI动态库直接调用Android底层Linux提供的网络库LibC,如getaddrinfo和socket相关函数。这两种方式的共同点就是最终都会调用LibC提供的网络函数来实现,见图1。
库调用函数说明:
无论是java网络库还是自定义的JNI库,最终都会调用到LibC中真实函数。
注入动态库S的具体过程为:
本方案使用的是一种Inline Hook的方式来达到拦截网络调用的目的。首先需要向目标进程注入一个动态库(代号为S),动态库中包含了下文中提到的替代函数以及Inline Hook入口函数。这个注入过程需要在root权限下使用ptrace调用来完成。
第一步是挂起目标进程(zygote),使得目标进程暂停执行。
第二步是保存目标进程的CPU现场,包括所有的寄存器的值。
第三步,是修改寄存器的值使得进程在恢复时可以加载动态库S。
第四步,找出动态库S的Inline Hook入口函数地址。
第五步,调用入口函数,开始真正的Inline Hook工作,其程序流程如下(见图2):
首先获得真实的目标函数入口地址,接着进入智能拷贝子流程。智能拷贝是将函数入口处被覆盖指令复制到指定的内存区域,其目的是确保复制指令的完整性,以及在指令的存储地址发生变化后仍然可以正确执行。
分析目标函数入口处的ARM/THUMB指令。ARM指令均为4字节,THUMB指令分为4字节和2字节,由于入口指令修改需要占用8字节,所以实际拷贝的指令字节数和条数会根据入口指令的不同而变化。
如果复制的指令是相对寻址指令,需要处理的是相对PC寻址的指令,如LDR,BL,BLX,ADR等。智能复制相对寻址指令,首先要拷贝相对PC寻址对应的真实内存单元数据到指定的内存单元(命名为U),再生成一条与原指令功能一致的指令I,指令I实际的相对寻址偏移量与原指令不同,需要改为指向内存单元U。
如果复制的指令没有相对寻址的功能,则把指令直接拷贝到目标区域。智能拷贝的指令生成之后,需要在后面加上一条跳转指令跳回真实函数继续执行。这个跳转地址等于函数入口地址加上实际拷贝的指令字节数。
表1.动态拷贝指令数和字节关系
入口指令的修改是将函数入口开始的8个字节的内存单元,修改为一条跳转指令(ldr PC,[PC+4])和一个跳转地址。跳转指令为相对跳转指令,跳转地址为替代函数的入口地址。
第六步,恢复目标进程第二步中保存的寄存器现场。
第七步,恢复目标进程的执行状态。
步骤二:
Inline Hook完成之后,启动app进程,发生网络交互时,应用程序会调用被拦截的网络函数,程序的执行过程是(见图3):
首先执行被拦截函数入口的跳转指令,跳转至替代函数,替代函数预处理中会完成一个必要的函数参数再次入栈的过程,然后跳转到克隆指令区,完成被拦截函数被覆盖的前几条指令的执行,再次跳转回被拦截函数入口地址加8(或加10)的地址继续执行。由于替代函数完成了参数再次入栈,此时被拦截函数会返回至替代函数继续处理函数执行结果。替代函数执行完毕,会返回到发起函数调用的地方。
替代函数预处理部分可以修改函数参数,从而达到扩展程序功能的效果。替代函数结果处理部分可以截获网络信息,获取程序执行状态等功能。所有被拦截的网络函数(步骤一中提到的)的执行都是同样的过程。
步骤三:
在替代函数结果处理部分,通过Android或者Linux提供的进程间通信手段,UNIX域套接字,或本地套接字,将数据发送给数据收集进程。这样就完成了对目标APP的网络数据采集。
上述方法步骤适用于:Android系统。
术语解释
APP:(Application)智能手机应用客户端。
TCP/IP协议:(Transmission Control Protocol/Internet Protocol)传输控制协议/因特网协议。
TCPDUMP:种开源的网络抓包工具
pcap包:种常见的网络数据包文件的格式。
DNS:Domain Name System直译为域名系统,因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。在RFC文档中RFC 2181对DNS有规范说明,RFC 2136对DNS的动态更新进行说明,RFC 2308对DNS查询的反向缓存进行说明。
HTTP:HyperText Transfer Protocol,超文本传输协议,是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
Address Hook:译为地址钩子,是通过替换函数的地址达到拦截函数调用的HOOK方式。
LibC:Linux下的ANSI C的函数库。ANSI C是基本的C语言函数库,包含了最基本的库函数。
Inline Hook:译为内联钩子,是通过修改函数内部指令,用一个跳转或者其他指令来达到挂钩的目的。
THUMB:ARM体系结构中一种16位的指令集。THUMB指令集可以看作是ARM指令压缩形式的子集,它是为减小代码量而提出,具有16bit的代码密度
zygote:直译为受精卵,是Android中所有APP进程的父进程。
PC:program counter,程序计数器,用来指示指令在存储器的地址信息。
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C和C++)。
上述实施方式并非是对本发明的限制,本发明也并不仅限于上述举例,本技术领域的技术人员在本发明的技术方案范围内所做出的变化、改型、添加或替换,也均属于本发明的保护范围。
Claims (1)
1.一种基于函数拦截技术的手机APP性能数据采集方法,其特征在于:
所述采集方法的具体实施步骤为:
步骤一:
在目标APP启动之前,利用ptrace调用,向zyogte进程中注入自己的动态库S,并利用ADDRESS HOOK拦截fork方法,在fork替代函数中完成对LibC中的相关网络函数getaddrinfo,gethostbyname,connect,send,sendto,write,sendmsg,recv,recvfrom,read,recvmsg,close和套接字事件监控函数select,poll,epoll_wait做Inline Hook的初始化过程;这样,由于APP进程是由zygote复制出来的,当APP进程启动时,就已经完成了对APP进程的Inline Hook;
步骤二:
Inline Hook完成之后,启动app进程,发生网络交互时,应用程序会调用被拦截的网络函数,程序的执行过程是:
首先执行被拦截函数入口的跳转指令,跳转至替代函数,替代函数预处理中会完成一个必要的函数参数再次入栈的过程,然后跳转到克隆指令区,完成被拦截函数被覆盖的前几条指令的执行,再次跳转回被拦截函数入口地址加8或者加10的地址继续执行;由于替代函数完成了参数再次入栈,此时被拦截函数会返回至替代函数继续处理函数执行结果;替代函数执行完毕,会返回到发起函数调用的地方;替代函数预处理部分可以修改函数参数,从而达到扩展程序功能的效果;替代函数结果处理部分可以截获网络信息,获取程序执行状态;
所有被拦截的步骤一中提到的网络函数的执行都是同样的过程;
步骤三:
在替代函数结果处理部分,通过Android或者Linux提供的进程间通信手段,UNIX域套接字,或本地套接字,将数据发送给数据收集进程;这样就完成了对目标APP的网络数据采集。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510373885.4A CN104951375B (zh) | 2015-07-01 | 2015-07-01 | 基于函数拦截技术的手机app性能数据采集方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510373885.4A CN104951375B (zh) | 2015-07-01 | 2015-07-01 | 基于函数拦截技术的手机app性能数据采集方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104951375A CN104951375A (zh) | 2015-09-30 |
CN104951375B true CN104951375B (zh) | 2017-12-08 |
Family
ID=54166043
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510373885.4A Active CN104951375B (zh) | 2015-07-01 | 2015-07-01 | 基于函数拦截技术的手机app性能数据采集方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104951375B (zh) |
Families Citing this family (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105426310B (zh) * | 2015-11-27 | 2018-06-26 | 北京奇虎科技有限公司 | 一种检测目标进程的性能的方法和装置 |
CN105630491A (zh) * | 2015-12-18 | 2016-06-01 | Tcl集团股份有限公司 | 程序的功能变更方法及装置 |
CN106059851A (zh) * | 2016-05-20 | 2016-10-26 | 天津海量信息技术股份有限公司 | 基于移动端和服务端协同工作的App数据采集方法 |
WO2017219293A1 (zh) | 2016-06-22 | 2017-12-28 | 华为技术有限公司 | 一种获取网页内容的方法及装置 |
CN106294166B (zh) * | 2016-08-16 | 2018-07-06 | 腾讯科技(深圳)有限公司 | 一种游戏数据监控方法和装置 |
CN109144834B (zh) * | 2017-06-27 | 2021-11-23 | 深圳市Tcl高新技术开发有限公司 | 用户行为数据的采集方法及装置、安卓系统及终端设备 |
CN107635011B (zh) * | 2017-10-17 | 2021-01-15 | 四川智魔王智能科技股份有限公司 | 一种Android平台实现应用内网络透明代理的系统及方法 |
CN108038378A (zh) * | 2017-12-28 | 2018-05-15 | 厦门服云信息科技有限公司 | 云端检测函数被恶意修改的方法、终端设备及存储介质 |
CN108536484A (zh) * | 2018-03-26 | 2018-09-14 | 平安普惠企业管理有限公司 | 参数修改方法、装置、终端设备及存储介质 |
CN108830590A (zh) * | 2018-05-28 | 2018-11-16 | 银盒达信息技术(深圳)有限公司 | 一种信息的获取方法、信息的获取装置及终端设备 |
CN108965105B (zh) * | 2018-06-11 | 2021-02-26 | 山东华软金盾软件股份有限公司 | 一种审计tim聊天内容的方法 |
CN109446086A (zh) * | 2018-10-29 | 2019-03-08 | 北京酷我科技有限公司 | 一种App内部抓包的方法 |
CN109783161B (zh) * | 2018-12-11 | 2020-08-04 | 北京三快在线科技有限公司 | iOS系统中应用程序的运行信息确定方法、装置 |
CN111132138B (zh) * | 2019-12-06 | 2023-04-18 | 中国电子科技集团公司电子科学研究院 | 一种移动应用程序透明通信保护方法与装置 |
CN113157593B (zh) * | 2021-05-24 | 2024-05-10 | 网易(杭州)网络有限公司 | 性能数据采集方法及装置、系统、电子设备、存储介质 |
CN113535593B (zh) * | 2021-09-15 | 2022-10-11 | 广州锦行网络科技有限公司 | 应用程序的抓包方法、装置、电子设备和存储介质 |
US11792289B2 (en) | 2021-11-22 | 2023-10-17 | International Business Machines Corporation | Live socket redirection |
CN115002180B (zh) * | 2022-05-26 | 2024-05-14 | 上海商米科技集团股份有限公司 | 一种网络请求运行监测方法、装置和计算机可读介质 |
CN115017058B (zh) * | 2022-08-04 | 2022-11-29 | 飞腾信息技术有限公司 | 一种内核模块的测试方法、装置、电子设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2004214833A (ja) * | 2002-12-27 | 2004-07-29 | Sato Corp | 携帯電話機および携帯電話機を用いたブルートゥース通信診断方法 |
CN1991745A (zh) * | 2005-12-27 | 2007-07-04 | 英业达股份有限公司 | 在64位系统中利用32位主程序拦截64位信息的方法 |
JP2012035667A (ja) * | 2010-08-04 | 2012-02-23 | Kyosan Electric Mfg Co Ltd | 踏切しゃ断機のしゃ断かん折損検知装置 |
CN104392169A (zh) * | 2014-12-15 | 2015-03-04 | 福建天晴数码有限公司 | 一种Native API函数重构方法和装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130093779A1 (en) * | 2011-10-14 | 2013-04-18 | Bally Gaming, Inc. | Graphics processing unit memory usage reduction |
-
2015
- 2015-07-01 CN CN201510373885.4A patent/CN104951375B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2004214833A (ja) * | 2002-12-27 | 2004-07-29 | Sato Corp | 携帯電話機および携帯電話機を用いたブルートゥース通信診断方法 |
CN1991745A (zh) * | 2005-12-27 | 2007-07-04 | 英业达股份有限公司 | 在64位系统中利用32位主程序拦截64位信息的方法 |
JP2012035667A (ja) * | 2010-08-04 | 2012-02-23 | Kyosan Electric Mfg Co Ltd | 踏切しゃ断機のしゃ断かん折損検知装置 |
CN104392169A (zh) * | 2014-12-15 | 2015-03-04 | 福建天晴数码有限公司 | 一种Native API函数重构方法和装置 |
Non-Patent Citations (1)
Title |
---|
《基于网格的空间信息服务关键技术研究》;张建兵;《中国优秀博硕士学位论文全文数据库 (博士) 基础科学辑》;20061215(第12期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN104951375A (zh) | 2015-09-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104951375B (zh) | 基于函数拦截技术的手机app性能数据采集方法 | |
CN109766262B (zh) | 接口数据处理方法、自动化测试方法、装置、设备和介质 | |
CN110381135B (zh) | 接口创建方法、服务请求方法、装置、计算机设备和介质 | |
CN104182234B (zh) | 一种业务处理方法和业务系统 | |
Dinh et al. | Favocado: Fuzzing the Binding Code of JavaScript Engines Using Semantically Correct Test Cases. | |
CN108304498A (zh) | 网页数据采集方法、装置、计算机设备和存储介质 | |
US9778942B2 (en) | Generating a replacement binary for emulation of an application | |
CN107133174A (zh) | 测试用例代码自动生成装置与方法 | |
CN110427331A (zh) | 基于接口测试工具自动生成性能测试脚本的方法 | |
CN107861713A (zh) | 数据调用方法、装置及计算机可读存储介质 | |
CN106201893B (zh) | 一种Java字节码调试器及调试方法 | |
CN103023906A (zh) | 针对远程过程调用协议进行状态跟踪的方法及系统 | |
CN108446149A (zh) | 一种第三方动态库接口拦截方法及系统 | |
CN109783742A (zh) | 用于开发辅助的页面跳转方法、装置和计算机设备 | |
CN111930472A (zh) | 一种代码调试方法、装置、电子设备及存储介质 | |
CN108182119B (zh) | 读写分离控制方法和装置、存储介质及电子装置 | |
Jeong et al. | Offloading of web application computations: A snapshot-based approach | |
Zhao et al. | A research for high interactive honepot based on industrial service | |
CN109343983A (zh) | 功能模块间的信息交互方法、装置、设备及存储介质 | |
WO2020238092A1 (zh) | 链接加壳跳转方法、装置、电子设备和存储介质 | |
CN115543479A (zh) | 一种适用于动态参数的接口调用解析方法及装置 | |
CN109559121A (zh) | 交易路径调用异常分析方法、装置、设备及可读存储介质 | |
CN109388388A (zh) | 功能模块间的信息交互方法、装置、设备及存储介质 | |
Newmarch | Network Programming with Go: Essential Skills for Using and Securing Networks | |
CN103927341B (zh) | 一种获取场景信息的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information |
Address after: 100020 Beijing City, Chaoyang District Hing Building 6, room 702, block B Applicant after: Beijing Bo Hongyuan data Polytron Technologies Inc Address before: 100020 Beijing City, Chaoyang District Hing Building 6, room 702, block B Applicant before: BEIJING BONREE HONGYUAN TECHNOLOGY DEVELOPMENT CO., LTD. |
|
COR | Change of bibliographic data | ||
GR01 | Patent grant | ||
GR01 | Patent grant |