[转载] 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 ...
随机推荐
- Qt 自定义 滚动条 样式
今天是时候把软件中的进度条给美化美化了,最初的想法就是仿照QQ. 先前的进度条是这样,默认的总是很难受欢迎的:美化之后的是这样,怎么样?稍微好看一点点了吧,最后告诉你实现这个简单的效果在Qt只需要加几 ...
- list control失去焦点后,仍然蓝色高亮度显示
void CReaProSet::OnNMKillfocusReaprolist(NMHDR *pNMHDR, LRESULT *pResult)//指示控件已经失去焦点 { // TODO: 在此 ...
- windows github 命令行使用
1.下载git客户端工具,以下2个网站一样的https://git-for-windows.github.io/https://git-scm.com/download/win/ 2.初始化ssh-k ...
- IE 11 保护模式害惨了我
花了几乎两天,一直用IE, 就说好好的 动态域名 为什么一直不能访问.用其它浏览器一试,我哭了,都是好的.
- <script>标签应该放到</body>标签之前
著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:贺师俊 链接:http://www.zhihu.com/question/20027966/answer/13727164 ...
- JUQERY 获取同名称的所有CHECKBOX ,获取已经选择的,并且jquery进行勾选!
var @(Perfix)_CheckArray=[]; @(Perfix)_CheckArray.length=0; var checkedItems = $('input[name="@ ...
- 【java】之读取InputStream流
如这个文件 @Test public void test01() throws Exception{ InputStream in=new FileInputStream("c://test ...
- PHP安装所最到的问题-解决方案
Although Drupals 7+ run smoothly on PHP 5.3, Drupal 6 still feels much better with PHP 5.2. Even tho ...
- Longest Substring Without Repeating Characters -- LeetCode
原题链接: http://oj.leetcode.com/problems/longest-substring-without-repeating-characters/ 这道题用的方法是在LeetC ...
- 【学】CSS3的3D动画 ——3D旋转之骰子样式的钟表(2)上
这个是3D旋转的进阶版,是一个类似与骰子的正方体.这个版本只有秒数的个位数,还没有写整个钟表,下面那个版本好好想想该怎么写 这个效果需要用到transform-style: preserve-3d. ...