代码插桩检测方法、设备、设备及介质的制作方法
桩检测方法
桩检测方法桩是建筑物、桥梁、水利水电及其他重要工程的承载部分,因其处于地下或水下深层地带,一旦出现问题常常会给工程造成严重的损失甚至事故。
对于桩的检测与评估是非常重要的。
本文将介绍桩的几种检测方法及其原理。
第一种方法是静载试验,这种方法的原理是在桩顶加载,然后根据加载变化的情况来推算桩的负荷承受能力。
它通常被称为内部检测。
根据加载的方式,静载试验可以分为静力加载试验和振动加载试验。
前者在移动测力仪器的同时加入载荷,后者在输送高频振动力的过程中进行实验。
静载试验的优点是比较准确,常作为评价桩的基本性能的方法之一,但试验比较复杂,花费较高,需考虑现场环境的限制。
第二种方法是动态弹性模量试验,它是在给定的固定轴向荷载作用下使用重锤或破碎锤落击振动峰值,根据测试数据计算桩的动力特性,如桩体动态弹性模量、阻尼系数和剪切波速等。
与静载试验相比,动态试验成本较低,试验周期较短,适用于对多个桩进行快速评估,但是由于它与静力试验相比误差较大,不建议将其作为独立的桩的稳定性评价方法。
第三种方法是声波检测,它是通过声波对桩体进行探伤,根据探测过程中产生的声波反射信号以及信号的速度来判断桩的概况和质量。
声波测试在探测桩的裂缝和损坏部位上效果较好,可以在检测过程中快速、直接地了解桩的内部情况,工作效率较高。
而且声波测试的方法可以远距离探测桩环境的情况,对于弯曲或区域性交替沉陷的桩可以检测出长段的问题。
不过,声波测试的方法也存在一定的局限性,如外界噪声、几何结构等因素都会影响声波测试的准确性。
第四种方法是电阻率测试,它是通过将电流注入桩内部,读取电阻率和电容率来诊断桩的质量和概况。
电阻率测试方法具有高精度、高速度和低成本的特点,特别适用于工程建设现场的检测与监测。
与声波测试不同,电阻率测试不仅仅用于检测混凝土桩,而且还适用于木制桩和钢桩等其他类型的桩。
它还具有测定桩顶和桩底深度的优点。
电阻率测试在遇到腐蚀损坏的桩时的精度会降低。
插桩技术分类
插桩技术分类插桩技术是一种软件开发过程中常用的调试和分析工具,它可以对程序进行监测和修改,用于收集程序运行时的信息或调试错误。
根据其应用领域和具体功能,插桩技术可以分为静态插桩和动态插桩两大类。
一、静态插桩技术静态插桩是指在程序编译阶段对源代码进行修改,将插入的代码嵌入到目标程序中。
静态插桩技术通常用于代码覆盖率分析、静态代码检查等场景。
常见的静态插桩工具包括Gcov、Lcov等。
1. 代码覆盖率分析代码覆盖率分析是一种测试技术,用于衡量测试用例对程序的覆盖程度。
静态插桩技术可以在源代码中插入计数器,用于记录测试用例覆盖的代码行数。
通过分析计数器的统计结果,可以评估测试用例的覆盖率,并进一步优化测试用例集合。
2. 静态代码检查静态代码检查是一种通过分析源代码来检测潜在问题的技术。
静态插桩技术可以在源代码中插入检查代码,用于检测代码中的错误、漏洞或不规范的写法。
通过静态插桩,可以在编译阶段对源代码进行检查,提前发现潜在问题并进行修复,以提高代码的质量和可靠性。
二、动态插桩技术动态插桩是指在程序运行时对目标程序进行修改,将插入的代码嵌入到程序执行流中。
动态插桩技术可以用于性能分析、调试错误等场景。
常见的动态插桩工具包括Valgrind、DynamoRIO等。
1. 性能分析性能分析是指对程序的性能进行监测和评估的过程。
动态插桩技术可以在目标程序执行过程中插入计时代码,用于测量程序的运行时间、函数调用次数等性能指标。
通过分析插入的计时代码,可以找出程序的瓶颈和性能问题,并进行优化。
2. 调试错误调试错误是软件开发过程中常见的任务,动态插桩技术可以在目标程序中插入打印日志、断点等代码,用于调试程序中的错误。
通过动态插桩,可以在程序执行过程中获取关键信息,帮助开发人员定位和修复错误。
插桩技术是一种常用的软件开发工具,可以用于调试错误、性能分析、代码覆盖率分析等场景。
根据其应用领域和具体功能,插桩技术可以分为静态插桩和动态插桩两大类。
桩基检测方法及流程
桩基检测方法及流程桩基检测是确保建筑结构安全稳定的重要步骤,其方法及流程如下:一、桩基检测方法1、静载试验法:这是公认的检测基桩竖向抗压承载力最直接、最可靠的试验方法。
通过在桩顶逐渐添加轴向压力、轴向上将拔力或在桩基承载台下方标高一样的地方添加水平力,观察桩对应检测点随时间出现的变化,再依据改变的位置来判断承载力。
2、钻芯检测法:具有科学、直观、实用等特点,可以检测混凝土灌注桩的桩长、桩身混凝土强度、桩底沉渣厚度和桩身完整性,并判定或鉴别桩端持力层的岩土性状。
3、低应变动力检测法:通过小锤敲击桩顶,利用传感器接收来自桩中的应力波信号,分析桩土体系的动态响应,从而得到桩的完整性信息。
4、高应变法:主要用于判定桩竖向抗压承载力是否满足设计要求,并能对桩身水平整合型缝隙、预制桩接头等缺陷进行合理判定。
5、声波透射法:能够全面、细致地进行检测,基本无其他限制条件。
利用多通道超声波检测仪,对一组声学数据进行分析,从而判断桩的完整性。
二、桩基检测流程1、准备阶段:与委托单位签定技术服务合同,准备相应的设备和人员。
确定检测方法和所需设备,制定检测计划。
2、现场检测:按照检测计划,进行现场检测和取样工作。
根据选定的检测方法,对桩基进行相应的检测操作。
例如,静载试验需按照预定的加载方式进行加载和卸载;钻芯检测则需使用钻机进行取样等。
3、数据处理与分析:将检测数据进行整理和分析,得到检测结果。
对于复杂的桩基检测,可能需要结合多种方法的数据进行综合分析和判断。
4、编写检测报告:根据检测结果,编写桩基检测报告。
报告应详细记录检测过程、方法和结果,并提出相应的建议或处理措施。
需要注意的是,不同的检测方法具有各自的适用条件和局限性,因此在选择检测方法时,需要根据实际情况进行综合考虑。
同时,桩基检测工作应由具有相应资质和经验的检测机构或人员进行,确保检测结果的准确性和可靠性。
工程桩检测方案
工程桩检测方案1. 引言工程桩是土木工程中不可或缺的重要组成部分,它们起着支撑、固定结构的作用。
为了确保工程桩的质量和稳定性,对其进行检测是必不可少的。
本文将介绍一种工程桩检测方案,包括检测方法、仪器设备以及数据分析等方面。
2. 检测方法2.1 力学性能测试力学性能测试是工程桩检测中最常用的方法之一。
通过对工程桩施加一定的荷载,测量其变形、应力等力学性能参数,从而评估其质量和稳定性。
常用的力学性能测试方法包括:•静载试验:施加静态荷载,观察工程桩的变形、沉降等情况,以评估其承载能力。
•动载试验:施加动态荷载,测量振动响应和应力变化,从而判断工程桩的动力特性、疲劳性能等指标。
•爆破试验:通过施加爆破荷载,评估工程桩的抗震性能和破坏模式。
2.2 声波检测声波检测是一种非破坏性检测方法,适用于评估工程桩的质量和内部结构。
通过在桩体上施加声波信号,利用回波信号的特征分析桩内部的缺陷、裂缝、空洞等情况。
常用的声波检测方法包括:•频谱分析法:通过对声波信号进行频谱分析,识别出不同频段的异常信号,判断工程桩的质量和结构状况。
•时间域分析法:通过分析声波信号的变化规律,检测出声波的传播时间、振幅等信息,从而判断工程桩的完整性和结构状况。
•包络分析法:通过对声波信号的包络线进行分析,识别出信号的中心频率、特征频率等,从而判断工程桩的质量和稳定性。
3. 仪器设备工程桩检测需要使用专门的仪器设备来进行实施。
根据不同的检测方法,可以选择不同的仪器设备来满足需求。
常用的仪器设备包括:•静载试验仪:用于施加静态荷载,测量工程桩的变形、应力等参数。
•动载试验仪:用于施加动态荷载,测量振动响应和应力变化。
•声波检测仪:用于产生声波信号并接收回波信号,从而评估工程桩的质量和结构状况。
•数据记录仪:用于记录和存储检测过程中的数据,便于后续的数据分析和报告生成。
4. 数据分析对于工程桩检测所获得的数据,需要进行仔细的数据分析,得出准确的结论和评估。
性能测试评估方法、装置、计算机设备及可读存储介质[发明专利]
专利名称:性能测试评估方法、装置、计算机设备及可读存储介质
专利类型:发明专利
发明人:郑如刚
申请号:CN201911082797.3
申请日:20191107
公开号:CN111045927A
公开日:
20200421
专利内容由知识产权出版社提供
摘要:本发明公开了性能测试评估方法、装置、计算机设备及可读存储介质,基于通信测试领域,包括以下步骤:将覆盖率计数器配置在待测系统的构建项目下;利用编译器对待测系统进行编译获得字节码,利用覆盖率计数器对字节码进行插桩后并打包,获得插桩待测系统;将预生成的测试脚本录入插桩待测系统并获得测试结果;根据插桩待测系统的反射获得对象方法列表;通过检测插桩待测系统中探针,获得测试脚本在插桩待测系统中的代码覆盖率表;将代码覆盖率表录入评估模型,以获得测试评估结果;汇总测试结果、对象方法列表和测试评估结果形成测试报告。
本发明避免了造成该软件测试覆盖不全,或测试效果难以评估的情况,提高了软件测试的自动化水平。
申请人:平安科技(深圳)有限公司
地址:518000 广东省深圳市福田区福田街道福安社区益田路5033号平安金融中心23楼
国籍:CN
代理机构:北京英特普罗知识产权代理有限公司
代理人:程超
更多信息请下载全文后查看。
如何进行代码插桩和动态分析
如何进行代码插桩和动态分析代码插桩和动态分析是一种常用的软件调试和性能优化技术。
在软件开发过程中,这两种技术有助于发现和修复代码中的错误,提高软件的稳定性和性能。
代码插桩是指向源代码中插入探针代码,用于收集程序执行过程中的信息。
探针代码通常会记录程序的状态、变量的值、代码执行路径等信息。
通过插入探针代码,开发者可以了解程序在具体开始、结束和执行过程中的行为,从而找到代码中的问题。
代码插桩主要包括静态插桩和动态插桩两种方式。
静态插桩是在编译时将探针代码插入到源代码中。
常见的静态插桩工具有gcc的插桩选项和LLVM框架。
gcc的插桩选项(如-g)会在编译过程中生成调试信息,包括变量名、行号等信息,方便调试。
LLVM框架是一个灵活的编译器基础设施,可以通过插件的方式实现代码插桩。
静态插桩的优点是插桩代码与源代码耦合度低,不会影响程序的执行性能;缺点是需要重新编译源代码,生成新的可执行文件。
动态插桩是在程序运行时,利用动态链接库(DLL)注入探针代码。
在Windows系统下,可使用Detours和API Monitor等工具进行动态插桩。
Detours是一款微软提供的逆向工程工具,可以修改函数调用路径,注入探针代码。
API Monitor是一款函数监视工具,可以在API调用前后插入代码,记录函数的输入参数和返回值。
动态插桩的优点是可以在不重新编译程序的情况下进行调试和性能分析,适用于开发中的追踪问题;缺点是会影响程序的执行性能,不适合用于生产环境。
动态分析是指在程序运行时,对程序进行监控和分析,从而了解程序的行为。
动态分析主要包括性能分析和行为分析两种方式。
性能分析是对程序执行性能进行监测和评估。
通过对程序的每一个函数进行时钟周期和内存访问的统计,可以找出性能瓶颈所在。
常用的性能分析工具有gprof、perf和Valgrind等。
gprof是一个使用GNU编译器框架的性能分析工具,可以生成函数调用图和函数执行时间;perf是一个Linux系统下的性能分析工具,可以监控CPU的事件计数器,获取函数执行和内存访问的统计信息;Valgrind是一款内存调试和性能分析工具,可以检测内存泄漏和内存访问错误。
新国标充电桩检测操作流程
新国标充电桩检测操作流程When it comes to testing the new national standard charging pile, it is essential to follow a specific operating procedure to ensure safety and efficiency. 针对新国家标准充电桩的检测操作,遵循特定的操作流程非常重要,以确保安全和效率。
First and foremost, it is crucial to familiarize yourself with the user manual provided by the charging pile manufacturer. 首先,至关重要的是要熟悉充电桩制造商提供的用户手册。
The user manual will provide detailed instructions on how to properly connect the charging cable to the electric vehicle, how to initiate the charging process, and how to monitor the charging progress. 用户手册将提供如何将充电电缆正确连接到电动汽车、如何启动充电过程以及如何监控充电进度的详细说明。
Before testing the charging pile, it is important to inspect the physical condition of the equipment, including checking for any visible damage or loose connections. 在测试充电桩之前,重要的是要检查设备的物理状态,包括检查任何可见的损坏或松动连接。
试桩的程序流程范文
试桩的程序流程范文试桩程序流程是指在软件开发过程中,对已经编写的代码进行测试和验证的一种方法。
它通过模拟输入和输出,来检查程序在不同情况下的运行和结果是否符合预期。
下面是试桩程序的典型流程。
1.确定测试目标和范围:首先要明确目标,确定要测试的是哪一部分代码,以及测试的范围是什么。
可以根据需求文档、设计文档或者代码本身来确定测试目标。
2.编写测试用例:根据测试目标,设计多种不同的输入场景和使用不同的测试数据来测试代码。
测试用例应该覆盖各种情况,包括正常情况和异常情况。
测试用例应该具有可重复性,并且要确保每个测试用例都是独立的。
3.准备测试环境:在进行试桩之前,需要搭建一个适合的测试环境,包括安装必要的软件和配置合适的系统环境。
这样才能保证测试的正确执行。
4.插桩代码:试桩是通过在源代码中插入额外的代码来实现的。
可以通过手工插入代码或者使用自动化工具来实现。
插桩代码的目的是在运行时记录和监测代码的执行过程,并收集相关的信息。
5.执行测试用例:执行事先设计好的测试用例,将输入数据输入到程序中,并记录执行过程和输出结果。
需要对每个测试用例做相应的准备工作,如设置环境变量、数据库初始化等。
同时需要记录每个测试用例的执行时间和消耗的资源。
6. 分析结果:根据测试结果,判断代码是否有bug或者是否符合预期。
如果有错误或异常,就需要定位问题,并提供相应的修改建议。
可以通过日志、调试器等方式来查找错误所在。
7.修改代码:根据测试结果和分析,对代码进行修改和优化。
修复发现的问题,并优化代码的性能和可读性。
修改完成后,需要重新进行测试,以确保修改没有引入新的问题。
8.再次执行测试用例:在代码修改完成后,需要重新执行之前的测试用例,以验证代码的修改是否有效,并且确认之前的问题是否已经修复。
这个过程可以反复迭代,直到测试用例全部通过为止。
9.清理测试环境:测试结束后,需要清理测试环境,包括删除测试数据、重置系统配置等。
这样可以保持测试环境的干净和稳定。
实验四最大公约数程序插桩测试
实验三最大公约数程序插桩测试一、实验目的1.学会利用计算机技术实现程序插桩。
2.明确程序插桩需要考虑的问题。
3.掌握插桩探测点的设置技巧。
4.掌握开启和关闭插桩程序的基本技术。
二、实验任务1.通过对被测试系统中最大公约数问题进行语句覆盖测试(执行次数统计)学会如何实现程序插桩测试。
2.学会利用条件编译编译的方法,在最终的产品中去掉插桩程序。
三、实验步骤1.通过阅读程序了解最大公约数求解程序的处理流程。
2.明确探测信息,进行插桩程序设计。
3.插桩程序正常执行,达到预期结果后,利用预编译技术为插桩程序设置开关。
4.测试插桩程序的正确性,包括测试输出是否正确,对插桩程序的开关是否能正常控制。
四、实验提示1.针对/C#.NET编程语言,上网寻找插桩程序的编程方法,将执行次数信息写入文本文件,文本文件内容如下:2011-9-14 10:02:40测试开始第一条语句执行1第二条语句执行1第三条语句执行1第四条语句执行0第五条语句执行0第六条语句执行02011-9-14 10:02:40测试结束2011-9-14 10:02:46测试开始第一条语句执行1第二条语句执行19第三条语句执行1第四条语句执行18第五条语句执行2第六条语句执行162011-9-14 10:02:46测试结束2.通过在编程环境中进行预编译变量值的设定来实现插桩程序的开关,观察当关闭DEBUG条件编译后,是否还会将测试信息写入对应的文本文件。
五、实验报告要求1.本次实验结束实验内容部分填写插桩实现的源代码,及写入文本文件的部分内容。
程序插桩技术
现代语言表述算法
第一步:任意给顶两个正整数; 第一步:任意给顶两个正整数;判断他们是否都是偶 若是,则用2约简 若不是则执行第二步。 约简; 数。若是,则用 约简;若不是则执行第二步。 第二步:以较大的数减较小的数, 第二步:以较大的数减较小的数,接着把所得的差与较小的数 比较,并以大数减小数。 比较,并以大数减小数。 第三步:继续这个操作,直到所得的减数和差相等为止, 第三步:继续这个操作,直到所得的减数和差相等为止,则这 个等数就是所求的最大公约数。 个等数就是所求的最大公约数。 注意: 其中所说的“等数” 就是最大公约数。 注意: 其中所说的“等数”,就是最大公约数。 等数”的办法是“更相减损” 即辗转相除法。 求“等数”的办法是“更相减损”法,即辗转相除法。 用更相减损术求98与 的最大公约数 的最大公约数? 例: 用更相减损术求 与63的最大公约数? 由于63不是偶数 不是偶数, 以大数减小数, 解:由于 不是偶数,把98和63以大数减小数,并展转相减 和 以大数减小数 98-63=35 63-35=28 35-28=7 28-7=14 14-7=7 所以, 和 的最大公约数等于 的最大公约数等于7。 所以,98和63的最大公约数等于 。
程序插桩技术
如果我们想要了解一个程序在某次运行中 所有可执行语句被覆盖的情况,或是每个 所有可执行语句被覆盖的情况, 语句的实际执行次数,最好的办法是利用 语句的实际执行次数, 插桩技术。这里仅以计算整数X和整数Y的 插桩技术。这里仅以计算整数X和整数Y 最大公约数程序为例,说明插桩方法的要 最大公约数程序为例, 点。
个问题, 第 3个问题 , 需要考虑如何设置最少探测点方案 。 个问题 需要考虑如何设置最少探测点方案。 第 4个问题 , 是如何在程序中特定部位插入断言 个问题, 个问题 语句。在应用程序插桩技术时, 语句。在应用程序插桩技术时,可在程序中特定 部位插入某些用以判断变量特性的语句, 部位插入某些用以判断变量特性的语句,使得程 序执行中这些语句得以证实。 序执行中这些语句得以证实。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本技术公开了一种代码插桩检测方法,涉及程序分析技术领域,旨在通过比对运行前后的函数指令长度,完成代码插桩检测,该方法包含以下步骤:获取APK中的DEX文件,解析所述DEX文件,得到所述DEX文件的原始函数指令长度;运行所述APK,获取所述DEX文件的内存地址;获取函数偏移值,根据所述DEX文件的内存地址和所述函数偏移值,得到目标函数指令长度;比对所述原始函数指令长度和所述目标函数指令长度,输出插桩检测结果。
本技术还公开了一种代码插桩检测装置、电子设备和计算机存储介质。
权利要求书1.一种代码插桩检测方法,其特征在于,包括以下步骤:获取APK中的DEX文件,解析所述DEX文件,得到所述DEX文件的原始函数指令长度;运行所述APK,获取所述DEX文件的内存地址;获取函数偏移值,根据所述DEX文件的内存地址和所述函数偏移值,得到目标函数指令长度;比对所述原始函数指令长度和所述目标函数指令长度,输出插桩检测结果。
2.如权利要求1所述的代码插桩检测方法,其特征在于,通过预先设置的脚本解析所述DEX 文件,得到所述DEX文件的原始函数指令长度。
3.如权利要求2所述的代码插桩检测方法,其特征在于,运行所述APK,具体为:将所述原始函数指令长度写入所述APK,然后运行所述APK。
4.如权利要求3所述的代码插桩检测方法,其特征在于,获取函数偏移值,具体为:从不同版本的Android系统源码中获取函数偏移值,所述函数偏移值为相应函数对应的结构体成员变量的偏移值。
5.如权利要求1-4任一项所述的代码插桩检测方法,其特征在于,根据所述DEX文件的内存地址和所述函数偏移值,得到目标函数指令长度,具体为:将所述DEX文件的内存地址加上所述函数偏移值,得到函数指令长度指针,通过函数指令长度指针获取目标函数指令长度。
6.如权利要求5所述的代码插桩检测方法,其特征在于,比对所述原始函数指令长度和所述目标函数指令长度,输出插桩检测结果,具体包括:若所述原始函数指令长度与所述目标函数指令长度一致,则未被插桩,输出未被插桩的检测结果;反之,则已被插桩,输出已被插桩的检测结果。
7.一种代码插桩检测装置,其特征在于,包括:DEX解析模块,用于获取APK中的DEX文件,解析所述DEX文件,得到所述DEX文件的原始函数指令长度;内存地址获取模块,用于运行所述APK,获取所述DEX文件的内存地址;函数长度计算模块,用于获取函数偏移值,根据所述DEX文件的内存地址和所述函数偏移值,得到目标函数指令长度;比对输出模块,用于比对所述原始函数指令长度和所述目标函数指令长度,输出插桩检测结果。
8.一种电子设备,其包括处理器、存储介质以及计算机程序,所述计算机程序存储于存储介质中,其特征在于,所述计算机程序被处理器执行时实现权利要求1至6任一项所述的代码插桩检测方法。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至6任一项所述的代码插桩检测方法。
技术说明书代码插桩检测方法、装置、设备及介质技术领域本技术涉及程序分析技术领域,尤其涉及一种代码插桩检测方法、装置、设备及介质。
背景技术随着移动互联网的发展,智能手机的安全问题成为移动互联网行业以及移动互联网用户最为重视的问题之一,其中随着Android系统设备的增加,Android应用的安全问题尤为被重视。
在Android应用开发完成后,其交互流程是保密的,如果Android应用在接入用户阶段被插桩,那么应用程序的交互过程就会被用户拦截,导致Android应用的大部分业务逻辑暴露给用户,从而带来安全风险。
常见的插桩操作如下:1. 在网络请求部分插桩,以获取Android应用的传输信息。
2. 在文件操作部分插桩,以获取Android应用中所有的读写文件,甚至读写内容。
3. 在加密代码部分插桩,以获取加密解密数据。
4. 在数据格式转换部分插桩,以获取业务数据。
除上述四种插桩操作之外,Android应用中可插桩的位置非常多,而插桩位置越多,带来的安全威胁就越大。
因此亟需一种检测代码插桩的方法来克服插桩带来的安全隐患。
但是现有的代码插桩检测方法依赖于大量的人工分析,工作量大,且存在误差。
技术内容为了克服现有技术的不足,本技术的目的之一在于提供一种代码插桩检测方法,旨在通过比对APK运行前后的函数长度,实现代码插桩检测。
本技术的目的之一采用以下技术方案实现:一种代码插桩检测方法,包括以下步骤:获取APK中的DEX文件,解析所述DEX文件,得到所述DEX文件的原始函数指令长度;运行所述APK,获取所述DEX文件的内存地址;获取函数偏移值,根据所述DEX文件的内存地址和所述函数偏移值,得到目标函数指令长度;比对所述原始函数指令长度和所述目标函数指令长度,输出插桩检测结果。
进一步地,通过预先设置的脚本解析所述DEX文件,得到所述DEX文件的原始函数指令长度。
进一步地,运行所述APK,具体为:将所述原始函数指令长度写入所述APK,然后运行所述APK。
进一步地,获取函数偏移值,具体为:从不同版本的Android系统源码中获取函数偏移值,所述函数偏移值为相应函数对应的结构体成员变量的偏移值。
进一步地,根据所述DEX文件的内存地址和所述函数偏移值,得到目标函数指令长度,具体为:将所述DEX文件的内存地址加上所述函数偏移值,得到函数指令长度指针,通过函数指令长度指针获取目标函数指令长度。
进一步地,比对所述原始函数指令长度和所述目标函数指令长度,输出插桩检测结果,具体包括:若所述原始函数指令长度与所述目标函数指令长度一致,则未被插桩,输出未被插桩的检测结果;反之,则已被插桩,输出已被插桩的检测结果。
本技术的目的之二在于提供一种代码插桩检测装置,其通过获取APK运行前和运行后的函数指令长度去判断代码是否被插桩,从而完成对代码插桩的检测。
本技术的目的之二采用以下技术方案实现:DEX解析模块,用于获取APK中的DEX文件,解析所述DEX文件,得到所述DEX文件的原始函数指令长度;内存地址获取模块,用于运行所述APK,获取所述DEX文件的内存地址;函数长度计算模块,用于获取函数偏移值,根据所述DEX文件的内存地址和所述函数偏移值,得到目标函数指令长度;比对输出模块,用于比对所述原始函数指令长度和所述目标函数指令长度,输出插桩检测结果。
本技术的目的之三在于提供执行技术目的之一的电子设备,其包括处理器、存储介质以及计算机程序,所述计算机程序存储于存储介质中,所述计算机程序被处理器执行时实现上述的代码插桩检测方法。
本技术的目的之四在于提供存储技术目的之一的计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述的代码插桩检测方法。
相比现有技术,本技术的有益效果在于:通过脚本自动化完成解析DEX文件和APK再次编译过程,无需大量人工分析,通过比对APK 运行前的函数指令长度和APK运行后的函数指令长度,实现代码插桩检测,适用于任意一个Android应用程序的检测。
附图说明图1是本技术代码插桩检测方法的流程图;图2是实施例2的代码插桩检测装置的结构框图;图3是实施例3的电子设备的结构框图。
具体实施方式以下将结合附图,对本技术进行更为详细的描述,需要说明的是,以下参照附图对本技术进行的描述仅是示意性的,而非限制性的。
各个不同实施例之间可以进行相互组合,以构成未在以下描述中示出的其他实施例。
实施例1本实施例提供了一种代码插桩检测方法,旨对APK中的DEX文件进行解析,得到DEX文件中的函数指令长度,运行APK之后,再次获取DEX文件中的函数指令长度,通过对比函数指令长度,判断代码是否被插桩,从而实现代码插桩检测。
根据上述原理,对代码插桩检测方法进行介绍,如图1所示,代码插桩检测方法,具体包括以下步骤:获取APK中的DEX文件,解析所述DEX文件,得到所述DEX文件的原始函数指令长度;运行所述APK,获取所述DEX文件的内存地址;获取函数偏移值,根据所述DEX文件的内存地址和所述函数偏移值,得到目标函数指令长度;比对所述原始函数指令长度和所述目标函数指令长度,输出插桩检测结果。
优选地,运行所述APK,具体为:将所述原始函数指令长度写入所述APK(再次编译所述APK),然后运行所述APK。
上述原始函数指令长度为APK运行前的函数指令长度,其中DEX文件为APK中的JAVA类集合,包含APK的所有函数,因此解析DEX文件,可以得到APK中的所有函数,即被编译的代码。
获取APK的DEX文件之前,在源代码中加入检测代码,然后编译打包得到所述APK,获取所述APK的DEX文件进行解析,得到原始函数指令长度,然后将原始函数指令长度写入所述DEX文件中,通过编译打包得到待运行的APK。
本技术通过编译两次完成APK的打包,以获取原始函数指令长度。
APK为Android应用程序包,用户接入SDK后,对SDK进行代码编译,在代码编译期间,用户可以对SDK(Android应用程序开发包)进行插桩操作,以获取Andriod应用程序的代码逻辑。
通过编译后的Android应用程序(包含代码)被打包为APK,APK内部包含DEX文件。
在APK运行期间,DEX文件会被Dalvik或者ART虚拟机加载运行,使得DEX文件中的函数信息(其中一个数据结构)会发生改变,因此通过动态查找DEX文件在内存中的地址,再将DEX文件在内存中的地址加上函数偏移值,以得到内存中的函数指令长度指针,从而根据该指令长度指针得到内存中的函数指令长度,即上述目标函数指令长度。
通过比对原始函数指令长度与目标函数指令长度来判断代码是否被插桩。
若本实施例所述的DEX文件被Dalvik虚拟机加载运行时,通过Hook函数openDexFile获取DEX 文件的内存地址,该函数的返回值即为DEX文件的内存地址。
若本实施例所述的DEX文件被ART虚拟机加载运行时,通过Hook函数OpenMemory获取DEX 文件的内存地址,该函数的第一个参数即为DEX文件的内存地址。
上述原始函数指令长度和目标函数指令长度为相同函数的指令长度,且均为Andriod应用程序开发包中的通用函数。
优选地,通过预先设置的脚本获取并解析所述DEX文件,得到所述DEX文件的原始函数指令长度。
在本实施例中,所述预先设置的脚本通过Python编写,用于计算函数指令长度,具有通用性。
获取APK中的DEX文件之前需要将编译好的APK进行解压。
在本实施例中,使用脚本自动将DEX文件再次编译,不需要手动操作,流程更简化,操作更方便。
优选地,获取函数偏移值,具体为:从不同版本Android系统的源码中获取函数偏移值,本实施例从Android2.2版本至Android1.0版本的源码中获取函数偏移值,该函数偏移值即为每个Android版本对应的函数结构体或C++成员变量相对于结构体指针的偏移量,通过偏移量即可定位DexCode结构体。