注:本文为原“小米安全中心”,请联系“小米安全中心” 前言 xposed框架 Xposed,主页:http://repo.xposed.info/module/de.robv.android.xposed.installer 是一个开源框架,github上有源代码,安装和激活后可以直接下载apk,很多地方都有本教程,针对不同的手机架构,有针对性的变化。可以在论坛中搜索 通过替换/system/bin/app_process程序来控制zygote进程,app_process将在启动过程中加载XposedBridge.jar jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。 Xposed在启动时完成所有Hook函数的劫持,在执行原始Function之前和之后添加自定义代码。 很多人使用这个框架进行android的私有化。实际上,这个框架为android安全测试提供了极大的便利。 xposed主要是一个方法钩子。在过去的重新包装技术中,需要使用smali代码。修改它比较麻烦。 使用xposed框架,您可以轻松获取android应用程序中的信息,如加密私钥,盐值等,无需反编译即可获得密钥转换算法,无需知道密钥保存机制,直接挂钩功能,并获得输入和输出。能够。 原理 在Android系统中,应用程序进程由Zygote进程加以孵化,Zygote进程由Init进程启动。 Zygote进程在启动时创建Dalvik虚拟机实例,每当它孵化新的应用程序进程时,它就会将Dalvik虚拟机实例复制到新的应用程序进程中,从而使每个应用程序进程都有一个单独的Dalvik虚拟机实例。这就是Xposed选择替换app_process的原因。 在启动Zygote进程的过程中,除了创建Dalvik虚拟机实例之外,还将Java运行时库加载到进程中,并将Android核心类的一些JNI方法注册到之前创建的Dalvik虚拟机实例。跟着去吧。请注意,当应用程序进程由Zygote进程加盖时,它不仅会在Zygote进程中获取Dalvik虚拟机实例的副本,还会与Zygote共享Java运行时库。这就是XposedBridge jar可以加载到每个Android应用程序的原因。 XposedBridge有一个专有的Native(JNI)方法hookMethodNative,它也在app_process中使用。此函数提供了一个方法对象,该对象使用Java的Reflection机制来覆盖内置方法。有能力分析出来的源代码,不得不说作者对android机制和java的理解已经相当深刻了。 简单实例 很简单的android登录代码:
很简单就是判断用户输入的用户名和密码是否正确,这里是一个简单的演示,用户输入的用户名和密码信息是否正确无论是否正确 简单地说,开发xposed模块,首先需要导入api,具体参考:https://github.com/rovo89/XposedBridge/wiki/Using-the-Xposed-Framework-API 在清单中定义
声明这是xposed模块,名称是钩子测试,api版本号是82 以下是在运行时创建钩子代码的方法:
看看代码中的注释,主要是调用三个方法,handleLoadPackage,主要是获取android包的相关信息,这里因为只有登录测试钩子,做一个简单的判断。 findAndHookMethod是主要的钩子条目,它是包名,类加载器,钩子函数名,参数类型(这更容易出错,比如列表类型写成List.class),回调函数 回调函数更重要:beforeHookedMethod和afterHookedMethod,一个在函数运行之前被劫持,一个在钩子之后被释放,实例被劫持并打印在用户输入的字段上,然后参数被更改为正确的登录用户名和密码,因此您可以通过在应用程序中输入任何字符来成功登录。 frida Hook框架 Frida是一个基于python + javascript的钩子框架。它杀死android \ ios \ linux \ win \ osx和其他平台。因为它是基于脚本的交互,所以它比xposed和substrace cydia更方便。本文重点介绍android中的Frida。使用下面。 Frida的官方网站是:http://www.frida.re/ 安装 安装Frida非常简单,可直接在PC端执行。 Pip安装frida 您可以 在Android设备中需要导入frida服务器,需要root你的手机
跑 在设备上运行frida-server:
在您的计算机上运行adb forward tcp forwarding:
端口27042用于与frida-server通信,并且每个后续端口对应于每个注入的进程。 运行以下命令以验证安装是否成功: $ frida-ps-R 正常的输出过程列表应如下:
Hook模块的编写 钩子的主要模块是由js编写的,使用javascript api与服务器通信。 以下是一个实例的简要介绍,第一个是测试代码:
反编译获取app中的核心函数 对于上面的js代码,实际上是在app中调用一个函数,如符号值生成函数,加密和解密函数,不需要分别分析算法流程,分析键值,直接调用相应的应用程序的功能,让应用程序帮助我们完成这些任务。 我们在这里分析的应用程序是Youbao。这是一台饮料自动售货机。那时,当我看到交货时,我只有一个订单ID。我想如果我遍历订单的ID,付款是成功的,但没有提货的订单不会。将响应请求并将其删除。 以下分析了优宝的顺序 1.抓住付款订单成功链接
分析: 签收是支票价值,主要是为了防止订单伪造,orderid是生成的支付订单ID,这主要是为了防止伪造 2.反编译你的应用程序 找到发货/运输所在的包裹:com/ub/main/d/e.class localStringBuffer将参数信息存储在url中,请求找到的代码位于()中 b函数,用于在com/ub/main/d/e.class中生成signed函数 最后添加符号值以发送请求 3.可以反编译他的符号计算方法,或直接调用b函数生成符号值,后来发现app会自动采取时间戳,我们不需要给他数组类型参数 直接调用a函数,给orderId给他,让他直接返回一个值,就好了,上面有js代码 4.自动批处理 看看代码
在fuzz uid之后直接构造一个类,将信号的值提取到post数据中。 可以生成的post请求与捕获的数据包的请求完全相同,但测试不成功。分析的原因可能是订单ID绑定到用户的id。 但是,我学会了如何通过frida分析应用程序。 复杂参数的hook 如果函数的参数类型是array,map或ArrayList类型,则首先将目标MyClass类的fun1函数声明如下:
解: 使用Xposed本身提供的XposedHelpers的findClass方法加载每个类,然后将结果类作为参数传递给钩子函数! 具体实现可以参考链接,Daniel非常清楚地说。 参考链接: https://xianzhi.aliyun.com/forum/read/611.html http://www.freebuf.com/articles/terminal/56453.html http://bbs.pediy.com/showthread.php?t=202147&page=2 [注:本文为“小米安全中心”原作者:ECHO 小米安全中心安全脉冲结算账号发布]