1. 程式人生 > >ecllipse工程編寫基於xposed框架的demo模組

ecllipse工程編寫基於xposed框架的demo模組

參考:http://blog.csdn.net/beyond296089727/article/details/45766297

參考:http://blog.csdn.net/u012227549/article/details/41692697

 玩遊戲的人一般都用過外掛,外掛看起來很神奇。其實他的原理就是HOOK,就是注入到目標程序了獲取目標程序資料段的資料,然後修改達到目的,比如我們我開始開發遊戲時,定義一個變數 int  sore=0;記錄遊戲當前得分的,一般程式的變數編譯後都是放到資料段裡,執行時也對映到記憶體的相應資料段裡,外掛要做的就是找到這個變數的在記憶體中的地址然後修改他的值。但是整個過程複雜難度很大,所以一般只有技術蠻高的人才能做。

      很幸運,在Android中rovo98大神為我們提供一個相關開發框架和執行環壞境,就是有名的xposed框架,關於xposed框架的安裝和介紹可以參考這裡http://www.25pp.com/news/news_69599.html,自己也可以百度。關於他的外掛開發流程可以參考官方的文章https://github.com/rovo89/XposedBridge/wiki/Development-tutorial
圖片 

,而且官方也提供了DEMO叫RedClock,

現在就用官方的DEMO做講解

第一步,建立一個android工程,

第二步,匯入官方的開發包xposedBradge-版本號.jar

從這裡http://forum.xda-developers.com/xposed/xposed-api-changelog-t2714067下載最新的XposedBridgeApi-<version>.jar,放入lib,然後Build Path => Add to Build Path,meta-data中xposedminversion的value為<version>。

PS:Files in the libs (with "s") folder are automatically included by Eclipse, so don't put the API file there.


第三步,如圖配置AndroidManifest.xml,在Application標籤新增

<manifest android:versionCode="1" android:versionName="1.0" package="de.robv.android.xposed.examples" xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="17" />
    <application android:debuggable="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name">
        <meta-data android:name="xposedmodule" android:value="true" />
        <meta-data android:name="xposeddescription" android:value="Easy example which makes the status bar clock red and adds a smiley" />
        <meta-data android:name="xposedminversion" android:value="30" />
    </application>
</manifest>

屬性,其中

<meta-data
    android:name="xposedmodule"
    android:value="true" />

是固定的,用於標識是xposed外掛,這樣安裝後xposed installer就會識別並載入,

 <meta-data
    android:name="xposeddescription"
    android:value="Easy example which makes the status bar clock red and adds a smiley" />

是用於在xposed installer外掛列表裡顯示的標題和描述資訊的額,這個可以自定義,

 <meta-data
    android:name="xposedminversion"
    android:value="30" />

這個標識jar包的版本號,就是匯入SDK 開發包的版本號,

其他的就沒什麼要特別配置的了,

第四步,在工程的assets資料夾新建一個名為xposed_init的檔案,內容是入口類的全路徑類名(包名+類名),

如圖,類名是de.robv.android.xposed.examples.redclock.RedClock,標識是外掛的入口類。

第五步,編寫入口類,必須實現IXposedMod的子類(4個)。

package de.robv.android.xposed.mods.tutorial;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class Tutorial implements IXposedHookLoadPackage {    
	public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {        
		XposedBridge.log("Loaded app: " + lpparam.packageName);
		findAndHookMethod("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, "updateClock", new XC_MethodHook() {     
		    @Override      
		    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {               
		    // this will be called before the clock was updated by the original method            
		    }            
			@Override            
			protected void afterHookedMethod(MethodHookParam param) throws Throwable {                
			// this will be called after the clock was updated by the original method            
			}    
		});
	}
}

其中入口類要實現IXposedHookLoadPackage介面,並重寫handleLoadPackage方法,便表示每當有一個APP被載入時就回調這個介面,這裡我們可以處理我們感興趣的APP,是以包名為標識,比如DEMO裡監聽的是"com.android.systemui"包,對應的API就是系統應用SystenUi.apk專門顯示系統UI的,比如狀態列,

這是DEMO的程式碼

package de.robv.android.xposed.examples.redclock;


import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
import android.graphics.Color;
import android.util.Log;
import android.widget.TextView;
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.LoadPackageParam;


public class RedClock implements IXposedHookLoadPackage {
	public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {

		Log.v("packageName", lpparam.packageName);
		if (!lpparam.packageName.equals("com.android.systemui"))
		return;

		findAndHookMethod("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, "updateClock", new XC_MethodHook() {
			@Override
			protected void afterHookedMethod(MethodHookParam param) throws Throwable {
				TextView tv = (TextView) param.thisObject;
				String text = tv.getText().toString();
				tv.setText(text + " :)");
				tv.setTextColor(Color.RED);
				Log.v("redcolock","redcolock");
			}
		});

		//XposedHelpers.getObjectField(obj, "a");
	}
}

圖片 官方DEMO的效果(下圖)就是修改狀態列的時間為紅色並且加了:)。

圖片 

現在我們就來編寫自己的外掛HOOK  QQ 密碼,因為這裡涉及QQ的安全所以這裡就不直接拿QQ來講解了,於是做了個DEMO模仿QQ的登陸的,程式碼和介面效果如下圖 


圖片

圖片
APP的包名為com.example.test
介面對應的Activity 全路徑類名為 fager.qq.QQActivity
 其中,public Button bt_QQlogin;對應登陸按鈕的成員變數

public EditText et_count;對應賬號輸入框的成員變數

public EditText et_password;對應密碼輸入框的成員變數
public void onClick(View v)對應登陸按鈕點選時間的回撥函式
 

 接下來編寫外掛HOOK QQ 密碼,工程如圖
圖片 這裡HOOK的是onClick(View V)函式,也就是說點選登陸按鈕後,外掛就HOOK住他,然後獲取密碼控制元件EditText  
et_password,然後獲取他的內容,然後修改

效果如下

圖片 

其實QQ裡的登陸程式碼架構也是這樣,用同樣的原理能輕鬆HOOK到QQ密碼,效果如圖


圖片

圖片

 其實360這些防毒軟體的的動態防禦功能就是用這樣的原理,比如許可權管理功能,如果我們對某個APP進行相應許可權設定為“提醒”的
比如發簡訊,當APP發簡訊時就會彈框提醒使用者,如圖


圖片

圖片
又比如APP獲取裝置資訊(IMEI) 是通過程式碼
 
TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);   

String IMEI= tm.getDeviceId();獲取的,360首先HOOK住TelephonyManager類的方法getDeviceId(),如果使用者拒絕的,
360就返回
getDeviceId()的結果是“00000000000000” 這樣無效的IMEI
如圖

圖片

圖片


 如果允許的就返回真正的IMEI,如圖
圖片 

正對HOOK技術, 原理上支付寶,網銀APP等其他要輸入密碼的都容易HOOK住密碼,所以安全性不容忽視去。針對樣情況,
要對坑這樣的技術提高使用者安全性,方法很對,最重要的是ROOT,如果沒有ROOT就無法安裝xposed框架,自然就沒有下文了,
沒有ROOT,連360的功能都大打折扣,想動態防禦功能是無法是實現,就連流量防火牆也不能用,所以谷歌官方可手機廠商都建議使用者不ROOT就是因為這原因了。
第二,針對密碼這樣重要的資料輸入,對應的控制元件最好自己用C語言實現的,不要使用者SDK裡的API。


相關推薦

ecllipse工程編寫基於xposed框架demo模組

參考:http://blog.csdn.net/beyond296089727/article/details/45766297 參考:http://blog.csdn.net/u012227549/article/details/41692697  玩遊戲的人一般都用

Java編寫基於netty的RPC框架

-c shu resp pre 覆蓋 數據處理 ofo 核心 用兩個 一 簡單概念 RPC: ( Remote Procedure Call),遠程調用過程,是通過網絡調用遠程計算機的進程中某個方法,從而獲取到想要的數據,過程如同調用本地的方法一樣. 阻塞IO :當阻塞

【vue】基於vue+elementUI+seajs的後臺管理外框架demo,導航選單+tab頁面顯示跳轉

後臺管理外框架demo,由vue + seajs架構的後臺管理框架,頁面主要三部分組成:頭部、左側選單、主介面。左側選單以路由控制在主介面以tab頁形式展示。 seajs主要是用來做程式碼組織的,方便模組化載入。功能上實現主要是vue+elementUI+vuex。 左側導航(自定義app-nav元件) 整

Golang基於beego框架開發Web APP的訪問日誌記錄模組

日誌系統或者說使用者操作記錄,在後端中的作用可謂是舉足輕重。那日誌記錄到底有什麼用?用處還真的挺多的,常見的比如debug、資料分析、安全防護等等等等。那今天我們用Golang基於beego框架寫一個伺服器端訪問日誌記錄模組,這裡面涉及到的知識點主要就是Golang的檔案讀寫

使用IDEA基於Maven搭建多模組聚合工程(springmvc+spring+mybatis整合)

文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:好好學java,獲取優質學習資源。 終於有時間搞java了,今天使用IDEA基於maven搭建了多模組聚合工程,經過了多番嘗試,終於成功啦! 注意:這裡是在原作者的基礎上改進的版

網路程式設計之基於nio的Netty框架Demo

36套java進階高階架構師視訊+38套大資料視訊  保證全是硬貨需要的+微信:du13797566440首選引入netty jar包/** * @author dlj2018年1月2日 * netty服務端,實現非同步非阻塞處理訊息 */public class Serve

基於django框架編寫的簡單資訊採集系統

新學期開學,又要統計學生資訊。如果每個人都填寫一個Excel的話,最後做彙總工作的那個人一定神煩。所以基於django編了一個小網頁,用於採集學生的基本資訊。剛學會做網頁,也是第一次用django,寫的不好,望見諒。主要參考了菜鳥教程的django系列教程,很簡

基於ssm框架的個人部落格系統(10)--編寫部落格頁面開發

在前面我們實現了部落格管理的分頁、查詢和刪除,現在我們來設計實現編寫部落格的頁面,要寫部落格,我們就使用富文字編輯器,有很多可以選擇KingEditor、UEditor、CkEditor,我沒用過百度的UEditor,現在試一回,反正是中文的,應該是容易上手的。 自行下載:

使用maven建立基於spring框架的scala web工程

最近在研究如何使用scala進行web開發的過程中,發現資料都很少。參考很多文章的例子,工程都執行不起來。所以,寫下這篇文章。 lift是基於scala語言開發的web框架。但考慮到目前java程式設計師對spring框架比較熟悉。因此選擇spring框架作為s

《Java 編寫基於 Netty 的 RPC 框架

一 簡單概念 RPC: ( Remote Procedure Call),遠端呼叫過程,是通過網路呼叫遠端計算機的程序中某個方法

工程基於Maven的SSM(Spring,SpringMvc,Mybatis)整合的web工程(中)

png 開始 版本 war mage ont 右鍵 調用 web工程 上篇用了單工程創建了SSM整合的web工程(http://www.cnblogs.com/yuanjava/p/6748956.html),這次我們把上篇的單工程改造成為多模塊工程 一:創建

基於one2team框架的Highcharts圖表圖片導出方案

exception tchar 官方 過程 author 處理 phi base rtt 這篇文章已經沒有什麽意義了,新版的HIghcharts提供Java圖片導出解決方案,你需要做的就是下個Maven,bulid一個war就Ok了。---addedy on 2

socket 網絡編程高速入門(一)教你編寫基於UDP/TCP的服務(client)通信

unix fflush ins tracking ng- main ack ndt accept 由於UNIX和Win的socket大同小異,為了方便和大眾化,這裏先介紹Winsock編程。 socket 網絡編程的難點在入門的時候就是對基本函數的了解和使用,由於

MapReduce教程(一)基於MapReduce框架開發<轉>

mat 路徑 重寫 combine 自定義 單詞 tools 必須 www. 1 MapReduce編程 1.1 MapReduce簡介 MapReduce是一種編程模型,用於大規模數據集(大於1TB)的並行運算,用於解決海量數據的計算問題。 MapReduce

安卓逆向之基於Xposed-ZjDroid脫殼

重定位 war fill 沙盒 mar 內存 ces 鼠標 文件加載 http://bbs.pediy.com/thread-218798.htm 前言 之前介紹了普通常見的反編譯模式 但對於使用了 360加固 棒棒 愛加密 等等的加固應用就沒辦法了、 你

Android中Xposed框架篇-微信實現本地視頻發布到朋友圈功能

快速定位 adb 本地 ref jad jadx mps 頁面 視頻 微信非常龐大,還好有一些強大的工具,下面就來總結收獲的知識。 一、使用adb shell dumpsys activity top命令快速定位頁面 二、使用Jadx進行方法跟蹤時候如果發現沒有結

編寫python web框架(一):簡介

== web 方法 nvi ever pytho 必須 ext sim 編寫一個最簡單的應用: def app(environ, start_response): start_response(‘200 OK‘, [(‘Content-Type‘, ‘tex

yarn 常用命令(基於vue框架)

不同 yar route 瀏覽器 import style temp pan exp 初始化項目 yarn add init 安裝vue yarn add vue 安裝webpack,webpack-dev-server(是一個小型的Node.js Express服務器)

轉:從頭開始編寫基於隱含馬爾可夫模型HMM的中文分詞器

lan reverse single trim 地址 note str rip resources http://blog.csdn.net/guixunlong/article/details/8925990 從頭開始編寫基於隱含馬爾可夫模型HMM的中文分詞器之一 - 資

基於Lucene框架的“虎撲籃球”網站搜索引擎(java版)

writer 用戶 源碼 static 數組 head 完整 需求 ash  1 引言 本次作業完成了基於Lucene的“虎撲籃球”網站搜索引擎,對其主要三個板塊---“最新新聞”(主要NBA新聞),“虎撲步行街”(類似貼吧性質),“虎撲濕乎乎”(籃球發帖區)進行頁