欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

androidhook的簡單介紹

android常見hook框架有哪些

1、Xposed:Java層的HOOK框架,由于要修改Zgote進程,需要Root;

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、孟連ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的孟連網(wǎng)站制作公司

2、CydiaSubstrator:本地層的HOOK框架,本質(zhì)上是一個inline Hook;

3、dexposed框架

4、AndFix框架;

5、Sophix 框架;

6、AndroidMethodHook框架;

7、Legend框架:在AndFix框架的基礎(chǔ)上,在方法進行替換前進行了方法的備份;

8、YAHFA框架;

9、EPIC框架;

10、VirtualXposed:Virtual APP與Xposed的一個結(jié)合。

擴展資料

使用框架的原因

因為軟件系統(tǒng)很復(fù)雜,特別是服務(wù)器端軟件,涉及到的知識,內(nèi)容,問題太多。在某些方面使用別人成熟的框架,就相當(dāng)于讓別人幫助完成一些基礎(chǔ)工作,只需要集中精力完成系統(tǒng)的業(yè)務(wù)邏輯設(shè)計。

而且框架一般是成熟,穩(wěn)健的,可以處理系統(tǒng)很多細節(jié)問題,比如,事務(wù)處理,安全性,數(shù)據(jù)流控制等問題。

還有框架一般都經(jīng)過很多人使用,所以結(jié)構(gòu)很好,所以擴展性也很好,而且它是不斷升級的,可以直接享受別人升級代碼帶來的好處??蚣芤话闾幵诘蛯討?yīng)用平臺(如J2EE)和高層業(yè)務(wù)邏輯之間的中間層。

框架開發(fā)

框架的最大好處就是重用。面向?qū)ο笙到y(tǒng)獲得的最大的復(fù)用方式就是框架,一個大的應(yīng)用系統(tǒng)往往可能由多層互相協(xié)作的框架組成。

由于框架能重用代碼,因此從一已有構(gòu)件庫中建立應(yīng)用變得非常容易,因為構(gòu)件都采用框架統(tǒng)一定義的接口,從而使構(gòu)件間的通信簡單。

框架能重用設(shè)計。它提供可重用的抽象算法及高層設(shè)計,并能將大系統(tǒng)分解成更小的構(gòu)件,而且能描述構(gòu)件間的內(nèi)部接口。

這些標(biāo)準(zhǔn)接口使在已有的構(gòu)件基礎(chǔ)上通過組裝建立各種各樣的系統(tǒng)成為可能。只要符合接口定義,新的構(gòu)件就能插入框架中,構(gòu)件設(shè)計者就能重用構(gòu)架的設(shè)計。

框架還能重用分析。所有的人員若按照框架的思想來分析事務(wù),那么就能將它劃分為同樣的構(gòu)件,采用相似的解決方法,從而使采用同一框架的分析人員之間能進行溝通。

參考資料來源:百度百科-框架

Android Binder Hook的實現(xiàn)

Binder Hook可以Hook掉 當(dāng)前App 用到的系統(tǒng)Service服務(wù)。

以LocationManager為例,在獲取一個LocationManager時分為兩步。第一,獲取IBinder對象;第二:IBinder對象通過asInterface()轉(zhuǎn)化為LocationMangerService對象。最后初始化LocationManager,application層用到的都是LocationManager。

Hook的大致原理是:ServiceManager在獲取某個Binder時,如果本地有緩存的Binder,就不再跨進程請求Binder了。我們可以在緩存中加入自己的Binder,使得ServiceManager查詢本地緩存時得到一個自定義的CustomBinder對象,不再跨進程向系統(tǒng)請求。并且ILocationManager.Stub.asInterface(CustomBinder)方法返回我們自定義的Service對象。

這里面有兩個地方需要用到自定義的對象。由于我們只Hook其中一部分的功能,其他功能還需要保留,所以用動態(tài)代理的方式創(chuàng)建自定義的Binder和自定義的Service。

在理解后面的內(nèi)容前你需要了解這些知識點:

Activity等類在獲取系統(tǒng)Service時,都是調(diào)用getSystemService(serviceName)方法獲取的。

Context 的 getSystemService() 方法調(diào)用了 SystemServiceRegistry 的 getSystemService() 方法。

SystemServiceRegistry 中有一個常量 SYSTEM_SERVICE_FETCHERS,這是一個Map。保存了ServiceName和對應(yīng)的ServiceFetcher。ServicFetcher是用于創(chuàng)建具體Service的類。ServiceFetcher 的關(guān)鍵方法是 createService() 方法。

在 ServiceFetcher 的 createService() 方法中,調(diào)用了 ServiceManager.getService(name) 方法。以 LocationManager 對應(yīng)的 ServiceFetcher 為例,它的createService()方法源碼如下:

假如我們要修改 LocationManager 的 getLastKnownLocation() 方法(下文都是)。我們要做的就是讓ServiceManager.getService("location")返回我們自定義的Binder。先看一下這個方法簡化后的源碼:

sCache是一個Map,緩存了已經(jīng)向系統(tǒng)請求過的Binder。如果我們需要讓這個方法返回我們我們自己的binder,只需要事先往sCache中put一個自定義的Binder就行了。

在put之前,需要先創(chuàng)建出一個自定義的Binder。這個Binder在被 ILocationManager.Stub.asInterface 處理后,可以返回一個自定義的 LocationManagerService。

先看一下Binder的 asInterface() 的實現(xiàn):

如果把 queryLocalInterface()方法返回一個自定義的Service,使得走if語句內(nèi)部,不走else,那就算是Hook成功了。

假設(shè)我們想讓系統(tǒng)的LocationManager返回的位置信息全是在天安門(116.23, 39.54)。那我們需要使得 LocatitionManagerService 的 getLastLocation() 方法 返回的全是 (116.23, 39.54)。

由于我們不能直接拿到系統(tǒng)的這個Service對象,可以先用反射的方式拿到系統(tǒng)的LocationManagerService。然后攔截getLastLocation()方法。

原生的Binder對象在調(diào)用 queryLocalInterface() 方法時會返回原生的Service對象。我們希望返回3.1中的自定義Service。所以這里攔截 queryLocalInterface() 方法。

有了自定義的Binder后,將它注入到ServiceManger的sCache變量中就完成Hook了~

當(dāng)onClick被調(diào)用的時候,Toast和Log都會顯示天安門的坐標(biāo)(116.23, 39.54)。證明Hook成功!

你甚至可以用Binder Hook的方式Hook掉 ActivityManager 。

android插件化(四)Hook加載插件APK(ClassLoader方式)

前面插件化一和二說了下插樁式加載未安裝的APK,主要是重寫了getResource和getClassloader兩個方法來實現(xiàn)的。以及每個組件要實現(xiàn)一個接口,通過接口注入上下文來達到它的生命周期。

那么插樁式和hook式的實現(xiàn)方式有什么不同呢?

插樁式是怎么加載到插件中的class文件呢,是通過將將APK轉(zhuǎn)化成插件的Classloader,然后想要加載插件的class文件,我們的去拿這個插件的classloader去loadClass。所以是有一個中間者的。

hook式呢是將插件apk融入到了我們的宿主apk,那直接在里面就可以直接loadClass了,在不用這個插件的ClassLoader了,這樣的話對于插件和宿主就沒什么區(qū)別了,不像插樁式有一個中間者。

那么要實現(xiàn)hook式 就要知道android中一個class文件式怎樣被加載到內(nèi)存中去的。其實就是通過PathClassLoader來加載的。

那么我們先看下ClassLoader

任何一個java程序都是由一個或者多個class組成的,在程序運行時,需要將class文件加載到JVM中才可以使用,負責(zé)加載這些class文件的就是java的類加載機制。CLassLoader的作用就是加載class文件提供給程序運行時使用,每個Class對象內(nèi)部都有一個ClassLoader來標(biāo)示自己是有那個classLoade加載的。

Android app的所有的java文件都是通過PathClassLoader來加載的,那么它的父類是BaseDexClassLoader,還有一個兄弟類是DexClassLoader,那么他們有什么區(qū)別呢。

從上面可以看出這兩個類的構(gòu)造函數(shù)不同。(在26的源碼中DexClassLoader中的optimizedDirectory也廢棄了)

PathClassLoader:用于Android應(yīng)用程序類加載器。可以加載指定的dex,以及jar、zip、apk中的classes.dex

DexClassLoader:加載指定的dex以及jar、zip、apk中的classes.dex。

可以看到創(chuàng)建ClassLoader的時候需要接收一個CLassLoader parent的參數(shù),這個parent的目的就在于實現(xiàn)類加載的委托。

某個類加載器在接到加載類的請求時,首先將加載任務(wù)委托給父類加載器,一次遞歸,如果父加載器可以完成加載任務(wù),那么就返回,只有當(dāng)父加載器無法完成加載任務(wù)時,才自己去加載。

因此我們自己創(chuàng)建的ClassLoader:newPathClassLoader("/sdcard/xx.dex",getClassLoader()),并不僅僅只能加載我們的xx.dex中的class。

需要注意的是,findBootstrapClassOrNull 這個方法,當(dāng)parent為null的時候,去這個BootCLassLoader進行加載,

但是在Android當(dāng)中的實現(xiàn):

所以new PathClassLoader("/sdcard/xx.dex",null),是不能加載Activity.class的。

上面分析了加載了一個class,是利用了雙親委托機制,那么要是都找不到那就開始調(diào)用自己的findCLass方法

在ClassLoader類中findClass:

任何ClassLoader的子類,都可以重寫loadClass和findClass。如果你不想使用雙親委托,就重寫loadClas修改實現(xiàn),重寫findClass則表示在雙親委托機制下,父ClassLoader都找不到class的情況下,定義自己去查找一個class。

而我們的PathClassLoader會自己負責(zé)加載Activity這樣的類,利用雙親委托父類去加載activity,而我們的PathClassLoader沒有重寫findClass,是在它的父類里面。因此我們可以看看父類的findClass是如何實現(xiàn)的。

可以看到加載PathClassLoader加載class,轉(zhuǎn)化為從DexPathList中加載class了,那么我們看看DexPathList中的findClass

那么從上面分析得到

到這里我們想要加載一個插件的apk ,其實最終加載的是一個dex文件(先說class文件,加載資源后面說),有沒有辦法吧這個dex文件給轉(zhuǎn)化成一個 Element 對象,給放到 Elemeng數(shù)組 當(dāng)中,這樣直接就可以加載我們插件中的類了。

1、首先我們肯定是要得到插件APK的的中DexPathList對象中的dexElement數(shù)組

2、插件的dexElements數(shù)組我們拿到了,那么是不是要開始拿我們系統(tǒng)里面的 ,我們反射獲取,和上面的一樣。

3、上面我們獲取到了系統(tǒng)和我們插件的dexElement數(shù)組,然后我們將這個數(shù)組合并到一個新的數(shù)組里面去,并且給注入到系統(tǒng)里面

至此,加載插件的一個流程基本就完成了。但是上面只是處理了class文件,沒有處理資源。資源的話我們也是采用hook的方式去實現(xiàn)

在宿主的Application中hook這個方法,然后去重寫getAsserts和getResources兩個方法:

然后在插件的BaseActivity中繼續(xù)重寫getAssets和getResources兩個方法

這樣就可以完成hook式加載一個未安裝的APK了。至此基本就完成了插樁式和Hook式插件化的基本實現(xiàn)。(后面幾篇是優(yōu)化)。

android中的View被注解,如何Hook

用注解吧 打個@SuppressLint("ClickableViewAccessibility") 這個警告是說,有可能會和點擊事件發(fā)生沖突如果你在touch中返回了true,那么就不會響應(yīng)onClick事件了你必須調(diào)用一下view.performClick(),才會觸發(fā) view.setOnTouchListener(new View.OnTouchListener() { @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub return false; } });

Android進階解密③—Hook

源碼的執(zhí)行是按照一定流程思路進行的,hook就是在源碼的執(zhí)行流程之間插入一步操作,起到攔截,替換的作用;被改變的對象稱為hook點,一般將不易發(fā)生變化的類作為hook點;

學(xué)習(xí)hook必須了解代理模式,可以參考我這篇文章: 反射和動態(tài)代理

首先需要知道startactivity的流程: Android進階解密①——activity的啟動過程

我們知道startActivity會通過mInstrumentation這個類,我們可以將這個類作為hook點;

自定義一個Instrumentation,在activity的工作過程中通過反射替換原來的Instrumentation,將原來的Instrumentation傳到代理類里面,通過method invoke保證原來的功能不變,然后可以添加自己的自定義操作;

首先拿到activity原來的Instrumentation對象,通過原來的Instrumentation構(gòu)建出一個InstrumentationProxy對象,將Proxy設(shè)置給activity,然后只要在startActivity()之前調(diào)用這個方法替換就可以了;

android sensor信息能不能hook

首先我們可以用Xposed框架來hook計數(shù)傳感器的隊列函數(shù)dispatchSensorEvent(),這個函數(shù)在android.hardware.SystemSensorManager$SensorEventQueue這個類中。隨后在微信運動每次詢問行走步數(shù)的時候,我們先獲取當(dāng)前步數(shù),然后在目前的步數(shù)的基礎(chǔ)上加1000步,然后將信息返回給微信運動。微信運動就會誤以為我們運動了1000步,從而達到了欺騙的效果。

關(guān)鍵代碼如下:

首先hook android.hardware.SystemSensorManager$SensorEventQueue這個類的dispatchSensorEvent()函數(shù):

final Class? sensorEL = findClass("android.hardware.SystemSensorManager$SensorEventQueue",lpparam.classLoader);

XposedBridge.hookAllMethods(sensorEL, "dispatchSensorEvent", new XC_MethodHook()

接著我們在記步傳感器把步數(shù)信息返回給微信運動之前,將返回的步數(shù)加上1000步:

protected void beforeHookedMethod(MethodHookParam param) throws

Throwable {

XposedBridge.log(" mzheng Hooked method: " + param.method);

((float[]) param.args[1])[0]=((float[]) param.args[1])[0]+1000*WechatStepCount;

WechatStepCount+=1;

另外我們還可以使用一些傳感器的接口獲取一些數(shù)據(jù)的信息:

Sensor ss = ((SparseArraySensor) field.get(0)).get(handle);

XposedBridge.log(" SensorEvent: sensor=" + ss);

比如說x就代表開機以來行走的步數(shù),timestamp是獲取步數(shù)時候的時間戳等。

另外,我們不僅在android上可以hook計步器,在iOS上也是可以通過越獄后hook iHealth的API接口達到同樣的作弊效果,有興趣的同學(xué)可以繼續(xù)研究。

文章名稱:androidhook的簡單介紹
分享URL:http://chinadenli.net/article6/dsshjog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、動態(tài)網(wǎng)站搜索引擎優(yōu)化、網(wǎng)站設(shè)計公司用戶體驗、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作