该文章配合珠峰逆向的xposed-001视频一起参考学习。
这个版本是超级详细版本,按照这个方法,绝对是可以一击致命的入门的,大家尽可放心。
1.什么是xposed
框架是一款开源框架,其功能是可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。 其实简单的说,xposed就是一个能够劫持底层应用进程,如果了解切面编程算法的话,它的作用非常像aop框架,提供切面,和修改切点前后的逻辑。
2.准备资料
- xposed installer 百度网盘地址:
android 5.1 对应的xposed地址 链接:https://pan.baidu.com/s/1_9sCUlxqGjYuX1FgqpPFlQ 密码:8gmf
android 4.4 对应的xposed地址 链接:https://pan.baidu.com/s/1d-z6SQU2V-7–oH9rORZ9w 密码:sgkh - xposed-bridge54.jar 百度网盘地址: 链接:https://pan.baidu.com/s/1H69Jh9xNnd4ODkwFbRgW2A 密码:3f9x
- root真机 或者 夜神模拟器 雷电模拟器 等 这个大家自备
- idea开发工具 笔者认为这个比 android studio好用 官网地址:https://www.jetbrains.com/idea/
3.开始干活
-
新建Android工程 如图
2.点击next,输入项目信息
3.点击finish 看到项目启动画面
到这个地方恭喜你,你已经完成了自己写一个android apk的任务,不过它还不是一个xposed模块,没有关系,跟着我的思路走。 -
打开雷电模拟器 安装xposed installer.apk 对应版本 ,讲 xposed installer apk拖入雷电模拟器中,打开如图
点击确定,这个异常的情况是新手经常碰到的, Could not load available ZIP files. Pull down to try again.
碰到这样子的问题不要慌,一般情况下是因为网络问题,切换下wifi或者 连上手机热点,这个问题就能够解决,如果还不行,就换一个模拟器试试,总之根本原因是网络原因。
正常情况下,会出点一个install 按钮,点击install,然后等待下载,这个下载会略微有点慢,点在成功后,会自动安装,这个时候点击允许root,然后重启模拟器,这个时候xposed installer就算是安装成功了,笔者换了逍遥模拟器之后就好了,如图
-
这个时候我们来试一下刚才我们创建的apk,点击 idea中的 这个按钮
会出现这个情况
执行adb命令的目的就是为了 让模拟器作为一个设备和pc端连接通,能够被pc识别,具体 命令是:
adb connect 127.0.0.1:xxxxx 这个地方xxxx表示端口,可以参考我的这个文章: https://blog.csdn.net/neruda1991/article/details/106343759
我们执行下命令
adb connect 127.0.0.1:21503
这些都是容易出错的地方,如果新手出现了问题,不要慌,反复的进行操作,一定可以搞定的。有问题的话私信笔者留下qq号和问题,符合条件的可以加入我们的珠峰逆向交流群进行沟通
我们再次点击 debug按钮,如图
大家会奇怪,为什么是这个手机品牌啊,我的是模拟器啊,不要慌,大家可以打开模拟器的设置,如图
这个地方就是模拟器模拟器的手机品牌,选择这个手机,点击ok
稍等片刻之后,我们写的第一个apk就会安装到模拟器中
如果大家在安装的过程中出现问题,大概率就是gradle出了问题,碰到问题不要慌,直接私信作者,留下qq和问题,符合条件的拉你进我们的珠峰逆向交流群。
终于 把apk安装成功了,xposed的内容才刚刚开始,不过只要按照我的步骤来,就一定不会有问题。
首先将四大要素,就是如何让一个普通的apk变身成一个xposed的module
大家要谨记着四点,我先列出来,如果大家碰到了自己写的apk没有被xposed识别成模块的话,那么就来看着四点对照下。
1. 虽然android工程中自带了libs文件夹,但是但是但是 我们要做的是 在app下新建一个 lib文件夹,,放入 XposedBridgeApi-54.jar,然后点击这个jar,右键选择 Add as library
2. 在 src/main 文件夹下 新建 assets文件夹,然后再该文件夹中新建 xposed_init文件 该文件中写的是 hook主类的全类名
3. 修改AndroidManifest.xml 修改内容参考后文模板
4. 记住 记住 是在 app里边的 build.gradle文件中 项目依赖
这四点虽然有点模糊,但是是一个检查点,我们详细的开始讲如何做
第一步截图:
点击 ok 确定 如图
第二步 我们先把空白的文件搞出来,如图
第三步
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zhufeng.demo1">
<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">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<meta-data
android:name="xposedmodule"
android:value="true"/>
<meta-data
android:name="xposeddescription"
android:value="我的第一个xposed模块"/>
<meta-data
android:name="xposedminversion"
android:value="54"/>
</application>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
第四步
如图
compile group: ‘com.alibaba’, name: ‘fastjson’, version: ‘1.2.62’
compileOnly fileTree(includes: [’*.jar’], dir: ‘lib’)
好了 现在四个步骤基本完成了。我们就是今天的重头戏,就是如何让xposed工作起来。后边的代码,涉及到了 Android开发的一些东东,有些新手可能对Android开发不是很了解,不过没关系,下边的代码,粘贴复制就好。我们想实现的效果就是 让xposed去修改一个方法的返回值。
- 我们在MainActivity 代码修改如下:
package com.zhufeng.demo1;
import android.util.Log;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "firstXposed";
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
String sign = getSign();
TextView textView = this.findViewById(R.id.hello);
textView.setText( sign );
}
public String getSign(){
return "这是我的第一个xposed";
}
}
同时我们点击 这个地方,跳转到Android的页面中去
然后在原来的代码中,只需要增加一行即可
android:id="@+id/hello"
大家要加油啊,离胜利不远了
其实到了这个地方,我们先来看一下努力的成功,我们这个时候重新点击 debug按钮,对的就是这个地方,
安装成功后,如果如果界面和上图一直,并且在Android的下拉菜单中有了这个东东,就说明我们已经把这个apk变成了一个 xposed的插件
好的,大概讲下上述代码的逻辑,就是说,我们通过getSign方法来获取sign的值,然后显示在这个 hello这个 组件中,原来的Hello world已经我们覆盖了。那么我们需要做的事情是什么呢,就是去书写一个xposed 的hook类,来见证我们的效果,废话不多说直接上图上代码
我们新建一个HookEntry类 ,并且注意注意 要在assets下的xposed_init文件中,填写这个HookEntry的全类名
上图:
package com.zhufeng.demo1;
import android.util.Log;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
/**
* 这个类是否生效 别忘了 在 assets文件夹下 的xposed_init文件中写上全类名
*/
public class HookEntry implements IXposedHookLoadPackage {
private static final String TAG = "firstXposed";
@Override
public void handleLoadPackage ( XC_LoadPackage.LoadPackageParam loadPackageParam ) throws Throwable {
Log.i( TAG , "packageName is" + loadPackageParam.packageName );
//这个名字从哪里来的,去AndroidManifest.xml上边找package
//这个表示apk的包名
if(loadPackageParam.packageName.equals("com.zhufeng.demo1")){
String hookClassName = "com.zhufeng.demo1.MainActivity";//你想去hook的目标类的全雷鸣
Class<?> hookClass = loadPackageParam.classLoader.loadClass( hookClassName );
XposedHelpers.findAndHookMethod( hookClass , "getSign" , new XC_MethodHook() {
@Override
protected void beforeHookedMethod ( MethodHookParam param ) throws Throwable {
super.beforeHookedMethod( param );
}
@Override
protected void afterHookedMethod ( MethodHookParam param ) throws Throwable {
super.afterHookedMethod( param );
param.setResult( "哈哈 我终于成功了~~~" );
}
} );
}
}
}
好的 到这里 我们 重新来安装下apk,老规矩,点击debug按钮,安装,这里我就不用截图了吧
我们点击激活并重启
这个地方 有些模拟器比较傻乎乎的,所以需要我们自己打开xposed,然后再模块中勾选我们刚才写的那个模块,然后回到主界面,选择重启或者软重启均可
不过我一般碰到的情况都是点击这个就卡住,所以我就直接关掉重启没简单粗暴
重启成功后 ,打开我们写的Demo1 apk,舒服的东东终于来了
此处应该有掌声,笔者在写这个文章的时候,几乎是一气呵成,因为已经鼓捣了很多遍,各种坑都踩过。也深知在逆向这条路上,会碰到各种各自的拦路虎,不过没有关系,结伴同行,一起打怪,有任何问题都可以私信留下qq和问题给我。
大家关心的源代码问题,我这边会放到我们的珠峰逆向群中,符合条件的小伙伴可以私信我入群。不过各位也可以根据我这个文章,自己成功的搞定,如果你也成功了,一定要回来给文章留个言或者收藏下哈~ 感谢各位,这个是我们珠峰逆向xposed的001课程
我们的002课程将教大家如何 手写一个 Android的 注入式的API框架,这个技术如果大家懂的话,就是我们可以 主动的去调用 hook的app中的某个方法,从来实现我们想要的东东~~ 对于第二节课感兴趣的小伙伴,也可以私信给我
好的 我们下一节课再见~