AS 3.0.1 编写 Xposed 插件入门记录

AS 3.0.1 编写 Xposed 插件入门记录_第1张图片

最近一直在捯饬 IOT 物联网中智能门锁的研究,因为要逆向安卓方面的APP,而安卓的 APP 很多都是经过加壳处理过,因此脱壳成为了必经之路。xposed 框架是非常流行的安卓下进行 HOOK APP 分析的主流框架。如何基于 Xposed 进行插件开发?参考网络上的资料发现,很多内容包括2017年的资料也存在老旧的情况,经过一系列的参考资料和动手实践之后,可以在最新版的 Android studio 下进行 Xposed demo版本的开发。以下就是大致过程的记录。

各种环境信息和相关配置

操作系统

windows7 & windows 10

Android studio 3.0.1

手机

小米 MAX2 未root

Xposed

使用软件是 VirtualXposed,方便未root的手机进行HOOK。


下载并配置NDK


下载

xposed 插件的开发中,经常会使用到NDK进行 .so 模块的编写,所以 NDK 有必要进行下载和配置

下载链接为:

https://dl.google.com/android/repository/android-ndk-r16b-windows-x86_64.zip

win7和win10都是64位系统,32位系统需要使用:

https://dl.google.com/android/repository/android-ndk-r16b-windows-x86.zip

引用页面:

https://developer.android.google.cn/ndk/downloads/index.html

同时也又 Linux 和 MacOS 版本,各下所需即可。

下载完成的ndk解压到D盘并重名为 d:\ndk-bundle\,

配置

添加系统环境变量,path中添加 d:\ndk-bundle\,路径中不要出现空格和中文。

AS 3.0.1 编写 Xposed 插件入门记录_第2张图片

显示如图显示NDK已经安装成功:

Android studio 中"文件"-"项目结构",SDK Location 中配置 NDK的目录:

AS 3.0.1 编写 Xposed 插件入门记录_第3张图片

配置完成之后在项目工程中 "local.properties",可以看到ndk的目录:

#Tue Mar 27 10:35:45 CST 2018

ndk.dir=d\:\\ndk-bundle

sdk.dir=C\:\\Users\\admin\\AppData\\Local\\Android\\Sdk


新建 Android 工程

新版本的 NDK 不再支持旧版本下的某些使用方式,如果使用旧版本的一些配置,会出现各种各样的报错,google和百度上也很难搜索到正确的答案,非常的浪费精力,大家看下过程也可以节省时间。

采取的思路是先创建一个包含有 .so 模块的 Android 工程,再行配置为 Xposed 模块,一举两得。

新建一个 android 工程,命名为 HookDemo,需要勾选 include C++ support,这样就可以编写C++代码。

AS 3.0.1 编写 Xposed 插件入门记录_第4张图片

后面的配置中需要支持C++11 标准,原因是某些特定的库需要支持,比如

AS 3.0.1 编写 Xposed 插件入门记录_第5张图片

与默认配置之间的区别是:

cmake {

cppFlags "-std=c++11"

}

完成之后直接进行编译,成功后可以观察到在工程目录下有 native-lib.so 文件,安装生成好的APP到手机上,就可以观察到效果:

AS 3.0.1 编写 Xposed 插件入门记录_第6张图片

验证下:

#include

#include

extern "C"

JNIEXPORT jstring

JNICALL

Java_com_xposed_hookdemo_MainActivity_stringFromJNI(

JNIEnv #env,

jobject /# this #/) {

std::string hello = "Hello from C++"; //与app页面一致

return env->NewStringUTF(hello.c_str());

}

观察工程可以发现工程结构:

AS 3.0.1 编写 Xposed 插件入门记录_第7张图片

MainActivity 中加载并调用so模块中的函数

public class MainActivity extends AppCompatActivity {

// Used to load the 'native-lib' library on application startup.

static {

System.loadLibrary("native-lib"); //加载so模块

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

// Example of a call to a native method

TextView tv = (TextView) findViewById(R.id.sample_text);

tv.setText(stringFromJNI()); //调用so函数

}

/##

# A native method that is implemented by the 'native-lib' native library,

# which is packaged with this application.

#/

public native String stringFromJNI(); //声明 native 函数

}


配置支持 Xposed 模块


通过上述的方法之后,可以很快的创建针对so模块的初始化工程,节省很多时间。

相关的代码在cpp目录下,剩下的工作就是配置工程为 Xposed 模块。

下载&配置 Xposed api

https://bintray.com/rovo89/de.robv.android.xposed/api 中下载两个 xposed API,

api-82-sources.jar,api-82.jar,拷贝两个文件到

..\HookDemo\app\libs 目录下,在jar文件上右键选择"As a Library",之后选择确定。

AS 3.0.1 编写 Xposed 插件入门记录_第8张图片

..\HookDemo\app\build.gradle 文件可以看到包含进去了两个jar文件。


修改 dependencies


修改依赖方式 compile files 修改为 provided files, 修改 ..\HookDemo\app\build.gradle  中的 dependencies 选项:

把 implementation 修改为 provided,最终如下:

dependencies {

provided fileTree(include: ['#.jar'], dir: 'libs')

implementation 'com.android.support:appcompat-v7:26.1.0'

implementation 'com.android.support.constraint:constraint-layout:1.0.2'

testImplementation 'junit:junit:4.12'

androidTestImplementation 'com.android.support.test:runner:1.0.1'

androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'

provided files('libs/api-82-sources.jar')

provided files('libs/api-82.jar')

}


修改 AndroidManifest.xml 文件


需要 AndroidManifest.xml 添加三个 meta-data 属性:


android:name="xposedmodule"

android:value="true" />


android:name="xposeddescription"

android:value="HookDemo" />


android:name="xposedminversion"

android:value="53" />

引用自:https://blog.csdn.net/niubitianping/article/details/52571438


编写 HOOK 类代码


..\Code\HookDemo\app\src\main\java\com\xposed\hookdemo 目录下新建一个类:HookMain ,代码如下:

新建一个类,然后在 .\assets\xposed_init  中的代码指向了HookMain,就不用直接修改MainActivity 的代码,代码结构会相对应清晰。

package com.xposed.hookdemo;

import de.robv.android.xposed.IXposedHookLoadPackage;

import de.robv.android.xposed.XposedBridge;

import de.robv.android.xposed.XC_MethodHook;

import de.robv.android.xposed.callbacks.XC_LoadPackage;

/##

# Created by Weiya on 2018/3/27.

相关的 xposed hook代码都在这里编写

#/

public class HookMain implements IXposedHookLoadPackage {

@Override //重写了 handleLoadPackage 方法

public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable

{

XposedBridge.log("load app: " + loadPackageParam.packageName);//显示加载的 app 名称

}

}


创建 xposed_init


xposed_init 文件是 Xposed 模块的入口文件,Xposed 就是通过该文件找到对应的函数入口。

AS工程 app目录下右键,新建-folder-assets:

AS 3.0.1 编写 Xposed 插件入门记录_第9张图片

新建 xposed_init,以文本格式打开,输入指定的 Hook 入口:

com.xposed.hookdemo.HookMain


生成apk并测试


完成以上的操作后,生成APK测试一下。把..\HookDemo\app\build\outputs\apk\debug\app-debug.apk上传到手机中

# adb push 本地目录 手机目录

通过virtualXposed 中的 xposed 安装程序,找到HookDemo.apk 并进行安装,成功之后,就会在VirtualXposed 模块页面中显示我们创建的HookDemo模块,

AS 3.0.1 编写 Xposed 插件入门记录_第10张图片

打开一个 xposed中安装的APP后,观察其中的日志,可以看到相关的日志记录。

AS 3.0.1 编写 Xposed 插件入门记录_第11张图片

到此说明 模块创建和配置完成。剩下的就是调用 so模块中代码,先来简单一点的:直接使用AS默认生成的代码。

添加针对 .so模块的调用

整个Xposed 模块工程其实是不需要 MainActivity 代码的,所以其中只有参考成分。剩下的工作是在编写相应的C++ 代码。

..\HookDemo\app\src\main\cpp\native-lib.cpp 中添加针对 HookMain 类的导出函数。

extern "C"

JNIEXPORT jstring

JNICALL

Java_com_xposed_hookdemo_HookMain_stringFromJNI2( //HookMain 指对应HookMain 这个java类

JNIEnv #env,

jobject /# this #/) {

std::string hello = "Hello from stringFromJNI2";

return env->NewStringUTF(hello.c_str());

}

编译为APK后进行测试,结果如图:

AS 3.0.1 编写 Xposed 插件入门记录_第12张图片

参考资料

Android NDK开发之从环境搭建到Demo级十步流

https://www.cnblogs.com/guanmanman/p/6769240.html

基于dalvik模式下的Xposed Hook开发的某加固脱壳工具

https://blog.csdn.net/QQ1084283172/article/details/77966109


本文由看雪论坛 仙果 原创 转载请注明来自看雪社区


往期热门阅读:

看雪学院招募看雪讲师

谈谈vmp的还原

码图并茂红黑树

谈谈vmp的还原

教你如何反编译微信小程序

换一个帅一点姿势实现DexHunter

关注看雪学院公众号ikanxue.com,收货更多干货哦!

你可能感兴趣的:(AS 3.0.1 编写 Xposed 插件入门记录)