[转载] 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 ...
随机推荐
- [HNOI2008],[bzoj1008] 越狱(dp+组合数学)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1008 Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人 ...
- [原创]cocos2d-x研习录-第一阶 背景介绍 之 cocos2d-x特点
上一节了解Cocos2D家族史,本节关注Cocos2D家庭的一个重要分支Cocos2D-x.Cocos2D-x是Cocos2D的C++移植版本,它的最大特性是跨平台,使开发者编写一套C++代码 ...
- django 过滤器 、日期格式化参数
http://blog.csdn.net/xyp84/article/details/7945094 django1.4 html页面从数据库中读出DateTimeField字段时,显示的时间格式和数 ...
- HSDB
select t from java.lang.Thread t $JAVA_HOME/bin/java -classpath $JAVA_HOME/lib/sa-jdi.jar sun.jvm.ho ...
- .NET垃圾回收:非托管资源,IDispose和析构函数的结合
http://blog.jobbole.com/85436/ 原文出处: 田小计划 欢迎分享原创到伯乐头条 前面一篇文章介绍了垃圾回收的基本工作原理,垃圾回收器并不是可以管理内存中的所有资源.对于 ...
- ajax请求后弹开新页面被浏览器拦截
window.open()我想应该很多人都不陌生吧,它可以实现除用a标签以外来实现打开新窗口! 最近开发项目用到时,却遇到了麻烦,本来好好的弹出窗口,结果被浏览器无情的给拦截了! 代码如下: $.ge ...
- VS2013添加解决方案内项目的引用,编译时提示找不到文件
1.添加解决方案内项目引用 2.编译时报错 原因: 要引用的程序集的Framework版本与当前项目的版本不一致. 解决: 统一引用与被引用程序集的版本.
- 【uTenux实验】内存池管理(固定内存池和可变内存池)
1.固定内存池管理实验 内存管理是操作系统的一个基础功能.uTenux的内存池管理函数提供了基于软件的内存池管理和内存块分配管理.uTenux的内存池有固定大小的内存池和大小可变的内存池之分,它们被看 ...
- java基础要点
Java语言是现在比较常用的编程语言,因为Java语言可以编写桌用程序,也可以编写web程序,还能编写嵌入式程序.这是由于相比脚本语言,Java 的运行速度要快.而对于底层语言,Java与平台无关,可 ...
- X5 内核浏览器对json格式支持的一个小区别
var json1 = { "data": [{ "type": "pic", "filename": "P6 ...