吾愛破解 - LCG - LSG |安卓破解|病毒分析|破解軟件|www.mlqcje.live

 找回密碼
 注冊[Register]

QQ登錄

只需一步,快速開始

搜索
查看: 3602|回復: 19
上一主題 下一主題

[Android 原創] 一套強勁的 Il2cpp Hook 框架

  [復制鏈接]
跳轉到指定樓層
樓主
CIBao 發表于 2019-6-22 08:31 回帖獎勵
本帖最后由 CIBao 于 2019-6-22 13:17 編輯

前言

前一段時間研究了一下Android的Native層Hook,結果踩了一腳的雷
這里直接使用現成框架 VirtualApp 來實現Native層Hook
對于il2cpp的Hook則采用的是替換類加載器進行針對性的HOOK
萌新第一次寫文章,哪里寫的不好可以提出來

工具的準備

VirtualApp源碼一份:GayHub
AndroidStudio和SDK:AS官網
NDK低版本一份:NDK官方下載

以上工具獲取后請先自行編譯vapp的源碼,能夠正常編譯出簽名版本即可

通過vapp的接口進行拓展

定位到目標接口

定位到 VirtualApp/lib/src/main/jni/Foundation/IOUniformer.cpp 文件
其中 onSoLoaded 這個函數是vapp預留給我們的接口,只要有lib加載就會走這個方法
第一個形參是文件路徑,第二個形參是句柄 (就是說dlopen調用完后緊接著會走這個函數?)

過濾無效的文件

只需要判斷 文件路徑 是否包含我們需要的lib就好了

if (!strstr(name, "libil2cpp.so"))
    return;

通過dlsym定位函數

查看Unity項目源碼中Class的定義,會發現幾個有意思的函數

namespace il2cpp {
namespace vm{
class Class{
    ...
    static TypeInfo* FromName (Il2CppImage* image, const char* namespaze, const char *name);
    static const MethodInfo* GetMethodFromName (TypeInfo *klass, const char* name, int argsCount);
    static const MethodInfo* GetMethodFromNameFlags (TypeInfo *klass, const char* name, int argsCount, int32_t flags);
    ...
};
} /* namespace vm */
} /* namespace il2cpp */

FromName 函數是用來獲取類 (字節碼文件?沒學過C#蛋疼T T)
GetMethodFromName 則是用來獲取指定的方法
可以直接通過 onSoLoaded 接口傳入的 句柄 定位這兩個函數

void *get_method_addr = dlsym(handle, "il2cpp_class_get_method_from_name");
void *get_class_addr = dlsym(handle, "il2cpp_class_from_name");

處理偏移

由于這兩個函數都只有單條無條件跳轉指令 B指令
IDA反匯編出的il2cpp_class_get_method_from_name函數

IDA反匯編出的il2cpp_class_from_name函數
如果不做偏移直接進行Hook會導致覆蓋了過多的指令導致閃退 (還是B指令偏移有問題?)

inline void* correctGetMethodAddr(void *symbol) {
    return ((char*)symbol + (*(int32_t*)(symbol) << 8 >> 6) + (*(int32_t*)((char*)symbol + (*(int32_t*)(symbol) << 8 >> 6) + 12) << 8 >> 6) + 20);
}
inline void* correctGetClassAddr(void *symbol) {
    return ((char*)symbol + (*(int32_t*)(symbol) << 8 >> 6) + (*(int32_t *)((char*)symbol + (*(int32_t *)(symbol) << 8 >> 6) + 8) << 8 >> 6) + 16);
}

使用上面的函數就可以修正辣
唉?你問我這啥玩意?
拿最基本的的 getBTarget 開刀吧

inline void* getBTarget(void *symbol){
    return ((char*)symbol + (*(int32_t*)(symbol) << 8 >> 6) + 8);
}
  1. *(int32_t *)(symbol) 獲取內存中指令的HEX
  2. << 8 抹除B指令的HEX,但是內存中的HEX跟IDA中看到HEX是倒過來的,所以不能用右移
  3. >> 6 初步解析指令的偏移
  4. + 8 人工計算具體偏移. 初步的解析指令偏移并不能一次性到點,還是得靠人工修正一下
  5. (char*)symbol + 初始的地址加上偏移的地址就是目標的地址

若不止跳轉一次,按照上面的步驟繼續解析加人工偏移就好了

開始Hook

創建要Hook的函數原型,還有要替換進去的新函數
要替換進去的函數的參數必須跟原函數一樣,否則會替換失敗
那些特殊的 類指針/結構體指針/等等 直接寫 void* 就好了

void* (*orig_getMethod)(void*, const char*, int, int32_t);
void* (*orig_getClass)(void*, const char*, const char*);

void* new_getMethod(void* klass, const char* name, int argsCount, int32_t flags) {
    return orig_getMethod(klass, name, argsCount, flags);
}

void* new_getClass(void* image, const char* namespaze, const char* name) {
    //LOGE("[namespaze]-> %s [name]-> %s", namespaze, name);
    return orig_getClass(image, namespaze, name);
}

注意:GetMethodFromName方法其實調用的是GetMethodFromNameFlags,但是這個方法并不能直接通過dlsym獲取,所以原型必須為 GetMethodFromNameFlags 的函數原型
寫好函數原型后就可以進行HOOK了,直接使用vapp集成好的 MSHookFunction 直接HOOK就完事

MSHookFunction(correctGetMethodAddr(get_method_addr),(void*)new_getMethod, (void**)&orig_getMethod);
MSHookFunction(correctGetClassAddr(get_class_addr),(void*)new_getClass, (void**)&orig_getClass);

正常啟動一遍vapp,將目標應用安裝進去后啟動,若無 閃退/卡殼 現象即為Hook成功
不放心的話可以在替換進去的函數加上幾句打印LOG的語句查看

修改替換進去的函數實現針對性Hook

可以選擇判斷 名稱空間 或者 類名 進行下一步操作
因為后面還有Hook,不能重復執行,來一個全局變量限制一下就好

bool (*orig_get_isAutoBattle)(void*);
bool new_get_isAutoBattle(void* self) {return true;}

bool isHookAgain = false;
void* new_getClass(void* image, const char* namespaze, const char* name) {
    void* result = orig_getClass(image, namespaze, name);
    //限制Hook
    if (isHookAgain || strcmp(namespaze, "MoleMole"))
        return result;
    isHookAgain = true;

    //通過具體的 名稱空間 還有 類名,獲取到對應的類
    void* AvatarManager = orig_getClass(image, "MoleMole", "AvatarManager");
    //通過指定的類去Hook指定的方法
    hook_func(AvatarManager, "get_isAutoBattle", 0, 0, (void *) new_get_isAutoBattle, (void **) &orig_get_isAutoBattle);

    return result;
}

注意一下:由于C#是面向對象的語言,普通成員函數第一個參數始終是實例自身,也就是this,寫代碼的時候并不需要自己加上,但是Hook的時候必須加上,否則會找不到

hook_func 函數是用來通過 類的image 獲取對應的 方法 并且進行Hook

void hook_func(void* class_image, const char* func_name, int argsCount, int flags, void* new_func, void** orig_func) {
    if (class_image) {
        int32_t* addr = (int32_t*)orig_getMethod(class_image, func_name, argsCount, flags);
        if (addr){
            //這里需要獲取指針的內容,否則Hook不到
            MSHookFunction((void*)(*addr), new_func, orig_func);
            LOGE("HOOK SUCCESS >>> [%s]", func_name);
        } else
            LOGE("HOOK not find>>> [%s] ", func_name);
    }
}

argsCount 是函數的參數個數,靜態成員方法為-1,普通成員方法不帶參數為0,帶參數的多少個就是多少個
flags 目前不清楚啥作用,不過IDA看了一下 GetMethodFromName 函數的調用是直接給0

想要Hook其他方法,只需要寫上對應的 函數原型要Hook進去的新函數函數參數個數具體的類image,并在 new_getClass 方法里面進行Hook,就ok辣

總結

這套方案只要實現成功后基本上不需要過多的維護
不過缺點也是有的,遇到那種對li2cpp進行了加殼加密,就嗝屁了

相關 教程/工具

unity游戲生成與修改so文件教程
Il2CppDumper工具

免費評分

參與人數 13威望 +1 吾愛幣 +26 熱心值 +12 收起 理由
kwing112 + 1 我很贊同!
h080294 + 1 + 1 熱心回復!
qtfreet00 + 1 + 12 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
wxue + 1 + 1 [email protected]
5omggx + 1 + 1 [email protected]
CrazyNut + 2 + 1 膜拜大佬 學習一下
微若清風 + 1 + 1 [email protected]
www96 + 1 + 1 熱心回復!
獨行風云 + 1 + 1 歡迎分析討論交流,吾愛破解論壇有你更精彩!
stars-one + 1 + 1 大佬,厲害!雖然我看得不是很懂。
笙若 + 1 + 1 [email protected]
末白 + 1 + 1 熱心回復!
XhyEax + 2 + 1 我很贊同!

查看全部評分

本帖被以下淘專輯推薦:

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

推薦
 樓主| CIBao 發表于 2019-6-25 02:02 <
liuxingyuu 發表于 2019-6-24 00:55
有啥厲害的地方嗎~~~~~

低維護,部署成功后只要函數參數個數沒改,都能用
目前的修改套路都是手動去修改lib文件,每次更新都要重新尋址去改
而這套框架不需要尋址
推薦
 樓主| CIBao 發表于 2019-6-25 02:04 <
kwing112 發表于 2019-6-24 15:26
樓主,,可以分享u3dicpp源碼看看么

上傳到微云了
https://share.weiyun.com/5GBbXFH
沙發
Light紫星 發表于 2019-6-22 09:00
3#
mancong122 發表于 2019-6-22 09:43
小老弟很有想法,遇到加殼的直接hook脫殼解密入口又能拓展出脫殼解密功能
4#
呱某包子 發表于 2019-6-22 10:14
膩害膩害
5#
多幸運遇見baby 發表于 2019-6-22 10:37
6#
胖子哦 發表于 2019-6-22 11:19
7#
syrmb 發表于 2019-6-22 12:08
神之GayHub
8#
花顏 發表于 2019-6-22 12:19
真的厲害~!!
9#
qhr319 發表于 2019-6-22 12:21
厲害支持
10#
lllcrhlll 發表于 2019-6-22 12:52
感謝分享
您需要登錄后才可以回帖 登錄 | 注冊[Register]

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

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

RSS訂閱|小黑屋|聯系我們|吾愛破解 - LCG - LSG ( 京ICP備16042023號 | 京公網安備 11010502030087號 )

GMT+8, 2019-8-12 08:00

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表
内蒙古11选5开奖查询百度