當前位置:首頁 » 安卓系統 » androidhookapi

androidhookapi

發布時間: 2023-02-27 01:17:40

❶ 如何hook android framwork api

1.向目標進程注入代碼(注入so,並調用該so里的一個函數)。首先調用ptrace函數,調試com.android.browser進程,在這里我們需要遍歷該進程載入的libc.so,這里有我們需要的dlopen,dlsym等函數的地址,我們先中斷com.android.phone,修改其寄存器,壓入參數如我們的so路徑,並將之前找到的dlopen地址壓入寄存器,直接操作blx,就可以讓目標進程調用dlopen載入我們的so,同理dlsym調用我們的so里的函數。

下面就是我做的工作,重定向函數實現hook。

2.com.android.phone程序打電話等網路連接時調用了xxx.so,該so維護了一個got表和rel.plt表。其中rel.plt表存放了外部依賴函數的地址,而got表裡存放的就是本so定義的函數的地址。在上文被注入的so已經和com.android.phone處於一個進程空間,並且可以執行一段我們設定的代碼。我們的代碼應該這么做。我們也載入xxx.so,這里不會真正的載入,因為已經載入過了,但是我們可以獲得xxx.so的句柄,然後查找到rel.plt表中的dial函數表項。然後載入我們寫的一個myxxx.so,該so里有我們自己定義的mydial函數,注意兩個函數的簽名必須一致。同理我們找到mydial函數載入後的地址,然後將之前xxx.so的dial表項的函數地址替換為我們的mydial函數的地址。注意在地址替換時需要先調用mprotect函數來突破so內存空間的防寫。
在mydial函數里,我們了dial函數的全部代碼,但是有一個改變。就是將目標電話號碼修改為我們指定的號碼。

查找函數地址表項代碼為

//handle為目標so的句柄,name為目標函數名

void* getaddr(void *handle,const char *name)
{
if(!handle)

return;
Soinfo *si = (Soinfo*)handle;
Elf32_Sym *symtab = si->symtab;
const char *strtab = si->strtab;
Elf32_Rel *rel = si->plt_rel;
unsigned count = si->plt_rel_count;
unsigned idx;
for(idx=0; idx<count; idx++) //外部依賴函數在rel_plt中
{
unsigned type = ELF32_R_TYPE(rel->r_info);
unsigned sym = ELF32_R_SYM(rel->r_info);
unsigned reloc = (unsigned)(rel->r_offset + si->base);
char *sym_name = (char *)(strtab + symtab[sym].st_name);
if(strcmp(sym_name, name)==0)
{
printf("\"plt_rel\" idx:%2d type:%2d sym:%2d sym_name:%-30s addr:%0x\n",idx,type,sym,sym_name,*((unsigned*)reloc));
return (void *)*((unsigned*)reloc);
}
rel++;
}
for(idx=0;idx<si->nchain;idx++) //自定義函數在symtab中
{
unsigned type = ELF32_R_TYPE(symtab[idx].st_info);
unsigned sym = ELF32_R_SYM(symtab[idx].st_info);
char *sym_name = (char *)(strtab + symtab[idx].st_name);
if(strcmp(sym_name, name)==0)
{
printf("\"got\" idx:%2d sym_name:%-30s st_value:%0x base: %0x\n",idx,sym_name,symtab[idx].st_value,si->base);
return (void *)(symtab[idx].st_value+si->base);
}
};
return NULL; //not found
}

至於替換函數執行地址,就是將目標函數地址修改為之前找到的用於代替目標函數執行的函數地址。注意got表中時相對so的base的值,需要加減兩個so的base差值。而rel.plt表中則是絕對地址。

從安全的角度入手,我們可以hook關鍵函數,實現許可權操作限制。

--------------------------------------------------------------------------------------------------------

防止注入的思路:

1.設置android:debuggable為false,禁止被ptrace;

2.修改mmap、dlopen等函數的地址,防止被其他進程調用;

3.動態監測有無載入其他so,有的話就卸載它

❷ android常見hook框架有哪些

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

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

3、dexposed框架

4、AndFix框架;

5、Sophix 框架;

6、AndroidMethodHook框架;

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

8、YAHFA框架;

9、EPIC框架;

10、VirtualXposed:Virtual APP與Xposed的一個結合。

(2)androidhookapi擴展閱讀

使用框架的原因

因為軟體系統很復雜,特別是伺服器端軟體,涉及到的知識,內容,問題太多。在某些方面使用別人成熟的框架,就相當於讓別人幫助完成一些基礎工作,只需要集中精力完成系統的業務邏輯設計。

而且框架一般是成熟,穩健的,可以處理系統很多細節問題,比如,事務處理,安全性,數據流控制等問題。

還有框架一般都經過很多人使用,所以結構很好,所以擴展性也很好,而且它是不斷升級的,可以直接享受別人升級代碼帶來的好處。框架一般處在低層應用平台(如J2EE)和高層業務邏輯之間的中間層。

框架開發

框架的最大好處就是重用。面向對象系統獲得的最大的復用方式就是框架,一個大的應用系統往往可能由多層互相協作的框架組成。

由於框架能重用代碼,因此從一已有構件庫中建立應用變得非常容易,因為構件都採用框架統一定義的介面,從而使構件間的通信簡單。

框架能重用設計。它提供可重用的抽象演算法及高層設計,並能將大系統分解成更小的構件,而且能描述構件間的內部介面。

這些標准介面使在已有的構件基礎上通過組裝建立各種各樣的系統成為可能。只要符合介面定義,新的構件就能插入框架中,構件設計者就能重用構架的設計。

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

❸ android sensor信息能不能hook

首先我們可以用Xposed框架來hook計數感測器的隊列函數dispatchSensorEvent(),這個函數在android.hardware.SystemSensorManager$SensorEventQueue這個類中。隨後在微信運動每次詢問行走步數的時候,我們先獲取當前步數,然後在目前的步數的基礎上加1000步,然後將信息返回給微信運動。微信運動就會誤以為我們運動了1000步,從而達到了欺騙的效果。
關鍵代碼如下:
首先hook android.hardware.SystemSensorManager$SensorEventQueue這個類的dispatchSensorEvent()函數:
final Class<?> sensorEL = findClass("android.hardware.SystemSensorManager$SensorEventQueue",lpparam.classLoader);
XposedBridge.hookAllMethods(sensorEL, "dispatchSensorEvent", new XC_MethodHook()

接著我們在記步感測器把步數信息返回給微信運動之前,將返回的步數加上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;


另外我們還可以使用一些感測器的介面獲取一些數據的信息:
Sensor ss = ((SparseArray<Sensor>) field.get(0)).get(handle);
XposedBridge.log(" SensorEvent: sensor=" + ss);

比如說x就代表開機以來行走的步數,timestamp是獲取步數時候的時間戳等。
另外,我們不僅在android上可以hook計步器,在iOS上也是可以通過越獄後hook iHealth的API介面達到同樣的作弊效果,有興趣的同學可以繼續研究。

❹ 如何Android hook https http

1.創建工程android4.0.3(api15,測試發現其他版本也可以),可以不用activity

2.修改AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.robv.android.xposed.mods.tutorial"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<meta-data
android:name="xposedmole"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="Easy example" />
<meta-data
android:name="xposedminversion"
android:value="54" />
</application>
</manifest>

3.在工程目錄下新建一個lib文件夾,將下載好的XposedBridgeApi-54.jar包放入其中.

eclipse 在工程里 選中XposedBridgeApi-54.jar 右鍵–Build Path–Add to Build Path.

IDEA 滑鼠右鍵點擊工程,選擇Open Mole Settings,在彈出的窗口中打開Dependencies選項卡.把XposedBridgeApi這個jar包後面的Scope屬性改成provided.

4.模塊實現介面

[java] view plain


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;

public class Tutorial implements IXposedHookLoadPackage {
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
XposedBridge.log("Loaded app: " + lpparam.packageName);
}
}

5.入口assets/xposed_init配置,聲明需要載入到 XposedInstaller 的入口類:

[java] view plain


de.robv.android.xposed.mods.tutorial.Tutorial //完整類名:包名+類名

6.定位要hook的api
編譯目標程序,查看Smali代碼
直接在AOSP(android源碼)中查看

7.XposedBridge to hook it
指定要 hook 的包名
判斷當前載入的包是否是指定的包
指定要 hook 的方法名
實現beforeHookedMethod方法和afterHookedMethod方法

熱點內容
3dm的壓縮包 發布:2025-05-15 22:09:23 瀏覽:661
和存儲字長 發布:2025-05-15 21:54:09 瀏覽:514
用什麼寫c語言 發布:2025-05-15 21:35:56 瀏覽:418
linux讀取u盤 發布:2025-05-15 21:32:13 瀏覽:508
c語言dos 發布:2025-05-15 21:18:17 瀏覽:664
sci編譯英文 發布:2025-05-15 21:16:57 瀏覽:383
大貓如何設置密碼 發布:2025-05-15 21:15:32 瀏覽:765
什麼叫蘋果版的和安卓版的手機 發布:2025-05-15 21:05:18 瀏覽:254
編程找點 發布:2025-05-15 20:43:10 瀏覽:588
php上傳臨時文件夾 發布:2025-05-15 20:43:00 瀏覽:658