吾愛破解 - LCG - LSG |安卓破解|病毒分析|huihengkj.com

 找回密碼
 注冊[Register]

QQ登錄

只需一步,快速開始

搜索
查看: 4958|回復: 109

[Android 原創] Android10 aarch64 dlopen Hook

  [復制鏈接]
樓主
CIBao 發表于 2020-7-22 20:32 回帖獎勵

前言[toc]

對于自動化hook Il2cpp 的模塊來說, dlopen500彩票邀请码 的hook相當于一個大門, 沒有該大門口, 一切都是紙上談兵

armabi-v7a 上hook dlopen, 輕松的不要不要的, 甚至借用一下 virtual 系列app的 va++ 核心提供的 hook_dlopen 函數的接口都行

可是到了 aarch64 這里, 找了一圈, 能用的 hook構件 也就一枚 , 而且源項目好像還得自己手動修一下才能使用.... (可惜不支持安卓10, 原hookzz的也木大)

好了有 hook構件 了, 但是我看了一圈主流的 VirtualApp 商業授權做出來的 虛擬多開 系列軟件, 基本上都沒實現 aarch64hook_dlopen, 有的實現了卻沒有給調用, 自己去調用的話就會卡死 (還想 借鑒 一下方案, 逃個課先)

就你媽離譜

環境 & 預習

測試平臺
機型: 紅米K30-4G, 已Root
系統: miui11, android-10

看雪上看到的一篇文章:
雖然半年前就看到這篇文章,但是基本上在看天書,現在拿出來看了一圈, 關鍵實現就是這里

雖然我看不懂什么 LR寄存器 什么的, 但是唯獨看懂這第三個參數強制賦值為 dlerror 函數的函數地址, 以達到越過系統的限制

而關于那所謂的系統限制, 就是在安卓7開始, 系統就禁止 用戶APP 打開/讀取 部分 系統庫文件 , 所以直接 dlopen linker 會直接失敗, 具體可以使用 dlerror() 函數查看原因 (懶 不貼圖了)

初步嘗試Hook

反匯編 libdl.so

貌似安卓9開始, dlopen就由 libdl.so 庫進行導入, 反匯編看看

看了一下導出函數, 也就只有兩個函數涉及到dlopen

讓我康康這個 dlopen 長什么樣!

中間的 .__loader_dlopen 是個跳板

最終指向的是got表的導出變量 __loader_dlopen

康康 __loader_dlopen

步驟很簡單

  1. 加載 libdl.so
  2. 使用 dlsym() 獲取 __loader_dlopen
  3. 打印該值, 順便看看該內存所在maps的何處
LOGE("pid: %d", getpid());

void *libdl_handle = dlopen("libdl.so", RTLD_NOW);
LOGE("libdl_handle: %p", libdl_handle);

void *__loader_dlopen_addr = dlsym(libdl_handle, "__loader_dlopen");
LOGE("__loader_dlopen at: %p", __loader_dlopen_addr);

先查看logcat輸出

__loader_dlopen 的值為0x700258f11c

500彩票邀请码使用adb shell去查看對應的內存區段

adb shell
su #升級為root用戶
cat /proc/目標pid/maps

跑到 linker64 里去了, 把文件提取出來反匯編, 順便先把這 __loader_dlopen 的偏移值算出來
0x700258f11c - 0x7002557000 = 0x3811C

反匯編 linker64

利用剛剛算出來的偏移,轉跳后發現指向的是 linker64 里的 __loader_dlopen 函數

淦ta

直接一套組合拳打在 __loader_dlopen 函數上!

// 定義原型
void *(*orig___loader_dlopen)(const char *, int , const void *) = nullptr;
void *new___loader_dlopen(const char *filename, int flags, const void *caller_addr)
{
    void *handle = orig___loader_dlopen(filename, flags, caller_addr);
    LOGE("LoadedLib: {%s}:%p", filename, handle);
    return handle;
}

//執行hook
LOGE("pid: %d", getpid());

void *libdl_handle = dlopen("libdl.so", RTLD_NOW);
LOGE("libdl_handle: %p", libdl_handle);

void *__loader_dlopen_addr = dlsym(libdl_handle, "__loader_dlopen");
LOGE("__loader_dlopen at: %p", __loader_dlopen_addr);

A64HookFunction(__loader_dlopen_addr, (void *)new___loader_dlopen,
                (void **)&orig___loader_dlopen);

然后TM就蹦了!

騷操作 Hook

各種騷操作(木大)

一開始以為是hook構件出問題, 各種log查看
后來試試, 但這玩意不支持安卓10 (淦)
然后試試直接dlopen直接加載 libil2cpp.so, 也木大
嘗試直接加載 linker64 再去hook, 但這玩意直接被限制, 讀取都做不到
一天下來, 都要放棄了, 突然想到一個騷主意, 再試試吧

解析轉跳指令

__loader_dlopen 函數中實際上進行dlopen的是該函數

不過由于沒法進行加載 linker64 文件, 正常手段根本獲取不到這玩意
(virtualApp的解析用上了open函數, 但是linker64文件無法被加載...木大)

不過好在我有解析過 Bxx指令 的經驗
相關文章: (aarch64無需再+8)

關鍵邏輯就是 (手動計算時,注意大小端轉換! 人話就是,字節倒序才是內存中實際的樣子!)

  1. 指令進行左移8位(2字節)去掉轉跳指令
  2. 右移8位, 高位空缺填補回去
  3. 左移2位, 獲得實際的轉跳偏移

合并到一起就變成了

//提取B指令的偏移  !!指令為4字節,一定要用對應的數據類型
#define Extract(symbol) (*(int32_t *)(symbol) << 8 >> 6)

測試看看

計算目標指令的偏移(目標指令地址-函數頭地址=偏移)
0x38160 - 0x3811C = 0x44

上代碼!

//提取B指令的偏移
#define Extract(symbol) (ulong)(*(int32_t *)(symbol) << 8 >> 6)

// 內存偏移
template <class T>
inline T MemoryOff(void *addr, ulong off) {
    return (T)((char *)addr + off);
}

// 修正B指令轉跳
template <typename T>
inline T Amend_Bxx(T symbol) {
    return MemoryOff<T>((void *)symbol, Extract(symbol));
}

//打印
auto b_do_dlopen = MemoryOff<void *>(__loader_dlopen_addr, 0x44);
LOGE("hex: %x", *(int32_t *)b_do_dlopen);

auto do_dlopen = Amend_Bxx(b_do_dlopen);
LOGE("do_dlopen: %p", do_dlopen);

讓我康康!

指令是沒錯了, 解析也正常, 看看打印出來的地址是否正確
0x70025932c4 - 0x7002557000 = 0x3C2C4

完美!!

進行Hook

直接提著地址進行hook!

//源函數聲明
void *(*_DlopenV26)(const char *, int, int, int) = nullptr;
void *DlopenV26(const char *name, int flag1, int flag2, int flag3)
{
    void *handle = _DlopenV26(name, flag1, flag2, flag3);
    if (handle != nullptr)
        LOGE("LoadedLib: {%s}:%p", name, handle);
    return handle;
}

//hook
A64HookFunction(do_dlopen, (void *)DlopenV26, (void **)&_DlopenV26);

終于成功!!

關于Bxx指令偏移

目前只反編譯過 紅米K30-4G, 紅米K20Prolinker64 文件
偏移均為 0x44, 其他機型的 linker64 文件建議自行反編譯看看
因為用的是騷操作, 能用就已經算不錯了 T_T

總結

本方法算是笨方法, 不過總算有個門能讓我踏進 aarch64 的世界了
有點詭異的是, 不知為何hook __loader_dlopen 函數會奔潰
理論上 Bxx指令 的偏移都是 0x44, 源碼的實現都應該一樣的
500彩票邀请码 至于其他安卓版本....手頭上就只有安卓10啊, 有心無力...

免費評分

參與人數 37吾愛幣 +32 熱心值 +33 收起 理由
31mz + 1 歡迎分析討論交流,吾愛破解論壇有你更精彩!
正在加載 + 1 熱心回復!
beiyingluo + 1 + 1 我很贊同!
zsq + 1 + 1 謝謝@Thanks!
lixiaosi + 1 + 1 熱心回復!
zycode + 1 + 1 用心討論,共獲提升!
onething + 1 + 1 熱心回復!
zhoumeto + 1 + 1 用心討論,共獲提升!
Demo花生 + 1 謝謝@Thanks!
蘭笙c + 1 + 1 用心討論,共獲提升!
wszsd + 1 + 1 我很贊同!
gaosld + 1 + 1 熱心回復!
XhyEax + 3 + 1 我很贊同!
away99 + 1 + 1 謝謝@Thanks!
lmaple0 + 1 + 1 歡迎分析討論交流,吾愛破解論壇有你更精彩!
siuhoapdou + 1 + 1 謝謝@Thanks!
yourk + 1 我很贊同!
54320 + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
獨行風云 + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
qaz007 + 1 + 1 用心討論,共獲提升!
戰意星河 + 1 謝謝@Thanks!
JavickM + 1 + 1 謝謝@Thanks!
笙若 + 1 + 1 謝謝@Thanks!
hengogo + 1 用心討論,共獲提升!
琪a + 1 + 1 厲害的很,雖然看不懂
榆吢 + 1 熱心回復!
dzc999 + 1 謝謝@Thanks!
sapeu + 1 用心討論,共獲提升!
XIE小謝 + 1 (&amp;amp;#8250;′ω`&amp;amp;#8249; )
果汁分妳一半 + 1 用心討論,共獲提升!
淺笑心柔 + 1 + 1 我很贊同!
mifeng + 1 + 1 用心討論,共獲提升!
huangrenheng + 1 + 1 大佬牛皮
ablist97 + 1 + 1 謝謝@Thanks!
星塵 + 1 + 1 雖然看不懂,但磁暴大佬說的對
1030lz + 1 + 1 用心討論,共獲提升!
SeeMi + 1 + 1 雖然看不懂,但是老婆我愛你

查看全部評分

本帖被以下淘專輯推薦:

發帖前要善用論壇搜索功能,那里可能會有你要找的答案或者已經有人發布過相同內容了,請勿重復發帖。

推薦
jmpews 發表于 2020-7-28 20:29
emmm... 我寫了下... (對 Android 不熟 有問題和意見歡迎提哇

代碼在這里

[Dobby/builtin-plugin/AndroidRestriction/android_restriction.cc](http://github.com/jmpews/Dobby/blob/master/builtin-plugin/AndroidRestriction/android_restriction.cc)

[Dobby/SymbolResolver/elf/dobby_symbol_resolver.cc](http://github.com/jmpews/Dobby/blob/master/builtin-plugin/SymbolResolver/elf/dobby_symbol_resolver.cc)

帖子在這里

http://huihengkj.com/forum.php ... ;extra=#pid33218773
推薦
 樓主| CIBao 發表于 2020-7-28 00:24 |樓主
某科學的阿卡林 發表于 2020-7-22 21:29
在其他安卓版本上那個函數就不是在__loader_dlopen的0x44偏移了吧,屬于騷操作但兼容性有待考證..

最近看了一下,安卓9的mi6也是0x44,偏移基本上寫死,安卓8.1的雖然不是__loader_dlopen,但是偏移也是0x44,實在不放心的話可以過濾bl指令,這種很底層的函數基本上不會遇到大改,偏移不放心自己查一查就好了,現在用上了aarch64的應該都是安卓高版本,夠用了
沙發
huangrenheng 發表于 2020-7-22 21:09
3#
LiteByte 發表于 2020-7-22 21:10
大佬厲害
4#
ailuo2005 發表于 2020-7-22 21:26
看不懂啊看不懂
5#
某科學的阿卡林 發表于 2020-7-22 21:29
在其他安卓版本上那個函數就不是在__loader_dlopen的0x44偏移了吧,屬于騷操作但兼容性有待考證..
6#
Eaglecad 發表于 2020-7-22 21:50
這操作很高端,感謝分享過程, 很值得借鑒
7#
acsecqb 發表于 2020-7-22 22:05
感謝分享!
8#
XIE小謝 發表于 2020-7-22 22:13
嚯嚯,看不懂(&#8250;′ω`&#8249; )
9#
8s7 發表于 2020-7-22 22:20
感謝分享
10#
mm_mjp 發表于 2020-7-22 22:23
哎,當年念書的時候匯編完全沒學懂。現在看來,匯編的作用相當大啊!
您需要登錄后才可以回帖 登錄 | 注冊[Register]

本版積分規則 警告:本版塊禁止灌水或回復與主題無關內容,違者重罰!

快速回復 收藏帖子 返回列表 搜索

RSS訂閱|小黑屋|聯系我們|吾愛破解 - LCG - LSG ( )

GMT+8, 2020-8-4 21:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回復 返回頂部 返回列表

500彩票邀請碼-彩經網