[转载] Android.Hook框架xposed开发篇
本文转载自: http://www.52pojie.cn/thread-396793-1-1.html
<?xml version="1.0"encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"package="de.robv.android.xposed.mods.tutorial"android:versionCode="1"android:versionName="1.0" ><uses-sdk android:minSdkVersion="15" /><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name" ><meta-dataandroid:name="xposedmodule"android:value="true" /><meta-dataandroid:name="xposeddescription"android:value="Easy example" /><meta-dataandroid:name="xposedminversion"android:value="54" /></application></manifest>
packagede.robv.android.xposed.mods.tutorial;importde.robv.android.xposed.IXposedHookLoadPackage;importde.robv.android.xposed.XposedBridge;importde.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;publicclassTutorial implementsIXposedHookLoadPackage{publicvoidhandleLoadPackage(finalLoadPackageParam lpparam)throwsThrowable {XposedBridge.log("Loaded app: "+ lpparam.packageName);}}
packagede.robv.android.xposed.mods.tutorial;importstaticde.robv.android.xposed.XposedHelpers.findAndHookMethod;importde.robv.android.xposed.IXposedHookLoadPackage;importde.robv.android.xposed.XC\_MethodHook;importde.robv.android.xposed.callbacks.XC\_LoadPackage.LoadPackageParam;publicclassTutorialimplementsIXposedHookLoadPackage {publicvoidhandleLoadPackage(finalLoadPackageParam lpparam) throwsThrowable {if(!lpparam.packageName.equals("com.android.systemui")) return;findAndHookMethod("com.android.systemui.statusbar.policy.Clock",lpparam.classLoader, "updateClock", newXC_MethodHook() {@OverrideprotectedvoidbeforeHookedMethod(MethodHookParam param) throwsThrowable {// this will be called beforethe clock was updated by the original method}@OverrideprotectedvoIDAfterHookedMethod(MethodHookParam param) throwsThrowable {// this will be called afterthe clock was updated by the original method}});}}
IXposedHookLoadPackage
publicclassXposedInterfaceimplementsIXposedHookLoadPackage {publicvoidhandleLoadPackage(finalLoadPackageParamlpparam) throwsThrowable {XposedBridge.log("Kevin-Loaded app:"+ lpparam.packageName); }}参数说明|final LoadPackageParam lpparam 这个参数包含了加载的应用程序的一些基本信息。XposedHelpersfindAndHookMethod ;这是一个辅助方法,可以通过如下方式静态导入:importstaticde.robv.android.xposed.XposedHelpers.findAndHookMethod;使用示例findAndHookMethod("com.android.systemui.statusbar.policy.Clock",lpparam.classLoader, "handleUpdateClock", newXC_MethodHook() {@OverrideprotectedvoidbeforeHookedMethod(MethodHookParamparam) throwsThrowable {// this will be called before the clock wasupdated by the original method }@OverrideprotectedvoidafterHookedMethod(MethodHookParamparam) throwsThrowable {// this will be called after the clock wasupdated by the original method }});
findAndHookMethod(Class<?>clazz, //需要Hook的类名ClassLoader, //类加载器,可以设置为 nullString methodName, //需要 Hook 的方法名Object... parameterTypesAndCallback该函数的最后一个参数集,包含了:(1)Hook 的目标方法的参数,譬如:"com.android.internal.policy.impl.PhoneWindow.DecorView"是方法的参数的类。(2)回调方法:a.XC_MethodHookb.XC_MethodReplacement
findAndHookMethod("android.app.Application",lpparam.classLoader, "onCreate", newXC_MethodHook() {@OverrideprotectedvoidbeforeHookedMethod(MethodHookParam param) throwsThrowable {Context context = (Context) param.thisObject;IntentFilter filter = newIntentFilter(myCast.myAction);filter.addAction(myCast.myCmd);context.registerReceiver(newmyCast(), filter);}@OverrideprotectedvoidafterHookedMethod(MethodHookParam param) throwsThrowable {super.afterHookedMethod(param);}});
String appClassName = this.getAppInfo().className;if(appClassName == null) {Method hookOncreateMethod = null;try{hookOncreateMethod =Application.class.getDeclaredMethod("onCreate", newClass[] {});} catch(NoSuchMethodException e) {e.printStackTrace();}hookhelper.hookMethod(hookOncreateMethod, newApplicationOnCreateHook());6.排除系统 app,排除自身,确定主线程if(lpparam.appInfo == null||(lpparam.appInfo.flags &(ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) !=0){return;}elseif(lpparam.isFirstApplication &&!ZJDROID_PACKAGENAME.equals(lpparam.packageName)){
Only methods and constructors can behooked,Cannot hook interfaces,Cannot hook abstractmethods
publicvoidmyMethod(String a, MyClass b)
Class<?> hookMessageListenerClass =null;hookMessageListenerClass =lpparam.classLoader.loadClass("org.jivesoftware.smack.MessageListener");findAndHookMethod("org.jivesoftware.smack.ChatManager",lpparam.classLoader, "createChat", String.class, hookMessageListenerClass,newXC_MethodHook() {@OverrideprotectedvoidbeforeHookedMethod(MethodHookParam param) throwsThrowable {String sendTo = (String) param.args[0];Log.i(tag , "sendTo : + "+ sendTo );}@OverrideprotectedvoidafterHookedMethod(MethodHookParam param) throwsThrowable {super.afterHookedMethod(param);}});
publicOutputStream getOutputStream() throwsIOException {thrownewUnknownServiceException("protocol doesn't supportoutput");}org.apache.http.impl.client.AbstractHttpClientextendsCloseableHttpClient ,方法在父类(注意,android的继承的 AbstractHttpClient implements org.apache.http.client.HttpClient)publicCloseableHttpResponse execute(finalHttpHost target,finalHttpRequest request,finalHttpContext context) throwsIOException, ClientProtocolException {returndoExecute(target, request, context);}
publicstaticXC_MethodHook.UnhookfindAndHookConstructor(String className, ClassLoader classLoader, Object...parameterTypesAndCallback) {returnfindAndHookConstructor(findClass(className, classLoader),parameterTypesAndCallback);}
Method executeRequest =RefInvoke.findMethodExact("org.apache.http.impl.client.AbstractHttpClient",ClassLoader.getSystemClassLoader(),"execute", HttpHost.class, HttpRequest.class,HttpContext.class);hookhelper.hookMethod(executeRequest, newAbstractBahaviorHookCallBack(){@OverridepublicvoiddescParam(HookParam param) {// TODO Auto-generated method stubLogger.log_behavior("Apache Connect to URL ->");HttpHost host = (HttpHost) param.args[0];HttpRequest request = (HttpRequest) param.args[1];if(request instanceoforg.apache.http.client.methods.HttpGet) {org.apache.http.client.methods.HttpGet httpGet =(org.apache.http.client.methods.HttpGet) request;Logger.log_behavior("HTTP Method : "+ httpGet.getMethod());Logger.log_behavior("HTTP GET URL : "+httpGet.getURI().toString());Header[] headers = request.getAllHeaders();if(headers != null) {for(inti = 0; i < headers.length;i++) {Logger.log_behavior(headers.getName() + ":"+headers.getName());}}} elseif(request instanceofHttpPost) {HttpPost httpPost = (HttpPost) request;Logger.log_behavior("HTTP Method : "+ httpPost.getMethod());Logger.log_behavior("HTTP URL : "+httpPost.getURI().toString());Header[] headers = request.getAllHeaders();if(headers != null) {for(inti = 0; i <headers.length; i++) {Logger.log_behavior(headers.getName() + ":"+headers.getValue());}}HttpEntity entity = httpPost.getEntity();String contentType = null;if(entity.getContentType() != null) {contentType =entity.getContentType().getValue();if(URLEncodedUtils.CONTENT_TYPE.equals(contentType)) {try{byte[] data =newbyte[(int) entity.getContentLength()];entity.getContent().read(data);String content =newString(data, HTTP.DEFAULT_CONTENT_CHARSET);Logger.log_behavior("HTTP POST Content : "+ content);}catch(IllegalStateException e) {// TODO Auto-generatedcatch blocke.printStackTrace();} catch(IOException e) {// TODO Auto-generatedcatch blocke.printStackTrace();}}elseif(contentType.startsWith(HTTP.DEFAULT_CONTENT_TYPE)) {try{byte[] data =newbyte[(int) entity.getContentLength()];entity.getContent().read(data);String content =newString(data, contentType.substring(contentType.lastIndexOf("=") +1));Logger.log_behavior("HTTP POST Content : "+ content);}catch(IllegalStateException e) {// TODO Auto-generatedcatch blocke.printStackTrace();} catch(IOException e) {// TODO Auto-generatedcatch blocke.printStackTrace();}}}else{byte[] data = newbyte[(int)entity.getContentLength()];try{entity.getContent().read(data);String content =newString(data, HTTP.DEFAULT_CONTENT_CHARSET);Logger.log_behavior("HTTP POST Content : "+ content);} catch(IllegalStateException e){// TODO Auto-generatedcatch blocke.printStackTrace();} catch(IOException e) {// TODO Auto-generatedcatch blocke.printStackTrace();}}}}@OverridepublicvoidafterHookedMethod(HookParam param) {// TODO Auto-generated method stubsuper.afterHookedMethod(param);HttpResponse resp = (HttpResponse) param.getResult();if(resp != null) {Logger.log_behavior("Status Code = "+resp.getStatusLine().getStatusCode());Header[] headers = resp.getAllHeaders();if(headers != null) {for(inti = 0; i <headers.length; i++) {Logger.log_behavior(headers.getName() + ":"+headers.getValue());}}}}});对 HttpURLConnection 的 hook Zjdroid 未能提供完美的解决方案,想要取得除了 URL 之外的 data 字段必须对I/O流操作.Method openConnectionMethod =RefInvoke.findMethodExact("java.net.URL",ClassLoader.getSystemClassLoader(), "openConnection");hookhelper.hookMethod(openConnectionMethod,newAbstractBahaviorHookCallBack() {@OverridepublicvoiddescParam(HookParam param) {// TODO Auto-generated method stubURL url = (URL) param.thisObject;Logger.log_behavior("Connect to URL ->");Logger.log_behavior("The URL = "+ url.toString());}});
findAndHookMethod("java.io.PrintWriter",lpparam.classLoader, "print",String.class, newXC_MethodHook() {@OverrideprotectedvoidbeforeHookedMethod(MethodHookParam param) throwsThrowable {String print = (String) param.args[0];Pattern pattern = Pattern.compile("(\\w+=.*)");Matcher matcher = pattern.matcher(print);if(matcher.matches())Log.i(tag+lpparam.packageName,"data : "+ print);//Log.d(tag,"A :" + print);}});
else{HttpEntityEnclosingRequestBase httpGet =(HttpEntityEnclosingRequestBase) request;HttpEntity entity =httpGet.getEntity();Logger.log_behavior("HttpRequestBase URL : "+httpGet.getURI().toString());Header[] headers =request.getAllHeaders();if(headers != null) {for(inti = 0; i <headers.length; i++) {Logger.log_behavior(headers.getName() + ":"+headers.getName());}}if(entity!= null){try{String content = EntityUtils.toString(entity);Logger.log_behavior("HTTP entity Content : "+content);}catch(IllegalStateException e) {// TODOAuto-generated catch blocke.printStackTrace();}catch(IOException e) {// TODO Auto-generated catchblocke.printStackTrace();}}
[转载] Android.Hook框架xposed开发篇的更多相关文章
- 【转】Android Hook框架Xposed详解
1 Introduction 1.1 概述 Xposed 是 GitHUB 上 rovo89 大大设计的一个针对 Android 平台的动态劫持项目,通过替换 /system/bin/app_pro ...
- Android Hook框架Xposed详解
1 Introduction 1.1 概述 Xposed 是 GitHUB 上 rovo89 大大设计的一个针对 Android 平台的动态劫持项目,通过替换 /system/bin/app_pro ...
- android hook 框架 xposed 如何实现挂钩
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- android hook 框架 xposed 如何实现注入
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- android hook 框架 ADBI 如何实现dalvik函数挂钩
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- android hook 框架 libinject2 如何实现so注入
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- android hook 框架 libinject2 简介、编译、运行
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- Android网络框架Volley(体验篇)
Volley是Google I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库,如: android-async-http retrofit okhttp ...
- Android网络框架Volley(实战篇)
之前讲了ym—— Android网络框架Volley(体验篇),大家应该了解了volley的使用,接下来我们要看看如何把volley使用到实战项目里面,我们先考虑下一些问题: 从上一篇来看 mQu ...
随机推荐
- java 压缩文件 传入文件数组,压缩文件,在指定路径下生成指定文件名的压缩文件
/** * 传入文件数组,压缩文件,在指定路径下生成指定文件名的压缩文件 * * @param files * 文件数组 * @param strZipName * 压缩文件路径及文件名 * @thr ...
- Bean的定义及作用域的注解实现
1. Classpath扫描与组件管理 从Spring3.0开始,Spring JavaConfig项目提供了很多特性,包括使用java而不是XML定义bean. 比如@configuration, ...
- TeleportStone.lua --传送宝石
--[[作者信息: 超级炉石 (Teleport stone) 作者QQ:247321453 作者Email:247321453@qq.com 修改日期:2014-3-12 功能:除了传送,还有召唤N ...
- api接口签名验证(MD5)
不要急,源代码分享在最底部,先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候, ...
- WTL编程小技巧汇编
1.设置窗体生成大小并中央显示窗口 2.设置窗体最大/小尺寸 3.动态设置窗体标题 4.设置对话框的字体和背景颜色 5.设置窗体控件默认字体 以下技巧可应用于SDI和MDI程序: 1.设置窗体生成大小 ...
- SSIS 部署到SQL Job
微软 BI 系列随笔 - SSIS 基础 - 部署SQL Job 简介 在之前博客中,讲述了如何实现SSIS的项目部署以及利用SSIS的参数与环境加速部署,参见 微软 BI 系列随笔 - SSIS 基 ...
- bzoj1513: [POI2006]Tet-Tetris 3D
Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维的版本, 在里面很多立方体落在平面板,一个立方体开始落下直到碰上一 ...
- SQL Server 2012 创建数据库快照
不是所有的MSSQL数据库版本都支持数据库快照,只有Enterprise版本的才支持. 在其他版本上,以Business Intelligence Edition版本为例,创建快照时,会报如下错误 消 ...
- JS运动从入门到精髓!哈哈
首先来看最基础的运动:单个物体向右匀速运动到某一点停止 例子:一个按钮,一个div,点击按钮,让div向右运动到某一个位置暂停 // 原理: 1 获取物体当前的位置 oDiv.offsetl ...
- java内存溢出分析(二)
我们继续java内存溢出分析(一)的分析,点击Details>按钮,显示如下图,我们发现有一个对象数量达到280370216个,再点击其中的List objects 点击后,显示下图 至此,我们 ...