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ファイルが生産されます.
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; これはファイルパス権限ファイルです.かっこいいポーズに変えてください.
このコードは、ZJDroidを参照してください.問題はありません.
問題2
小米5アンドロイド6はプログラムのないリストを開き、
ええ、モデルが更新されたら、notifyを覚えています.
質問3、
また出会うかもしれませんが、殻を外すかどうかを選択して、選択をキャンセルしてからページを引いてから、選択をキャンセルしてまた現れます.
モデルのデータを同期的に変更する必要があります.そうでなければviewは再構築を破棄し、メモリを持つデータは最新ではありません.
問題4.
sdcard権限がないという問題が発生する可能性があります.すべてのappがsdcard権限を申請したわけではありません.これはクラッシュします.どうやって解くの?
xposedが提供するXsharedPreference実現に変えて、そのConfigモジュール
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ファイルが生産されます.
5.ソース
https://github.com/smartdone/dexdump
アップロードされた添付ファイル:
/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モジュール