-
xposed开发jar包
2017-04-24 12:25:51xposed开发jar包 -
Xposed开发初体验
2017-10-12 17:24:52本篇文章具体是Xposed开发,如何安装Xposed需自行上网查找,本文同步更新于旺仔的个人博客,访问可能有点慢,多刷新几次。Xposed什么是Xposed呢? “Xposed是一个适用于Android的框架。基于这个框架开发的模块可以...本篇文章具体是Xposed开发,如何安装Xposed需自行上网查找,本文同步更新于旺仔的个人博客,访问可能有点慢,多刷新几次。
Xposed
什么是Xposed呢?
“Xposed是一个适用于Android的框架。基于这个框架开发的模块可以改变系统和app应用的行为,而不需要修改APK。这是一个很棒的特性,意味着Xposed模块可以不经过任何修改,安装在各种不同的ROM上。Xposed模块可以很容易的开启和关闭。你只需要激活或者禁用Xposed模块,然后重启手机即可。”
很好理解,就是替换了/system/bin/app_process可执行文件,在启动Zygote时加载额外的jar文件(XposedBridge.jar),并执行一些初始化操作(执行XposedBridge的main方法),从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持,然后我们就可以在这个Zygote上下文中进行某些hook操作。
前提
安装Xposed的前提是手机必须root,所以没有root手机的,就不用往下看了。
开发Xposed项目
介绍完Xposed,那么接下来我们来开发Xposed的项目。
创建AS项目
使用Android Studio创建一个新的项目,具体内容就不详细说了,基本都会创建项目的。
导入Xposed的api库
要使用Xposed的东西,就必须导入相对应的api库,
导入jar包
首先我们需要下载对应的jar包,然后导入到项目中的Libs文件夹里面,下载api-82-sources.jar,api-82.jar
注意这里要将
compile
改为provided
,原因是Xposed里已有该jar包内容,再次打包进去会冲突,所以要改为provided
。同时也要将
compile fileTree(include: ['*.jar'], dir: 'libs')
也改为provided
,如果不修改的话,就会导致handleLoadPackage没有回调。Provided是对所有的build type以及favlors只在编译时使用,类似eclipse中的external-libs,只参与编译,不打包到最终apk。
gradle
当然也可以用gradle导入Xposed,同样将
compile
改为provided
dependencies { provided fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' provided 'de.robv.android.xposed:api:82' }
声明Xposed模块
创建Xposed项目后,还需要在
AndroidMenafest.xml
文件里面声明Xposed模块,在application
里面添加三个meta-data
标签(xposedmodule、xposeddescription、xposedminversion)。<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <meta-data android:name="xposedmodule" android:value="true"/> <meta-data android:name="xposeddescription" android:value="Hook log test"/> <meta-data android:name="xposedminversion" android:value="53"/> </application>
xposedmodule
表示作为Xposed的一个模块
xposeddescription
表示对本模块的描述,该描述会显示在安装好后的程序名称下方
xposedminversion
表示jar包的最低版本号
创建hook类
我们新建一个类,类名随意,然后实现
IXposedHookLoadPackage
接口,并且重写handleLoadPackage
方法,里面就是我们要具体操作的地方。package top.jowanxu.xposedtest; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.callbacks.XC_LoadPackage; public class Tutorial implements IXposedHookLoadPackage { @Override public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { XposedBridge.log("=========Loaded app: " + lpparam.packageName); } }
声明类的入口
创建完我们hook类之后,我们需要将该类加载到XposedInstaller中,也就是我们必须声明该类的位置,需要在xposed_init中声明。
xposed_init文件
创建assests文件夹
然后在里面新建一个文件,文件名为
xposed_init
,没有后缀,然后在里面写入我们刚刚创建的类的完整类名,运行
搞完上面的步骤之后,我们直接run起来,程序跑起来之后,Xposed会提示是否激活
我们可以在Xposed里面看到我们的我们刚刚创建的项目
打勾,然后重启
重启之后然后打开Xposed的日志,点击保存
然后导出到电脑,搜索一下,就能找到我们自己打印的内容了
结语
通过上面的例子我们可以很容易的通过Xposed来对app进行修改,所以使用Xposed需谨慎,不要乱下载一些有后台的模块,指不定那天就把你的帐号密码给泄露出去了。
-
xposed开发9 - 判断xposed是否安装, 模块是否激活
2019-04-23 09:49:13xposed开发9 - 判断xposed是否安装, 模块是否激活 1.判断xposed的package是否存在 public class AppUtils { public static final String PACKAGE_NAME_XPOSED = "de.robv.android.xposed.installer"; public ...xposed开发9 - 判断xposed是否安装, 模块是否激活
1.判断xposed的package是否存在
public class AppUtils { public static final String PACKAGE_NAME_XPOSED = "de.robv.android.xposed.installer"; public static String getAppVersionName(Context context, String packageName) { PackageManager packageManager = context.getPackageManager(); List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0); for (PackageInfo packageInfo : packageInfos) { if (packageInfo.packageName.equals(packageName)) { return packageInfo.versionName; } } return ""; } public static boolean isModuleActive() { return false; } } public class StringUtils { public static boolean isEmpty(final CharSequence s) { return s == null || s.length() == 0; } }
2.添加判断安装和激活的方法
public class AppInfo { private boolean mIsXposedInstall; private String mXposedVersionName; private static volatile AppInfo mInstance = null; private AppInfo() { } public static AppInfo getInstance() { if (mInstance == null) { synchronized (AppInfo.class) { if (mInstance == null) { mInstance = new AppInfo(); } } } return mInstance; } public void ValidateEnvironment(Context context) { mXposedVersionName = AppUtils.getAppVersionName(context, AppUtils.PACKAGE_NAME_XPOSED); mIsXposedInstall = !StringUtils.isEmpty(getmXposedVersionName()); } public boolean isXposedActive() { return AppUtils.isModuleActive(); } public boolean ismIsXposedInstall() { return mIsXposedInstall; } public void setmIsXposedInstall(boolean xposedInstall) { mIsXposedInstall = xposedInstall; } public String getmXposedVersionName() { return mXposedVersionName; } public void setmXposedVersionName(String xposedVersionName) { mXposedVersionName = xposedVersionName; } }
3.在MainActivity调用
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AppInfo.getInstance().ValidateEnvironment(this); AppInfo appInfo = AppInfo.getInstance(); boolean isInstall = appInfo.ismIsXposedInstall(); boolean isActive = appInfo.isXposedActive(); String xposedVersionName = appInfo.getmXposedVersionName(); String msg = (isInstall ? xposedVersionName : "未安装") + " " + (isActive ? "已激活" : "未激活"); Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); }
这时候运行, 会提示已安装, 但是还没激活, 需要在MainHook里设置isModuleActive的回调
4.在MainHook里hook
String WECHATMODULE_PACKAGE_NAME = "com.example.wechatmodule"; // hook模块是否激活 if (lpparam.packageName.equals(WECHATMODULE_PACKAGE_NAME)) { Class<?> classAppUtils = XposedHelpers.findClassIfExists(WECHATMODULE_PACKAGE_NAME + ".utils.AppUtils", lpparam.classLoader); if (classAppUtils != null) { XposedHelpers.findAndHookMethod(classAppUtils, "isModuleActive", XC_MethodReplacement.returnConstant(true)); XposedBridge.log("成功hook住WechatModule的isModuleActive方法."); } }
-
xposed开发1 -环境搭建
2019-04-18 15:50:31VirtualXposed开发1 1.安装 git clone https://github.com/android-hacker/VirtualXposed.git cd VirtualXposed git submodule update --init --recursive 使用android studio打开运行, 就安装成功了. 默认安装了...xposed开发1 -环境搭建
1.安装
git clone https://github.com/android-hacker/VirtualXposed.git cd VirtualXposed git submodule update --init --recursive
使用android studio打开运行, 就安装成功了.
默认安装了xposed
2.设置安装默认apk
需要修改NewHomeActivity.java, 把需要安装的apk放在跟XposedInstaller_3.1.5.apk_同一个目录(就是assets里), 然后添加遍历assets目录的方法, 最后安装apk.
// 添加遍历assets目录并安装的方法 private void installApks(String name) { ProgressDialog dialog = new ProgressDialog(this); dialog.setCancelable(false); dialog.setMessage("Loading " + name); dialog.show(); VUiKit.defer().when(() -> { File installerApk = getFileStreamPath(name + ".apk"); if (!installerApk.exists()) { InputStream input = null; OutputStream output = null; try { input = getApplicationContext().getAssets().open(name); output = new FileOutputStream(installerApk); byte[] buffer = new byte[1024]; int length; while ((length = input.read(buffer)) > 0) { output.write(buffer, 0, length); } } catch (Throwable e) { VLog.e(TAG, "copy file error", e); } finally { FileUtils.closeQuietly(input); FileUtils.closeQuietly(output); } } if (installerApk.isFile() && !DeviceUtil.isMeizuBelowN()) { try { VirtualCore.get().installPackage(installerApk.getPath(), InstallStrategy.TERMINATE_IF_EXIST); } catch (Throwable ignored) { } } }).then((v) -> { dismissDialog(dialog); mUiHandler.sendEmptyMessageDelayed(2, 500); }).fail((err) -> { dismissDialog(dialog); mUiHandler.sendEmptyMessageDelayed(2, 500); }); } private List<String> names; private void initNames() { names = new ArrayList<>(); try { boolean isXposedInstalled = VirtualCore.get().isAppInstalled(XPOSED_INSTALLER_PACKAGE); if (!isXposedInstalled) { for (String s : getAssets().list("")) { names.add(s); } } } catch (IOException e) { Toast.makeText(this, "Init error!", Toast.LENGTH_SHORT).show(); } } // 重写获取mUiHandler方法 private Handler getmUiHandler() { return new Handler(getMainLooper()) { @Override public void handleMessage(Message msg) { if (msg.what == 1) { if (names.size() > 0) { installApks(names.get(0)); } } if (msg.what == 2) { if (names.size() > 0) { names.remove(0); sendEmptyMessage(1); } } } }; }
替换原来mUiHandler初始化的方法
mUiHandler = getmUiHandler(); initNames(); // 注释原来installXposed的方法 if (checkXposedInstaller) { checkXposedInstaller = false; // installXposed(); mUiHandler.sendEmptyMessage(1); }
重新运行, 这时候除了XposedInstaller还安装了你放在该目录里的其他apk
不会android开发直接搞xposed确实够呛, 慢慢来, 把过程都记录好, ?
下篇写怎样hook, 一边google一边学, 网上资料确实少或者很多过时的, 还是ios逆向简单? -
xposed开发2 - 插件编写
2019-04-18 18:59:45VirtualXposed开发2 为什么使用VirtualXposed不用Xposed? 因为需要root, 还要每次重启手机, 那部破小米试了半天没root成功, 直接放弃了. xpose教程, 在网上找到这个教程, 下面实践一遍. 1.创建模块 建一个空的...xposed开发2 - 插件编写
为什么使用VirtualXposed不用Xposed?
因为需要root, 还要每次重启手机, 那部破小米试了半天没root成功, 直接放弃了.xpose教程, 在网上找到这个教程, 下面实践一遍.
1.创建模块
建一个空的activity, 起名Xposed_Hook
运行, 然后使用VirualXposed添加模块进入, 打开模块是空的
打开AndroidManifest.xml, 添加xposed模块// 放在activity上面 <meta-data android:name="xposedmodule" android:value="true" /> <meta-data android:name="xposeddescription" android:value="这是一个xposed例子" /> <meta-data android:name="xposedminversion" android:value="53" />
重新运行安装, 重新添加到VirtualXposed, 这时候模块里就有了
2.配置XposedBridgeApi.jar
打开app/src/main/build.gradle, 添加
repositories { jcenter() } compileOnly 'de.robv.android.xposed:api:82' compileOnly 'de.robv.android.xposed:api:82:sources'
- 点击"sync now"
3.添加靶子
在界面上添加一个按钮, 按钮点击弹起toast
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Toast.makeText(MainActivity.this, toastMessage(), Toast.LENGTH_SHORT).show(); } }); } public String toastMessage() { return "I am not hooked"; }
4.实现hook操作
新建HookTest.java
public class HookTest implements IXposedHookLoadPackage { public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { if (loadPackageParam.packageName.equals("com.example.xposed_hook")) { XposedBridge.log("has hooked!"); Class clazz = loadPackageParam.classLoader.loadClass("com.example.xposed_hook.MainActivity"); XposedHelpers.findAndHookMethod(clazz, "toastMessage", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { param.setResult("You are hooked!"); } }); } } }
添加入口点
1.在main文件夹里新建assets文件夹;
2.在assets里新建xpose_init文件(text格式);
3.在xposed_init添加com.example.xposed_hook.HookTest;禁用 Instant Run
为什么禁用Instant Run?
可能是实现的原理有关,具体我也不知道,有一些神奇的库都不支持instant run;再运行再添加到VirtualXposed里, hook生效了
易用性来说, 跟ios的tweak和monkeydev比也是很简单的, 问题是怎样找到要hook的方法, 还有怎样debug, 这些下篇讲, 没有遇到特别繁琐的东西?
-
xposed开发12 - 微信运动
2019-04-23 16:31:57xposed开发12 - 微信运动 // 微信运动 hookClass = "android.hardware.SystemSensorManager$SensorEventQueu"; hookMethodName = "dispatchSensorEvent"; XposedHelpers.findAndHookMethod(hookClass, lpparam.... -
xposed开发11 - 微信红包
2019-04-23 15:02:57xposed开发11 - 微信红包 private static Activity launcherUIActivity = null; // 微信红包 hookClass = "com.tencent.wcdb.database.SQLiteDatabase"; hookMethodName = "insertWithOnConflict"; XposedHelpers.... -
xposed开发7 - 获取微信个人信息
2019-04-22 20:48:33xposed开发7 - 获取微信个人信息 Xposed获取微信个人信息 分析过程如上 // 获取微信个人信息 hookClass = "com.tencent.mm.ui.LauncherUI"; hookMethodName = "onCreate"; XposedHelpers.findAndHookMethod... -
xposed开发4 - 水了一篇
2019-04-18 21:34:20VirtualXposed开发5 本来想写个微信防撤回练下手的, VirtaulXposed竟然登录不了微信, 头大, 只能试支付宝了 -
xposed开发6 - 微信首页添加按钮
2019-04-22 20:21:24xposed开发6 - 微信首页添加按钮 [原创]Xposed__给微信加个按钮 原文章如上, 过程看了没看懂, 直接跑代码看效果 // 微信首页添加按钮 hookClass = "com.tencent.mm.ui.LauncherUI"; hookMethodName = ... -
xposed开发13 - 微信消息防撤回
2019-04-23 18:41:25xposed开发13 - 微信消息防撤回 try { val clazz = XposedHelpers.findClass("com.tencent.wcdb.database.SQLiteDatabase", lpparam.classLoader) XposedHelpers.findAndHookMethod(clazz, "updateWithOnConflict... -
xposed开发10 - 使用OkHttp网络请求
2019-04-23 10:28:30xposed开发10 - 使用OkHttp网络请求 1.build.gradle引入OkHttp // 网络请求框架 implementation 'com.squareup.okhttp3:okhttp:3.11.0' 2.添加OkHttpUtils单例 public class OkHttpUtils { private static final ... -
xposed开发3 - 试验使用kotin编写
2019-04-18 20:01:38VirtualXposed开发2 1.测试目标apk用kotlin写能不能hook fun click(view: View) { Toast.makeText(this, toastMessage(), Toast.LENGTH_SHORT).show() } fun toastMessage(): String { return "I am not hooked" ... -
Android Protect-0.Xposed开发教程(官方Helpers)
2019-01-08 22:19:11Xposed开发教程(官方Helpers) -
Android Protect-0.Xposed开发教程(官方Development tutorial)
2019-01-08 22:19:55Xposed开发教程(Development tutorial) -
Android Protect-0.Xposed开发教程(官方Replacing resources)
2019-01-08 22:19:32Xposed开发教程(官方Replacing resources) -
Xposed开发指南
2017-02-06 11:48:55转:... 一个修改系统的项目Xposed的工作原理 hook和取代一个方法 创建一个项目把这个项目Xposed化 AndroidManifest.xmlXposedBridgeApi.jarModule implementationassets/xpose -
xposed开发5-修改微信我的零钱的金额
2019-04-22 19:41:07VirtualXposed开发5-修改微信我的零钱的金额 终于在virtualxposed上安装好微信了. 1.找到零钱的界面. 进入adb adb shell 开发android微信零钱界面 dumpsys activity | grep mResumedActivity 找到对应的类 2.... -
xposed开发8- hook微信聊天消息数据库插入操作
2019-04-22 21:30:28xposed开发8- hook微信聊天消息数据库插入操作 // hook微信聊天消息数据库插入操作 hookClass = "com.tencent.wcdb.database.SQLiteDatabase"; hookMethodName = "insertWithOnConflict"; XposedHelpers.... -
Xposed开发入门笔记
2016-07-07 11:27:22主要参考:Xposed Module开发教程。这个教程清晰易懂,而且是用AS开发的,很实用。但是这个链接里面有关键的一步没有指出,后面再讨论。开发环境是Android Studio 1.5,运行环境是模拟器Android 4.1.1 - API 16。0. ... -
Android开发之Xposed开发注意事项
2017-12-20 23:46:33尽量使用Xposed自带的读取设置函数xpref -
基于Xposed开发微信云客服笔记
2019-03-21 16:40:49基于XPOSED模块开发了微信客服插件,通过WEB网页实现批量微信管理与营销,实现了微信云客服。 具体实现以下功能: 1、微信通讯录上报与管理 2、文字消息接收与发送 3、表情消息接收与发送 4、图片消息接收与发送... -
0积分 Xposed开发必备 api-82.jar
2020-10-20 16:17:42今天学习android hook,需要使用到api-82.jar,然而论坛上大部分资源都要积分 程序员何必为难程序员 0积分资源奉上 欢迎下载! -
Xposed开发浅谈探寻篇
2019-06-23 21:57:23Xposed作为一个著名的Hook框架,早已经在移动安全行业家喻户晓。今天写这篇文章主要也是想下手玩玩这个框架,至于框架的安装,虽然也会碰见很多问题,但是今天暂不附上教程,因为最近精力有限,等有时间我会附上安装... -
Xposed 开发教程(翻译自官方)
2021-01-01 16:28:55开发教程 好吧 …… 你打算学习怎么建立一个新的 Xposed 模块吗?那就读读这个教程(或者叫它 “泛谈” 也可以)并且学习怎么一步步地达成这个目标。这不仅包含了例如 “新建并插入” 的技术性内容,还包含了一些...
-
MMM 集群部署实现 MySQL 高可用和读写分离
-
伊顿穆勒.rar电气设备选型资料大全 (适合刚刚入行的电气工程师对设备进行选型规划)详解 报价
-
Cmake
-
基于对偶四元数的姿轨耦合动力学模型1.md
-
MySQL 多实例安装 及配置主从复制实验环境
-
文件操作所需Jar.zip
-
朱老师鸿蒙系列课程第1期-3.鸿蒙系统Harmonyos源码配置和管理
-
基于电商业务的全链路数据中台落地方案(全渠道、全环节、全流程)
-
清华大学历年考研复试机试真题 - 等差数列
-
龙芯生态应用开发基础:C语言精要
-
FTP 文件传输服务
-
Codeforces Round #704 (Div. 2) A-D题解
-
MaxScale 实现 MySQL 读写分离与负载均衡
-
2021年 系统架构设计师 系列课
-
PAT甲级-排序类型-1016 Phone Bills解题思路
-
2021-03-02
-
VMware vSphere ESXi 7 精讲/VCSA/VSAN
-
MySQL 触发器
-
用php获取header头信息
-
2013-2020矩阵代数往年试题.zip