A. 請教android中有類似hook功能的函數嗎偵聽某個函數的調用
java層應該沒有,如果kernel linux有的話,那麼android的底層應該有。不過android有許可權安全機制。這個沒了解
B. 如何hook android framework
1.向目標進程注入代碼(注入so,並調用該so里的一個函數)。首先調用ptrace函數,調試com.android.browser進程,在這里我們需要遍歷該進程載入的libc.so,這里有我們需要的dlopen,dlsym等函數的地址,我們先中斷com.android.phone,修改其寄存器...
C. frida native層 hook的思路技巧
frida的native層
記錄一下學到的技巧
對於hook native層時,靜態分析so後發現有些方法欄位啥的,跟蹤鏈太長,進程跳轉太過於導致無法向上,有時直接不知道從何處分析。
首先日誌打開,這個是必須的,大部分的日誌都是由一個欄位來控制,找到這個欄位修改它,在列印的日誌的中,你會發現驚喜。
有的關鍵日誌在並沒有被列印出來,思路又陷入的僵局。
可以嘗試hook libart.so 拿到jni的一些函數的值
比如findclass, getcharutf8String等等。
列印這個的函數值時,順便列印下調用棧。
圖片來自大佬的GitHub
https://github.com/lasting-yang/frida_hook_libart
frida inlineHook 中,有時候hook一些寄存器,會報錯,這是因為他的指令又長又短,在32位中會常見,64位中都是長指令比較穩定不會報錯。
如果你的是32位還報錯,你可以向上或者向下的地址hook,觀察你要hook的寄存器是否在其他的地址也能拿到值。
有的時候hook一些so時,so還未載入,到時地址是null的,在低版本中你可以hook dlopen, Mole.findExportByName(null, 'dlopen');
在這個so被載入後再進行hook。dlopen,是底層用來載入so的函數;在高版本中hook android_dlopen_ext,;
有的時候修改參數的type 為JNIEnv* 時,修改失敗(目前我沒碰見,看到就記錄下),可以導入jni.h來解決這個問題,還有一個簡單方法是
shift+f11 打開loaded type libraries
然後右鍵 選擇load type libaray,打開下面的窗口,選擇Android arm就可以了
pass-----待記錄
D. android怎麼實現hook
幾天前,在看雪安卓版塊的論壇上,看到有人發表了一份dalvik hook的實現代碼,這里小弟果斷獻丑下,給提供一份dalvik hook的另外一種實現。
首先解釋下dalvik虛擬機中的Method結構體,Method結構體聲明在源碼目錄樹下的dalvik/vm/oo/Object.h文件內,在dalvik的世界中,每一個java方法都有一個對應的Method對象,
dalvik虛擬機在執行java方法時,就會通過該方法的Method對象調用到方法的具體實現代碼,Method結構體內有個成員,名位insns,該欄位保存著java方法具體的實現代碼。那麼我今天提供的這個dalvik hook的實現原理就是通過修改Method對象中的insns欄位的值來達到hook java的目的。
這里簡短的用文字的形式描述下Hook的實現過程。
現在有一個返回字元串的函數原型聲明為:
public String truth()
{
return "hello from truth";
}
另外聲明一個方法為:
public String fake()
{
return "fake string";
}
之後,該類被載入後,分別獲得truth和fake方法的Method對象,並將fake方法的實現代碼賦值給truth的Method對象,之後,應用程序調用truth方法時,獲得的字元串為"fake string"。
E. 如何hook android sdk
1.1 概述
Xposed 是 GitHUB 上 rovo89 大大設計的一個針對 Android 平台的動態劫持項目,通過替換 /system/bin/app_process 程序控制 zygote 進程,使得 app_process 在啟動過程中會載入 XposedBridge.jar 這個 jar 包,從而完成對系統應用的劫持。
Xposed 框架的基本運行環境如下:
因為 Xposed 工作原理是在 /system/bin 目錄下替換文件,在 install 的時候需要root 許可權,但是運行時不需要 root 許可權。
需要在 Android 4.0 以上版本的機器中
2. GitHub 上的 Xposed 資源梳理一下,可以這么分類:
XposedBridge.jar : XposedBridge.jar 是 Xposed 提供的 jar 文件,負責在 Native層與 FrameWork 層進行交互。 /system/bin/app_process 進程啟動過程中會載入該jar 包,其它的 Moles 的開發與運行都是基於該 jar 包的。
Xposed : Xposed 的 C++ 部分,主要是用來替換 /system/bin/app_process ,並為 XposedBridge 提供 JNI 方法。
XposedInstaller : Xposed 的安裝包,負責配置 Xposed 工作的環境並且提供對基於 Xposed 框架的 Moles 的管理。
XposedMods :使用 Xposed 開發的一些 Moles ,其中 AppSettings 是一個可以進行許可權動態管理的應用
1.2 Mechanism :原理
1.2.1 Zygote
在 Android 系統中,應用程序進程都是由 Zygote 進程孵化出來的,而 Zygote 進程是由 Init 進程啟動的。 Zygote 進程在啟動時會創建一個 Dalvik 虛擬機實例,每當它孵化一個新的應用程序進程時,都會將這個 Dalvik 虛擬機實例復制到新的應用程序進程裡面去,從而使得每一個應用程序進程都有一個獨立的 Dalvik 虛擬機實例。
Zygote 進程在啟動的過程中,除了會創建一個 Dalvik 虛擬機實例之外,還會將 Java運行時庫載入到進程中來,以及注冊一些 Android 核心類的 JNI 方法來前面創建的 Dalvik 虛擬機實例中去。注意,一個應用程序進程被 Zygote 進程孵化出來的時候,不僅會獲得 Zygote 進程中的 Dalvik 虛擬機實例拷貝,還會與 Zygote 一起共享 Java 運行時庫。這也就是可以將XposedBridge 這個 jar 包載入到每一個 Android 應用程序中的原因。 XposedBridge 有一個私有的 Native ( JNI )方法 hookMethodNative,這個方法也在 app_process 中使用。這個函數提供一個方法對象利用 Java 的 Reflection 機制來對內置方法覆寫。具體的實現可以看下文的 Xposed 源代碼分析。
1.2.2 Hook/Replace
Xposed 框架中真正起作用的是對方法的 hook 。在 Repackage 技術中,如果要對APK 做修改,則需要修改 Smali 代碼中的指令。而另一種動態修改指令的技術需要在程序運行時基於匹配搜索來替換 smali 代碼,但因為方法聲明的多樣性與復雜性,這種方法也比較復雜。
在 Android 系統啟動的時候, zygote 進程載入 XposedBridge 將所有需要替換的 Method 通過 JNI 方法 hookMethodNative 指向 Native 方法 xposedCallHandler , xposedCallHandler 在轉入 handleHookedMethod 這個 Java 方法執行用戶規定的 Hook Func 。
XposedBridge 這個 jar 包含有一個私有的本地方法: hookMethodNative ,該方法在附加的 app_process 程序中也得到了實現。它將一個方法對象作為輸入參數(你可以使用 Java 的反射機制來獲取這個方法)並且改變 Dalvik 虛擬機中對於該方法的定義。它將該方法的類型改變為 native 並且將這個方法的實現鏈接到它的本地的通用類的方法。換言之,當調用那個被 hook 的方法時候,通用的類方法會被調用而不會對調用者有任何的影響。在 hookMethodNative 的實現中,會調用 XposedBridge中的handleHookedMethod這個方法來傳遞參數。 handleHookedMethod 這個方法類似於一個統一調度的 Dispatch 常式,其對應的底層的 C++ 函數是 xposedCallHandler 。而 handleHookedMethod 實現裡面會根據一個全局結構 hookedMethodCallbacks 來選擇相應的 hook函數,並調用他們的 before, after 函數。
當多模塊同時 Hook 一個方法的時候, Xposed 會自動根據 Mole 的優先順序來排序,調用順序如下:
A.before -> B.before -> original method -> B.after -> A.after
2 源代碼分析
2.1 Cpp 模塊
其文件分類如下:
app_main.cpp :類似 AOSP 中的 frameworks/base/cmds/app_process/app_main.cpp,即/system/bin/app_process 這個 zygote 真實身份的應用程序的源代碼。關於zygote 進程的分析可以參照 Android:AOSP&Core 中的 Zygote 進程詳解。
xposed.cpp :提供給 app_main.cpp 的調用函數以及 XposedBridge 的 JNI 方法的實現。主要完成初始化工作以及 Framework 層的 Method 的 Hook 操作。
xposed.h , xposed_offsets.h :頭文件
Xposed 框架中的 app_main.cpp 相對於 AOSP 的 app_main.cpp 中修改之處主要為區分了調用 runtime.start() 函數的邏輯。 Xposed 框架中的 app_main.cpp 在此處會根據情況選擇是載入 XposedBridge 類還是 ZygoteInit 或者 RuntimeInit 類。而實際的載入 XposedBridge 以及注冊 JNI 方法的操作發生在第四步: xposedOnVmCreated中。
1.包含 cutils/properties.h ,主要用於獲取、設置環境變數, xposed.cpp 中需要將XposedBridge 設置到 ClassPath 中。
2.包含了 dlfcn.h ,用於對動態鏈接庫的操作。
3.包含了 xposed.h ,需要調用 xposed.cpp 中的函數,譬如在虛擬機創建時注冊 JNI 函數。
4.增加了 initTypePointers 函數,對於 Android SDK 大於等於 18 的會獲取到 atrace_set_tracing_enabled 函數指針,在 Zygote 啟動時調用。
5.AppRuntime 類中的 onVmCreated 函數中增加 xposedOnVmCreated 函數調用。
6.源代碼中的 Log* 全部重命名為 ALog*, 所以 Logv 替換為 Alogv ,但是功能不變。
7.Main 函數開始處增加了大量的代碼,但是對於 SDK 版本小於 16 的可以不用考慮。
2.1.1 Main 函數: zygote 入口
int main(int argc, char* const argv[])
F. android里怎樣hook socket過程
/***第一種:客戶端Socket通過構造方法連接伺服器***/ //客戶端Socket可以通過指定IP地址或域名兩種方式來連接伺服器端,實際最終都是通過IP地址來連接伺服器 //新建一個Socket,指定其IP地址及埠號 Socket socket = newSocket("192.168.0.7",。可以看看安卓巴士的教程:http://www.apkbus.com/thread-463776-1-1.html
G. 如何hook dlopen和dlsym底層函數
逆向分析過程有時候需要hook dlopen和dlsym函數,列印調用的庫或者函數名。
利用cydia substrate的動態庫,或者ThomasKing大大的ELF-ARM-HOOK-Library 兩個都行,但是cydia 支持x86的hook,模擬器hook 比較方便(個人見解)。
我用的是cydia 實
H. android中的View被註解,如何Hook
用註解吧 打個@SuppressLint("ClickableViewAccessibility") 這個警告是說,有可能會和點擊事件發生沖突如果你在touch中返回了true,那麼就不會響應onClick事件了你必須調用一下view.performClick(),才會觸發 view.setOnTouchListener(new View.OnTouchListener() { @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub return false; } });