Android native層監(jiān)控JNI方法調(diào)用

分析一些東西時偏形,想實(shí)現(xiàn)監(jiān)控Android JNI函數(shù)的調(diào)用液南,網(wǎng)上找了下,發(fā)現(xiàn)這個庫https://github.com/w296488320/JnitraceForCpp實(shí)現(xiàn)了這樣的效果滑凉,但是實(shí)際使用時,我自己遇到了一些問題畅姊,比如hook打印jobject數(shù)據(jù)時,陷入了死循環(huán)若未,然后調(diào)用FindClass解析時,有時也會閃退等粗合,最終自己處理問題后的版本如下https://github.com/carrys17/Study-Notes/tree/master/JniHelper
主要改動:
1、在getJObjectInfo等方法中壤追,會調(diào)用Jni方法去解析jobject數(shù)據(jù),例如調(diào)用CallObjectMethod時行冰,因?yàn)榍斑卙ook了CallObjectMethodV導(dǎo)致死循環(huán)伶丐。處理方式就是判斷定義一個CallObjectMethod_SAFE方法悼做,如果判斷到CallObjectMethodV_f不為空(即CallObjectMethodV函數(shù)已經(jīng)被hook了)哗魂,則調(diào)用它而不是CallObjectMethod方法。

        jobject CallObjectMethod_SAFE(JNIEnv *env, jobject jobj, jmethodID jmethodId,...){
//            WLOGD("enter CallObjectMethod_SAFE method, CallObjectMethodV_f = %p",CallObjectMethodV_f);
            if (CallObjectMethodV_f){
                va_list args;
                jobject result;
                va_start(args,jmethodId);
                result = CallObjectMethodV_f(env, jobj,jmethodId,args);
                va_end(args);
                return result;
            }else{
                return env->CallObjectMethod(jobj,jmethodId);
            }
        }

        // 直接通過toString獲取jobject 信息
        const char *getJObjectToString(JNIEnv *env, jobject obj) {
            if(!g_method_id_Object_toString){
                g_method_id_Object_toString =
                        GetMethodID_SAFE(env,FindClass_SAFE(env,ENCRYPT("java/lang/Object")), ENCRYPT("toString"),
                                         ENCRYPT("()Ljava/lang/String;"));
            }
            jobject jobj = CallObjectMethod_SAFE(env, obj, g_method_id_Object_toString);
            return GetStringUTFChars_SAFE(env,(jstring) (jobj), nullptr);
        }

2朽色、FindClass方法在部分JNI方法hook了之后再去調(diào)用時,會觸發(fā)閃退纵搁,從日志的行為看是一直打印了CallObjectMethod方法然后閃退,這里之所以會去調(diào)用FindClass腾誉,其實(shí)是為了最終拿到Object_toString的method_id,所以在init初始化的時候保存一個Object_toString的method_id

    void init(JNIEnv *env, bool isForbidMode, const std::list<std::string> &forbid_list, const std::list<std::string> &filter_list){
            WLOGD("enter init method");
            g_method_id_Class_getName =
                    env->GetMethodID(env->FindClass(ENCRYPT("java/lang/Class")), ENCRYPT("getName"),
                                                 ENCRYPT("()Ljava/lang/String;"));
            g_method_id_Object_toString =
                    env->GetMethodID(env->FindClass(ENCRYPT("java/lang/Object")), ENCRYPT("toString"),
                                     ENCRYPT("()Ljava/lang/String;"));

            gForbidSoList = std::list<std::string>(forbid_list);
            gFilterSoList = std::list<std::string>(filter_list);
            gIsForbidMode = isForbidMode;
            WLOGD("init success!");
        }

其他的一些就是避免我們主動調(diào)用的JNI方法解析數(shù)據(jù)時趣效,過濾掉不讓干擾我們分析目標(biāo)的JNI方法打印猪贪。
3跷敬、因?yàn)槲业膱鼍笆亲⑷雜o到目標(biāo)里邊热押,所以我們打印堆棧過濾一些so時,需要調(diào)用dladdr((void *) __builtin_return_address(1), &info); 而不是__builtin_return_address(0)桶癣,因?yàn)?code>__builtin_return_address(0)獲取到的永遠(yuǎn)是我自己注入的so名稱

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饺鹃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悔详,老刑警劉巖惹挟,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異匪煌,居然都是意外死亡党巾,警方通過查閱死者的電腦和手機(jī)萎庭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門齿拂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吗购,你說我怎么就攤上這事医男∧砻悖” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵踱启,是天一觀的道長。 經(jīng)常有香客問我透罢,道長,這世上最難降的妖魔是什么羽圃? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任抖剿,我火速辦了婚禮朽寞,結(jié)果婚禮上斩郎,老公的妹妹穿的比我還像新娘。我一直安慰自己孽拷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布脓恕。 她就那樣靜靜地躺著,像睡著了一般秋茫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肛著,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天跺讯,我揣著相機(jī)與錄音枢贿,去河邊找鬼刀脏。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耀态。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼创夜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挥下?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤棚瘟,失蹤者是張志新(化名)和其女友劉穎喜最,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞬内,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年章咧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赁严。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡粉铐,死狀恐怖疼约,靈堂內(nèi)的尸體忽然破棺而出蝙泼,到底是詐尸還是另有隱情,我是刑警寧澤汤踏,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站溪胶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏载荔。R本人自食惡果不足惜采桃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一丘损、第九天 我趴在偏房一處隱蔽的房頂上張望工扎。 院中可真熱鬧徘钥,春花似錦肢娘、人聲如沸呈础。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拘荡。三九已至,卻和暖如春珊皿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蟋定。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扼仲,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓犀盟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阅畴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容