xposedとinline hookに基づく一代のシェル脱殻ツール


注意:
1.携帯電話はapi 21バージョン以上のxposedでartモードをサポートしなければならない.携帯電話が殻から抜けるときはartモードで
2.E/Xposed(28813):  java.lang.UnsatisfiedLinkError:  dlopen  failed:  couldn't  map ;/data/local/tmp/libhook.so;  segment  1:  Permission  denied
setenforce 0はこの保護問題です
回転:http://bbs.pediy.com/thread-218936.htm
1.なぜこのツールを書くのか
世代の殻は古いが、市場にはまだ多い.idaで脱ぐと少し疲れます.それから私はxposedプラグインを書いて、素早くシェルを脱いでくれました.△この方法は手間が省け、システムを修正したり、動的にデバッグしたりする必要はありません.
2.原理
原理はsoの中のart::DexFile::OpenMemory、それからメモリの中のdexをファイルに書きます.このように簡単で、最も主要なのはhookのタイミングで、大部分の殻はattachBaseContextという方法の中でコードの復号を完成します.だから、私たちはhook Applicationのattachメソッドに行って、このメソッドが実行される前に、私たちのダイナミックライブラリをロードして、ダイナミックライブラリの中で実現したのはart::DexFile::OpenMemoryメソッドのハイジャックです.これで彼がコードを解読する前にart::DexFile::OpenMemoryはすでに私たちにコントロールされているので、やりたいことをすることができます.ここではele 7 enxhが提供したAndroid-Inline-Hookに感謝し、native層のhookをすることができます.
3.どのようにして殻を脱ぐか
略.(あなたは今すべてhook native層とjava層をhookすることができて、それではあなたは好きなようにすることができます)
4.どのように使うか
まずlibhookをダウンロードします.soとxposedプラグインのapkファイルをlibhook.soは/data/local/tmpの下に置く、権限を777に変更する.次にxposedプラグインをインストールし、プラグインを再起動してアクティブにします.その後、xposedプラグインのインタフェースに行って、脱殻が必要なapkをチェックします.選択した後、シェルを除去するアプリケーションのプロセスを乾かし、シェルを除去する必要があるアプリケーションのプロセスを再開します.シェルを除去することに成功すると、/data/data/アプリケーションパッケージ名の下で脱いだdexファイルが生産されます.
一个基于xposed和inline hook的一代壳脱壳工具_第1张图片
一个基于xposed和inline hook的一代壳脱壳工具_第2张图片
5.ソース
https://github.com/smartdone/dexdump
アップロードされた添付ファイル:
  •  app-debug.apk(1.40 MB、32ダウンロード)
  •  libhook.so(25.40 kb、17回ダウンロード)
  • 問題1:
    /data/local/tmp/libhook.so;  segment  1:  Permission  denied; これはファイルパス権限ファイルです.かっこいいポーズに変えてください.
            XposedHelpers.findAndHookMethod("dalvik.system.BaseDexClassLoader", ClassLoader.getSystemClassLoader(), "findLibrary", String.class, new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    Log.i("weijia", "  lib" + (String) param.args[0]);
                    if (HOOKLIB.equals(param.args[0]) && param.getResult() == null) {
                        param.setResult("/data/data/com.smartdone.dexdump/lib/lib" + HOOKLIB + ".so");
                    }
                }
            });

    このコードは、ZJDroidを参照してください.問題はありません.
    問題2
    小米5アンドロイド6はプログラムのないリストを開き、
     private void getInstallAppList() {
            try {
                List packageInfos = getPackageManager().getInstalledPackages(0);
                for (PackageInfo packageInfo : packageInfos) {
                    if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0 && (!StringUtils.equals(packageInfo.packageName, "com.smartdone.dexdump"))) {
                        Appinfo info = new Appinfo();
                        info.setIcon(zoomDrawable(packageInfo.applicationInfo.loadIcon(getPackageManager()), DensityUtil.dip2px(this, 128), DensityUtil.dip2px(this, 128)));
                        info.setAppName(packageInfo.applicationInfo.loadLabel(getPackageManager()).toString());
                        info.setAppPackage(packageInfo.packageName);
                        if (XSharePreferenceConfig.contains(selected, info.getAppPackage())) {
                            info.setChecked(true);
                        } else {
                            info.setChecked(false);
                        }
                        appinfos.add(info);
                    }
                }
                MainActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //        ,          
                        adapter.notifyDataSetChanged();
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    ええ、モデルが更新されたら、notifyを覚えています.
    質問3、
    また出会うかもしれませんが、殻を外すかどうかを選択して、選択をキャンセルしてからページを引いてから、選択をキャンセルしてまた現れます.
    checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                        appinfos.get(posi).setChecked(b);
                        if (b) {
                            xSharePreferenceConfig.addOne(appinfos.get(posi).getAppPackage());
                            //Config.addOne(appinfos.get(posi).getAppPackage(), MainActivity.this);
                        } else {
                            xSharePreferenceConfig.removeOne(appinfos.get(posi).getAppPackage());
                            //Config.removeOne(appinfos.get(posi).getAppPackage(), MainActivity.this);
                        }
                    }

    モデルのデータを同期的に変更する必要があります.そうでなければviewは再構築を破棄し、メモリを持つデータは最新ではありません.
    問題4.
    sdcard権限がないという問題が発生する可能性があります.すべてのappがsdcard権限を申請したわけではありません.これはクラッシュします.どうやって解くの?
    /**
     * Created by virjar on 2018/2/24.
    * , apk sd , hook , XSharePreference apk , shardPreference , app */ class XSharePreferenceConfig { private static final String pluginPackage = "com.smartdone.dexdump"; private static final String configName = "dumpapps"; // XSharedPreferences , apk private SharedPreferences writeXSharedPreferences = null; // XSharedPreferences, private SharedPreferences readXSharedPreferences = null; @SuppressLint("WorldReadableFiles") void initWriteSharedPreference(Context pluginHostContext) { if (!StringUtils.equals(pluginHostContext.getApplicationInfo().packageName, pluginPackage)) { throw new IllegalStateException("can not create write sharedPreference in host app"); } if (writeXSharedPreferences != null) { return; } writeXSharedPreferences = pluginHostContext.getSharedPreferences(configName, Context.MODE_WORLD_READABLE); } void initReadSharePreference() { if (readXSharedPreferences != null) { return; } readXSharedPreferences = new XSharedPreferences(pluginPackage, configName); } private SharedPreferences getBindSharePreference() { if (writeXSharedPreferences != null) { return writeXSharedPreferences; } if (readXSharedPreferences != null) { return readXSharedPreferences; } throw new IllegalStateException("not inited"); } void addOne(String name) { SharedPreferences bindSharePreference = getBindSharePreference(); Set stringSet = Sets.newHashSet(Splitter.on(",").splitToList(bindSharePreference.getString(configName, ""))); stringSet.add(name); bindSharePreference.edit().putString(configName, Joiner.on(",").join(stringSet)).apply(); } void removeOne(String name) { SharedPreferences bindSharePreference = getBindSharePreference(); Set stringSet = Sets.newHashSet(Splitter.on(",").splitToList(bindSharePreference.getString(configName, ""))); stringSet.remove(name); bindSharePreference.edit().putString(configName, Joiner.on(",").join(stringSet)).apply(); } Set getConfig() { return Sets.newHashSet(Splitter.on(",").splitToList(getBindSharePreference().getString(configName, ""))); } static boolean contains(Set lists, String name) { if (lists == null) { return false; } for (String l : lists) { if (l.equals(name)) { return true; } } return false; } }

    xposedが提供するXsharedPreference実現に変えて、そのConfigモジュール