ZjDroid原理分析

首先入口在這

com.android.reverse.mod.ReverseXposedModule

image.png

因為github沒有跳轉看起來不方便熔掺,所以只是粗略分析一下

首先initModuleContext中券坞,


image.png

hook了onCreate方法

image.png

往下翻可以看到其實是注冊了一個廣播猴伶,所以可以通過發(fā)送廣播的形式,進行命令傳遞忿等。

而另一個方法 跟脫殼相關

public void start() throws Throwable {

        pathClassLoader = (PathClassLoader) ModuleContext.getInstance().getBaseClassLoader();

        Method openDexFileNativeMethod = RefInvoke.findMethodExact("dalvik.system.DexFile", ClassLoader.getSystemClassLoader(), "openDexFileNative",
                String.class, String.class, int.class);
        hookhelper.hookMethod(openDexFileNativeMethod, new MethodHookCallBack() {

            @Override
            public void beforeHookedMethod(HookParam param) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterHookedMethod(HookParam param) {
                // TODO Auto-generated method stub
                String dexPath = (String) param.args[0];
                int mCookie = (Integer) param.getResult();
                if (mCookie != 0) {
                    dynLoadedDexInfo.put(dexPath, new DexFileInfo(dexPath,mCookie));
                }
            }
        });
        
        Method defineClassNativeMethod = RefInvoke.findMethodExact("dalvik.system.DexFile", ClassLoader.getSystemClassLoader(), "defineClassNative",
                String.class, ClassLoader.class,int.class);
        hookhelper.hookMethod(defineClassNativeMethod, new MethodHookCallBack() {

            @Override
            public void beforeHookedMethod(HookParam param) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterHookedMethod(HookParam param) {
                // TODO Auto-generated method stub
               if(!param.hasThrowable()){
                   int mCookie = (Integer) param.args[2];
                   setDefineClassLoader(mCookie,(ClassLoader) param.args[1]);
               }
            }
        });
        
        Method findLibraryMethod = RefInvoke.findMethodExact("dalvik.system.BaseDexClassLoader", ClassLoader.getSystemClassLoader(), "findLibrary",
                String.class);
        hookhelper.hookMethod(findLibraryMethod, new MethodHookCallBack() {

            @Override
            public void beforeHookedMethod(HookParam param) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterHookedMethod(HookParam param) {
                Logger.log((String) param.args[0]);
                if (DVMLIB_LIB.equals(param.args[0]) && param.getResult() == null) {
                    param.setResult("/data/data/com.android.reverse/lib/libdvmnative.so");
                }
            }
        });
    }

可以看到都是hook了一些類,以及最后加載自己的so

image.png

第一個hook可以發(fā)現(xiàn)苞俘,獲取了dexpath以及返回值mcookie的指針

image.png

第二個方法可以看到hook 獲取了mcook的值以及對應的classloader

第三個方法可以看到如果加載的so 名字是自己的以及找不到的話做裙,就把路徑換成自己的so路徑,其實就是一個路徑查找過程杂穷,如果系統(tǒng)找不到自己的so飞蚓,就直接告訴系統(tǒng)我的so在哪里。

接著看看脫殼過程


image.png
public void dumpDexFile(String filename, String dexPath) {
        File file = new File(filename);
        try {
            if (!file.exists())
                file.createNewFile();
            int mCookie = this.getCookie(dexPath);
            if (mCookie != 0) {
                FileOutputStream out = new FileOutputStream(file);
                ByteBuffer data = NativeFunction.dumpDexFileByCookie(mCookie, ModuleContext.getInstance().getApiLevel());
                data.order(ByteOrder.LITTLE_ENDIAN);
                byte[] buffer = new byte[8192];
                data.clear();
                while (data.hasRemaining()) {
                    int count = Math.min(buffer.length, data.remaining());
                    data.get(buffer, 0, count);
                    try {
                        out.write(buffer, 0, count);
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
            } else {
                Logger.log("the cookie is not right");
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

可以看到拿到mcookie的值问麸,然后用native層去讀數(shù)據(jù),寫到文件中。

https://bbs.pediy.com/thread-252284.htm

而參考上面鏈接的說法的話疟呐,可以看出,里面的指針指向的是dexfile色查,因為native的操作無非就是拿到dexfile的base 和size 然后讀出來交給java層寫。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子一也,更是在濱河造成了極大的恐慌椰苟,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件京痢,死亡現(xiàn)場離奇詭異方淤,居然都是意外死亡诅岩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人术浪,你說我怎么就攤上這事法焰。” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵忱反,是天一觀的道長。 經(jīng)常有香客問我胰丁,道長锦庸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任卑硫,我火速辦了婚禮欢伏,結果婚禮上河爹,老公的妹妹穿的比我還像新娘媳维。我一直安慰自己侄刽,他們只是感情好柠辞,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著间螟,像睡著了一般吴旋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厢破,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天荣瑟,我揣著相機與錄音,去河邊找鬼摩泪。 笑死笆焰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的见坑。 我是一名探鬼主播嚷掠,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荞驴!你這毒婦竟也來了不皆?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤熊楼,失蹤者是張志新(化名)和其女友劉穎霹娄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲫骗,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡犬耻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了执泰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枕磁。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖术吝,靈堂內(nèi)的尸體忽然破棺而出计济,到底是詐尸還是另有隱情晴楔,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布峭咒,位于F島的核電站,受9級特大地震影響纪岁,放射性物質(zhì)發(fā)生泄漏凑队。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一幔翰、第九天 我趴在偏房一處隱蔽的房頂上張望漩氨。 院中可真熱鬧,春花似錦遗增、人聲如沸叫惊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霍狰。三九已至,卻和暖如春饰及,著一層夾襖步出監(jiān)牢的瞬間蔗坯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工燎含, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宾濒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓屏箍,卻偏偏與公主長得像绘梦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赴魁,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359