Android Studio 在MuMu模拟器上实现 xposed简单劫持
一、起因:
最近想实现模拟定位功能。目的是周游列国而不搞签证。然而,最开始使用的是android开发者模拟定位的方式,结果微信压根不鸟我。不过当时发型钉钉倒是可行。可惜的是,后来钉钉升级了版本后直接把打开这个做了限制。这种方法的模拟定位等于泡汤了。于是,在google搜索了一下有没有其他方法,最后发现xposed这个东西没准能行。于是开始折腾xposed之路。
二、分析:
xposed就不用说了,网上资料可以说多,也可以说少。这里我就不多说了,不过有个问题是我比较担忧的,因为我无法确定装了XposedInstaller后,我本人的android机子还能不能用,我的机子是vivo x27,系统是10.0版本的。于是就有了用mumu模拟器来开发的想法。
三、实施:
- 首先是给MuMu模拟器安装XposedInstaller这个apk,这里发张截图标明下MuMu的设置:
因为最开始我选的其实就是vivo的机型。
2. 安装apk
如图,从CSDN或者别的地方下载对应的apk。(连接地址可以从我的csdn下载中找到)
XposedBridgeApi-54&XposedInstaller_3.1.5.apk资源链接
给MuMu安装了XposedInstaller_3.1.5.apk如图:
(图中红框右边那个GPS修改器就是我最开始说的那个开发者模拟位置的apk)
3. 安装Xposed Installer,如图:
我这里可能是因为我已经安装过了,我是为了这个文章卸载了,重新安装,发现上面显示框架89已经激活。不过没有关系,点安装/更新就好。
等待一会。此时此刻,我表示,有钱的捧个钱场,没钱的找女朋友去减减肥什么的。
运动。。。。十分钟。。。。
好了,如图:
然后他会自动装,如图,装完重启就行
4、接下来用Android Studio新建一个空的工程。如图:
MainActivity.java里面的代码如下:
package com.cf.xposedhelloworld;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.google.android.material.bottomnavigation.BottomNavigationView;import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;public class MainActivity extends AppCompatActivity {private Button mLoginButton;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mLoginButton=(Button)findViewById(R.id.mLoginButton);mLoginButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, isCanShowContent("登陆","成功"), Toast.LENGTH_LONG).show();}});}public String isCanShowContent(String content1,String content2){String content=content1+"_"+content2;return content;}}
重要的是这个方法:isCanShowContent,这个方法是故意安排来做劫持的。
MainTest.java代码如下:
package com.cf.xposedhelloworld;import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;public class MainTest implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {// 将包名不是 com.example.login 的应用剔除掉if (!loadPackageParam.packageName.equals("com.cf.xposedhelloworld"))return;XposedBridge.log("Loaded app: " + loadPackageParam.packageName);XposedHelpers.findAndHookMethod("com.cf.xposedhelloworld.MainActivity", loadPackageParam.classLoader, "isCanShowContent", String.class,String.class, new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);XposedBridge.log("开始劫持了~");XposedBridge.log("参数1 = " + param.args[0]);XposedBridge.log("参数2 = " + param.args[1]);//打印堆栈查看调用关系StackTraceElement[] wodelogs = new Throwable("wodelog").getStackTrace();for (int i = 0; i < wodelogs.length; i++) {XposedBridge.log("查看堆栈:" + wodelogs[i].toString());}}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);XposedBridge.log("劫持结束了~");XposedBridge.log("参数1 = " + param.args[0]);XposedBridge.log("参数2 = " + param.args[1]);//获取类Class<?> clazz = param.thisObject.getClass();XposedBridge.log("要hook的方法所在的类:" + clazz.getName());// 输入框不为私有private可通过以下方式获取//Field field = clazz.getField("ed_pwd");// 通过类的字节码得到该类中声明的所有属性,无论私有或公有
// Field field = clazz.getDeclaredField("ed_pwd");
// // 设置访问权限
// field.setAccessible(true);
// EditText pwd = (EditText) field.get(param.thisObject);
// String str = pwd.getText().toString();
// XposedBridge.log("劫持到的密码:" + str);
// pwd.setText("123456");}});}
}
xposed_init文件(注意没有后缀)内容如下:
com.cf.xposedhelloworld.MainTest
就是我们看到的MainTest这个java类。
AndroidManifest.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.cf.xposedhelloworld"><applicationandroid: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-dataandroid:name="xposedmodule"android:value="true" /><!-- 模块描述 --><meta-dataandroid:name="xposeddescription"android:value="hello world" /><!-- 最低版本号 --><meta-dataandroid:name="xposedminversion"android:value="54" /><activityandroid:name=".MainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
注意模块描述等<meta-data…>
在libs里面有个jar包,如图:
这个在我上传的资源中能找到。
build.gradle(Module:app)内容如下:
apply plugin: 'com.android.application'android {compileSdkVersion 29buildToolsVersion "29.0.3"defaultConfig {applicationId "com.cf.xposedhelloworld"minSdkVersion 22targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}
}dependencies {compileOnly fileTree(include: ['*.jar'], dir: 'libs')implementation 'androidx.appcompat:appcompat:1.0.2'implementation 'com.google.android.material:material:1.0.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'implementation 'androidx.navigation:navigation-fragment:2.0.0'implementation 'androidx.navigation:navigation-ui:2.0.0'implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test.ext:junit:1.1.0'androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
// implementation files('lib/XposedBridgeApi-54.jar')
}
修改完同步一下。就好了。
接下来编译到MuMu上,如图,先连上MuMu
如果下拉里面没有可以看我之前的文章,对于MuMu可以用adb命令连接,在adb中输入命令:
adb connect 127.0.0.1:7555
连接成功后就能出现在可编译机器或者下拉里面。
如图:
打开xposedinstaller,点击左上角的菜单(就是那三个横杠咧)
一次执行这个步骤,然后重启一下如图:
运行Android Studio编译的那个XposedHelloWorld的app,点击按钮登陆。之后打开Xpose Installer,查看日志如图:
嗯。好像是按照我代码的逻辑走的。
四、总结:
- AndroidManifest.xml和xposed_init两个都是为了让xposed installer里面模块中有插件。
- MainTest.java里面这个类继承了IXposedHookLoadPackage,并实现了 public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {这个方法,XposedBridge.log是xposed 内部的打印,所以可以在日志中找到对应的堆栈和日志参数。
- build.gradle最后面注销了一行
// implementation files('lib/XposedBridgeApi-54.jar')
这个是因为会无法Xposed Hook操作,同样的修改了:compileOnly fileTree(include: ['*.jar'], dir: 'libs')
也是同样的原理。
五、后续:
接下来要深入的研究研究,争取早日把畅游列国不办签证的梦想实现了。
所以:
未完待续…
嘎吱…嘎吱…嘎吱…嘎吱…嘎吱…嘎吱…嘎吱…嘎吱…嘎吱…嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱嘎吱
喔…
我要去抽根烟了…
Android Studio 在MuMu模拟器上实现 xposed简单劫持相关推荐
- Android开发第一天——Android studio连接mumu模拟器
一,前言 第一天学习Android,安装开发环境,以前装过Eclipse,安装过程记得很复杂,不过同事说现在用Android studio比较多,开发起来更简单,所以选择安装Android studi ...
- Android studio 突然连接不上雷电/夜神模拟器
Android studio 突然连接不上夜神模拟器 ##解决办法: ###1.找到夜神模拟器的bin地址,然后进入cmd命令行 截图如下: ###2.执行命令 nox_adb.exe connect ...
- android studio点击图片,如何在Android Studio中的模拟器图库中添加图像?
如何在Android Studio中的模拟器图库中添加图像? 我正在开发图像过滤器应用程序. 但是,如果我没有任何图像,就无法真正尝试. 我知道我可以在电话中对其进行测试,但这并不相同,因为我需要错误 ...
- Android Studio 无法启动模拟器的一种可能是你装的是Ghost版的系统
我遇到的问题是,打开模拟器,进度条走到最后,突然出现了emulator error,然后模拟器就无法启动(不好意思当时没有截图).我是在Ghost版 win7系统下运行Android Studio 的 ...
- Android Studio使用天天模拟器运行Android程序
首先 打开安装配置好开发环境的Android Studio 然后打开运行天天模拟器 (最好去官网下载最新版) 接下来开始配置如何连接了 打开DOS界面 依次为 运行-->cmd 点击回车 然后输 ...
- Android开发-AMD平台如何使用Android studio自带模拟器
Android开发-AMD平台如何使用Android studio自带模拟器 前言 AMD开启虚拟化VT win10专业版开启 win10家庭版开启 创建Android模拟器 前言 现在Android ...
- 【无标题】Android studio连接第三方模拟器全解
mumu模拟器:adb connect 127.0.0.1:7555 海马玩模拟器:adb connect 127.0.0.1:26944 逍遥安卓模拟器:adb connect 127.0.0.1: ...
- android studio 安装genymotion模拟器教程
一.注册\登录 打开Genymotion官网,https://www.genymotion.com/ ,首先点击右上角的Sign in进行登录操作.如何登录就不细讲了,下面讲一下如何注册(备注:注册按 ...
- Android开发-Android studio自带模拟器使用中文拼音输入法
Android开发-Android studio自带模拟器使用中文拼音输入法 搜狗输入法下载 搜狗输入法安装 修改模拟器语言 搜狗输入法下载 上篇文章中我们在Android studio中创建了X86 ...
最新文章
- Beam Search
- 自兴人工智能——Python运算符和操作对象
- R筛选dataframe时间范围内的数据
- Python开源爬虫项目代码:抓取淘宝、京东、QQ、知网数据--转
- 菜鸟教程之Microsoft Windows Powershell
- C# 算法题系列(一) 两数之和、无重复字符的最长子串
- Dubbo原理与框架设计
- C/C++ realloc()函数解析
- Bootstrap让内容块居中
- java epoch times_Java 8新特性探究(七)深入解析日期和时间
- Pr 入门教程,如何在节目监视器中修剪剪辑?
- 【多目标优化求解】基于matlab人工鱼群求解多目标优化问题【含Matlab源码 442期】
- TCP/IP协议栈中,为什么选择IP层负责分片?
- Matlab------在Matlab中如何画圆
- JAVA WEB学习笔记(一)
- 计算机里面的硬盘图标怎么会变,win7系统电脑硬盘图标变样的解决方法
- MSDN我告诉你在线hash验证服务
- 对路径“C:\inetpub\wwwroot\Test\Temper\”的访问被拒绝 【已解决】
- 2018桂林J - Stone Game(博弈)
- OO包设计原则遵循度自动分析检查工具JDM简介(原创)