AS 3.0.1 編寫 Xposed 插件入門記錄
最近一直在捯飭 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.zipwin7和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:
dk-bundle,
配置
添加系統環境變數,path中添加 d:
dk-bundle,路徑中不要出現空格和中文。
顯示如圖顯示NDK已經安裝成功:
Android studio 中"文件"-"項目結構",SDK Location 中配置 NDK的目錄:
配置完成之後在項目工程中 "local.properties",可以看到ndk的目錄:
#Tue Mar 27 10:35:45 CST 2018ndk.dir=d:\ndk-bundlesdk.dir=C:\Users\admin\AppData\Local\Android\Sdk
新建 Android 工程
新版本的 NDK 不再支持舊版本下的某些使用方式,如果使用舊版本的一些配置,會出現各種各樣的報錯,google和百度上也很難搜索到正確的答案,非常的浪費精力,大家看下過程也可以節省時間。
採取的思路是先創建一個包含有 .so 模塊的 Android 工程,再行配置為 Xposed 模塊,一舉兩得。
新建一個 android 工程,命名為 HookDemo,需要勾選 include C++ support,這樣就可以編寫C++代碼。
後面的配置中需要支持C++11 標準,原因是某些特定的庫需要支持,比如<stdint.h>
與默認配置之間的區別是:
cmake {cppFlags "-std=c++11"}
完成之後直接進行編譯,成功後可以觀察到在工程目錄下有 native-lib.so 文件,安裝生成好的APP到手機上,就可以觀察到效果:
驗證下:
#include <jni.h>#include <string>extern "C"JNIEXPORT jstringJNICALLJava_com_xposed_hookdemo_MainActivity_stringFromJNI(JNIEnv #env,jobject /# this #/) { std::string hello = "Hello from C++"; //與app頁面一致 return env->NewStringUTF(hello.c_str());}
觀察工程可以發現工程結構:
MainActivity 中載入並調用so模塊中的函數
public class MainActivity extends AppCompatActivity {// Used to load the native-lib library on application startup.static {System.loadLibrary("native-lib"); //載入so模塊}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Example of a call to a native methodTextView 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,拷貝兩個文件到..HookDemoapplibs 目錄下,在jar文件上右鍵選擇"As a Library",之後選擇確定。..HookDemoappuild.gradle 文件可以看到包含進去了兩個jar文件。
修改 dependencies
修改依賴方式 compile files 修改為 provided files, 修改 ..HookDemoappuild.gradle 中的 dependencies 選項:
把 implementation 修改為 provided,最終如下:
dependencies {provided fileTree(include: [#.jar], dir: libs)implementation com.android.support:appcompat-v7:26.1.0implementation com.android.support.constraint:constraint-layout:1.0.2testImplementation junit:junit:4.12androidTestImplementation com.android.support.test:runner:1.0.1androidTestImplementation com.android.support.test.espresso:espresso-core:3.0.1provided files(libs/api-82-sources.jar)provided files(libs/api-82.jar)}
修改 AndroidManifest.xml 文件
需要 AndroidManifest.xml 添加三個 meta-data 屬性:
<!-- 是否是xposed模塊,xposed根據這個來判斷是否是模塊 --><meta-dataandroid:name="xposedmodule"android:value="true" /><!-- 模塊描述,顯示在xposed模塊列表那裡第二行 --><meta-dataandroid:name="xposeddescription"android:value="HookDemo" /><!-- 最低xposed版本號(lib文件名可知) --><meta-dataandroid:name="xposedminversion"android:value="53" />
引用自:https://blog.csdn.net/niubitianping/article/details/52571438
編寫 HOOK 類代碼
..CodeHookDemoappsrcmainjavacomxposedhookdemo 目錄下新建一個類:HookMain ,代碼如下:
新建一個類,然後在 .assetsxposed_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:
新建 xposed_init,以文本格式打開,輸入指定的 Hook 入口:
com.xposed.hookdemo.HookMain
生成apk並測試
完成以上的操作後,生成APK測試一下。把..HookDemoappuildoutputsapkdebugapp-debug.apk上傳到手機中
# adb push 本地目錄 手機目錄
通過virtualXposed 中的 xposed 安裝程序,找到HookDemo.apk 並進行安裝,成功之後,就會在VirtualXposed 模塊頁面中顯示我們創建的HookDemo模塊,
打開一個 xposed中安裝的APP後,觀察其中的日誌,可以看到相關的日誌記錄。
到此說明 模塊創建和配置完成。剩下的就是調用 so模塊中代碼,先來簡單一點的:直接使用AS默認生成的代碼。
添加針對 .so模塊的調用
整個Xposed 模塊工程其實是不需要 MainActivity 代碼的,所以其中只有參考成分。剩下的工作是在編寫相應的C++ 代碼。
..HookDemoappsrcmaincpp
ative-lib.cpp 中添加針對 HookMain 類的導出函數。
extern "C"JNIEXPORT jstringJNICALLJava_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後進行測試,結果如圖:
參考資料
- 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
關注看雪學院公眾號http://ikanxue.com,收貨更多乾貨哦!
推薦閱讀:
※在不熟悉C/C++情況下,hook windows事件
※用戶模式下基於異常和內核控制的線程級鉤子技術分析
※淺談android hook技術
TAG:XposedFramework | 插件 | Hook |