0前言xposed框架xposed,主页:http://repo.xposed.info/module/de.robv.android.xposed.installer是一个开源框架,源代码在github是的,直接下载apk,安装激活后就可以使用了。很多地方都有这方面的教程。针对不同的手机架构,大牛进行了有针对性的修改。可以在论坛搜索通过替换/system/bin/app_process程序来控制zygote进程,使app_process在启动时加载XposedBridge.jarjar包,从而完成对Zyg??ote进程和Dalvik虚拟机的劫持它创建。Xposed在开启时完成对所有HookFunction的劫持,并在原Function执行前后添加自定义代码。很多人用这个框架来实现android的私有化和定制化。事实上,这个框架在android安全测试中提供了很大的便利。Xposed主要是方法的钩子。以往的重新打包技术,需要修改smali代码,修改起来比较麻烦。使用xposed框架,可以轻松获取android应用中的加密私钥、salt值等信息,无需编译获取密钥转换算法,无需了解密钥存储机制,直接hook函数,并获得输入输出罐。原理在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机制来覆盖内置的方法。有能力的可以分析xposed的源码。不得不说,作者对android和java的机制理解很深刻。举个简单的例子,很简单的android登录代码:判断用户输入的用户名和密码是否正确,非常简单。这里简单演示一下,hook用户输入的用户名和密码信息,不管正确与否。简单说说xposed模块开发,首先需要导入api。详情请参考:https://github.com/rovo89/XposedBridge/wiki/Using-the-Xposed-Framework-API在manifest中定义并声明这是一个xposed模块,名称为hooktest和useapi版本号82创建运行时钩子代码:看代码中的注释,主要是三个方法handleLoadPackage的调用,主要是获取android包的相关信息,这里因为只是针对logintest钩子,做一个简单的判断。findAndHookMethod是主要的钩子入口。里面的几个参数分别是包名、类加载器、钩子函数名、参数类型(这个比较容易出错,比如列表类型写成List.class),回调函数中回调函数比较重要:beforeHookedMethod和afterHookedMethod,一个是在函数运行前劫持,一个是hook后释放。示例中将用户输入的字段劫持并打印出来,后面将参数修改为正确的登录用户名和密码。这样,在应用程序中输入任何字符都可以。可以登录成功FridaHook框架Frida是一个基于python+javascript的hook框架,秒杀android\ios\linux\win\osx等各种平台。因为是基于脚本交互,所以比xposed和substracecydia方便。本文重点介绍Frida在android下的使用。Frida的官网是:http://www.frida.re/Frida的安装和安装非常简单。在PC端直接执行pipinstallfrida即可在Android设备上导入fridaserver。需要root手机才能运行frida-server:在电脑上运行adbforwardtcpforwarding:27042端口用于和frida-server通信,后面的每个端口对应每个注入的进程。运行如下命令验证是否安装成功:$frida-ps-R正常情况下应该输出进程列表如下:钩子模块编写钩子的主要模块是js写的,使用javascriptapi来与服务器通信。下面是一个简单的例子结合一个真实的例子首先是测试代码:反编译获取app中的核心功能。对于上面的js代码,其实是调用了app中的某个函数,比如符号值生成函数,加解密函数,不需要单独分析算法过程,分析key值在哪里,直接调用应用相应的功能,让应用为我们完成这些任务。我们这里分析的APP是优宝,一款饮料自动售货机。那时候取包裹和取货的时候只有一个orderid。猜测是否遍历了订单的id。如果支付成功但订单未被取走,则不会会响应请求并自行掉货。以下是有宝的订单分析过程1.抓取支付订单成功链接分析:sign为验证值,主要用于防止订单伪造,orderid为生成的支付订单id,主要用于防止伪造2.仿冒编译优宝app,找到morder/shipping所在的包:com/ub/main/d/e.class其中localStringBuffer存放url中的参数信息,request找到的code在a中()togeneratethesignaturefunctioninthebfunctionincom/ub/main/d/e.class***addthesignvalueandsendarequest3.可以反编译他的sign计算方法,也可以直接调用b函数生成sign值,后来发现app会自动取时间戳,所以我们不用直接用数组参数调用a函数,给他orderId,让他直接返回一个值,就会有上面的js代码4.自动批处理看代码构造一个类,然后直接fuzzuid,提取里面的sign值,拼接成post数据。可以生成的post请求和抓包数据包请求完全一致,但是测试不成功。分析原因可能是orderid绑定了userid。但是我通过frida学会了如何分析app。对于复杂参数的hook,如果函数的参数类型是array、map、ArrayList类型,首先针对MyClass类的fun1函数,声明如下:解决方法:使用Xposed自己提供的XposedHelpers的findClass方法加载每个类,然后将获取到的类作为参数传递给钩子函数!具体实现可以参考链接,大牛解释的很清楚。参考链接https://xianzhi.aliyun.com/forum/read/611.htmlhttp://www.freebuf.com/articles/terminal/56453.htmlhttp://bbs.pediy.com/showthread.php?t=202147&页=2
