想在一个Activity里面调用另外一个Activity的方法主要有接口回调和静态方法。但是除了静态方法之外,并不推荐接口回调方法。 其中静态方法实现参考如下表述: 需求:在A activity中调用 B activity的methodB()。 实现:使用静态实现
一种android应用程序防篡改的方法、系统及计算机存储介质,基于内存检测的动态防篡改的检测方案,检测到恶意代码注入时进行即时反制,自动恢复成原始的程序,更加有效和准确地进行应用程序的自我保护,同时也保障用户的安全使用。
根据本发明一方面,提供了一种android应用程序防篡改的方法,包括:
检测当前函数的第一标志是否为第一预定标志;
比较所述当前函数的内存结构与原函数的内存结构,判断所述当前函数是否被篡改;
如果所述当前函数被篡改,则将当前函数恢复为原函数。
示例性地,所述检测当前函数的第一标志是否为第一预定标志包括:在dalvik运行模式下,检测当前函数的修饰符是否为acc_native。
示例性地,所述检测当前函数的第一标志是否为第一预定标志包括:在art运行模式下,检测当前函数的access_flags是否标识为被xposedhook。
示例性地,所述比较所述当前函数的内存结构与原函数的内存结构包括:通过获取所述当前函数的xposedhookinfo,并将其转换为method结构,比较所述当前函数的method结构与所述原函数的method结构。
示例性地,所述转换为method结构包括:在dalvik运行模式下,通过获取当前函数method的insns即xposedhookinfo,将其转换为method结构。
示例性地,所述转换为method结构包括:在art运行模式下,通过获取当前函数method的entry_point_from_jni,将hookinfo->original_mathod转换为artmethod结构。
示例性地,所述判断所述当前函数是否被篡改包括:如果所述当前函数的method结构与原函数的method结构中除了修改过的值,其余的值都相同,则确定当前函数被注入代码。
示例性地,在dalvik运行模式下,修改过的值包括:method结构中的accessflags,以及nativefunc、insns、registerssize、outssize中的至少一个;其余的值包括:clazz、methodindex、name、shorty中的至少一个。
示例性地,在art运行模式下,修改过的值包括:artmethod类结构中的access_flags_,以及entry_point_from_jni_、entry_point_from_quick_compiled_code_、dex_code_item_offset_中的至少一个;其余的值包括:declaring_class_、dex_method_index_、method_index_中的至少一个。
示例性地,将当前函数恢复为原函数包括:将检测到被篡改的当前函数的内存空间替换为备份的原函数内存空间。
根据本发明另一方面,提供了一种android应用程序防篡改的系统,包括存储器、处理器及存储在所述存储器上且在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述方法的步骤。
根据本发明另一方面,提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被计算机执行时实现上述方法的步骤。
根据本发明实施例的一种android应用程序防篡改的方法、系统和存储介质,采用非接触式的方法,基于内存检测的动态防篡改的检测方案,检测到恶意代码注入时进行即时反制,自动恢复成原始的程序,更加有效和准确地进行应用程序的自我保护,同时也保障用户的安全使用。
附图说明
通过结合附图对本发明实施例进行更详细的描述,本发明的上述以及其它目的、特征和优势将变得更加明显。附图用来提供对本发明实施例的进一步理解,并且构成说明书的一部分,与本发明实施例一起用于解释本发明,并不构成对本发明的限制。在附图中,相同的参考标号通常代表相同部件或步骤。
图1是用于实现根据本发明实施例的一种android应用程序防篡改的方法的示意性流程图;
图2是用于实现根据本发明实施例的在dalvik运行模式下检测当前函数是否被篡改的示意性流程图;
图3是用于实现根据本发明实施例的在art运行模式下检测当前函数是否被篡改的示例的示意性流程图;
图4是用于实现根据本发明实施例的在dalvik运行模式下恢复原函数的示例的示意性流程图;
图5是用于实现根据本发明实施例的在art运行模式下恢复原函数的示例的示意性流程图。
具体实施方式
为了使得本发明的目的、技术方案和优点更为明显,下面将参照附图详细描述根据本发明的示例实施例。显然,所描述的实施例仅仅是本发明的一部分实施例,而不是本发明的全部实施例,应理解,本发明不受这里描述的示例实施例的限制。基于本发明中描述的本发明实施例,本领域技术人员在没有付出创造性劳动的情况下所得到的所有其它实施例都应落入本发明的保护范围之内。
dex文件是android应用程序的可执行文件,如前所述,例如,基于xposed的开源框架下,动态注入的恶意代码,把原有函数的method结构体进行了拷贝,保存到一个新的地址a指向的内存空间,同时修改原函数的修饰符,修改原函数的入口指向一个回调函数,回调函数内容包含被注入的代码和原函数的代码(即a所指向的程序),保存原函数的代码是为了运行被注入的代码之后能够运行原函数的逻辑。这样原函数被调用时则会执行回调函数,原函数原有的运行逻辑或参数就被篡改了。
具体来说,例如:在dalvik运行模式下,首先通过拷贝当前函数相关信息保存到hookinfo实现原函数的备份,接着修改当前函数的method修饰符为acc_native(accessflags与0x00000100进行或运算),修改当前函数的nativefunc指向hook回调方法,以及替换当前函数的method->insns指向hookinfo,最后修正当前函数的registerssize及outssize;在art运行模式下,首先通过拷贝当前函数相关信息保存到hookinfo->original_method实现原函数的备份,接着修改当前函数的artmethod->access_flags_(与0x10000000进行或运算),以标志此函数为被注入的函数,替换当前函数的entry_point_from_jni_指向hookinfo,修改entry_point_from_quick_compiled_code_指向hook回调函数,最后修改dex_code_item_offset_为0。
这种对android应用程序的动态注入篡改程序是无法被现有的基于静态文件检测的方法所检测的。
因此,本发明实施例提出了一种android应用程序防篡改的方法。参考图1来描述用于实现本发明实施例的一种android应用程序防篡改的方法100。
首先,在步骤s110,检测当前函数的第一标志是否为第一预定标志;
在步骤s120,比较所述当前函数的内存结构与原函数的内存结构,判断所述当前函数是否被篡改;
在步骤s130,如果所述当前函数被篡改,则将当前函数恢复为原函数。
根据本发明实施例,步骤110可以进一步地包括:第一标志包括当前函数的修饰符或access_flags访问标志;第一预定标志包括acc_native或被xposedhook。
在一个实施例中,在dalvik运行模式下,检测当前函数的修饰符是否为acc_native。
在另一个实施例中,在art运行模式下,检测当前函数的access_flags是否标识为被xposedhook。
根据本发明实施例,步骤120可以进一步地包括:所述比较所述当前函数的内存结构与原函数的内存结构包括:通过获取所述当前函数的xposedhookinfo,并将其转换为method结构,比较所述当前函数的method结构与所述原函数的method结构。
根据本发明实施例,步骤120还可以进一步地包括:所述判断所述当前函数是否被篡改包括:如果所述当前函数的method结构与原函数的method结构中除了修改过的值,其余的值都相同,则确定当前函数被注入代码。
在一个实施例中,参见图2,图2示出了用于实现根据本发明实施例的在dalvik运行模式下检测当前函数是否被篡改的示例的示意性流程图。具体来说:
在dalvik运行模式下,首先通过获取当前函数method(标识为curmethod)的insns即xposedhookinfo,将其转换为method结构(标识为originmethod);
然后,比较所述当前函数中curmethod与originmethod的内存结构,如果除去修改过的值,其余的值都相同,就确定所述当前函数函数被xposed注入了代码。其中,修改过的值包括:method结构中的accessflags,以及nativefunc、insns、registerssize、outssize中的至少一个;其余的值包括:clazz、methodindex、name、shorty中的至少一个。
在另一个实施例中,参见图3,图3示出了用于实现根据本发明实施例的在art运行模式下检测当前函数是否被篡改的示例的示意性流程图。具体来说:
在art运行模式下,首先通过获取当前函数method(标识为curmethod)的entry_point_from_jni_即xposedhookinfo,将hookinfo->original_mathod转换为artmethod结构(标识为originmethod)。
然后,比较所述当前函数中curmethod与originmethod的内存结构,如果除去修改过的值之外,其余的值都一样,就可以判断该函数被xposed注入了代码。其中,修改过的值包括:artmethod类结构中的access_flags_,以及entry_point_from_jni_、entry_point_from_quick_compiled_code_、dex_code_item_offset_中的至少一个;其余的值包括:declaring_class_、dex_method_index_、method_index_中的至少一个。
根据本发明实施例,步骤230可以进一步地包括:将检测到被篡改的当前函数的内存空间替换为备份的原函数内存空间。
在一个实施例中,参见图4,图4示出了根据本发明实施例的在dalvik运行模式下恢复原函数的示例的示意性流程图。具体来说:在dalvik运行模式下,恢复当前函数method(标识为curmethod)为原函数originmethod的内容。
在另一个实施例中,参见图5,图5示出了实现根据本发明实施例的在art运行模式下恢复原函数的示例的示意性流程图。具体来说:在art运行模式下,恢复当前函数method(标识为curmethod)为原函数originmethod的内容。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
根据本发明实施例,还提供了一种android应用程序防篡改的系统,包括存储器、处理器及存储在所述存储器上且在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现上述方法的步骤。
此外,根据本发明实施例,还提供了一种计算机可读存储介质,在所述存储介质上存储了程序指令,在所述程序指令被计算机或处理器运行时用于执行本发明实施例的android应用程序防篡改方法的相应步骤。所述存储介质可以包括只读存储器,可擦除可编程只读存储器等各种存储器,或上述存储介质的任意组合。
根据本发明实施例的android应用程序防篡改方法、系统以及存储介质,基于内存检测的动态防篡改的检测方案,检测到恶意代码注入时进行即时反制,自动恢复成原始的程序,更加有效和准确地进行应用程序的自我保护,同时也保障用户的安全使用。
尽管这里已经参考附图描述了示例实施例,应理解上述示例实施例仅仅是示例性的,并且不意图将本发明的范围限制于此。本领域普通技术人员可以在其中进行各种改变和修改,而不偏离本发明的范围和精神。所有这些改变和修改意在被包括在所附权利要求所要求的本发明的范围之内。本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
以上所述,仅为本发明的具体实施方式或对具体实施方式的说明,本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。本发明的保护范围应以权利要求的保护范围为准。
android应用程序被恶意篡改,除了反编译修改静态代码再重打包的方式进行静态篡改,还包括动态篡改,即原始应用程序安装之后,对原有程序动态注入恶意代码,在程序运行过程中改变程序的运行路径及运行参数。现有的应用程序防篡改的方法一般是基于安装包的静态文件校验,如对应用程序的存储文件进行校验生成验证文件再打包到安装包中的方法,或通过对apk进行解压修改classesdex执行文件重新打包的方法。这种基于静态文件校验的方法的不足之处在于无法检测程序被动态篡改的情况,例如程序被动态注入恶意代码,基于静态文件的检测方法就并无法检测出程序被篡改。这些恶意行为可能造成用户隐私被窃取、被远程 *** 控等安全问题。
因此,现有技术中存在无法检测动态注入的恶意代码,以及应用程序安全性低的问题。
Xposed 摘要
验证Xposed模块自身是否被启用
Java反射机制、动态代理(过滤器Filter和拦截器Interceptor)
xposedAPI文档: >
1、Xposed 框架需要使用安装器进行安装,所以我们需要先安装Xposed 框架安装器,安装完成打开后点击框架(如图中红框位置),进行框架的安装。 2、点击后进入框架安装、升级界面,我们点击“安装/更新”,会出现ROOT授权提示,许可即可。这里小编给大家个提醒,为了Xposed 框架及以后各种模块的良好运行建议使用好的授权管理,目前各种一键ROOT生成的各种授权管理程序可能无法满足Xposed 框架及以后各种模块的需求。建议使用SuperSU Pro。Xposed 框架安装完成后重启手机才能激活,可直接点击重启也可手动重启。 3、我们安装Xposed 框架是为了使用各种模块,而增强手机的各种功能。在Xposed 框架安装器中可以点击“下载”进入模块仓库下载自己需要的模块,不过这里全是英文,可能与小编一样英文不好的朋友用起来有难度。还有个方法就是,直接安装需要的模块后,在Xposed 框架安装器中点击“模块”进入模块界面进行勾选,这里以红色守护的试验性功能为例,勾选后模块就开始发挥作用了。
以上就是关于如何用xposed调用别的界面的方法全部的内容,包括:如何用xposed调用别的界面的方法、安卓用什么开发防修改存档、xposed方面的备忘录等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)