首页
社区
课程
招聘
[原创]一个基于xposed和inline hook的一代壳脱壳工具
发表于: 2017-7-2 10:15 25373

[原创]一个基于xposed和inline hook的一代壳脱壳工具

2017-7-2 10:15
25373
收藏
免费 1
支持
分享
最新回复 (39)
雪    币: 4
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
能否提供一代壳的apk    不知道具体怎么找
2018-3-1 08:39
0
雪    币: 1535
活跃值: (695)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
大佬,多谢分享。 
2018-3-1 10:35
0
雪    币: 20
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
【招Android开发】2年以上android开发经验,熟悉网络通信。主要做andoid逆向,逆向技术有人指导,只需要熟练掌握android开发,对逆向有兴趣,薪资15k。
要求人品端正、踏实肯干、统招本科。公司直招,工作地点浦东金桥。QQ:1296159122
2018-3-1 10:49
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
爱加密好像脱不了,咋整
2018-3-2 19:46
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
装完之后看不到我要脱壳的APP
2018-3-14 20:39
0
雪    币: 3907
活跃值: (5817)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
31
2018-3-22 09:57
0
雪    币: 1867
活跃值: (3863)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
32

问题一:

/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,不会出问题

问题二
小米5安卓6打开没程序列表,
    private void getInstallAppList() {
        try {
            List<PackageInfo> 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();
        }
    }
嗯,model更新后,记得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);
                    }
                }
需要同步修改model的数据。否则view销毁重建,拿内存的数据不是最新的。
问题4.
可能遇到没有sdcard权限问题。不是所有的app都申请了sdcard权限,这样会崩溃。如何解?
/**
 * Created by virjar on 2018/2/24.<br>
 * 原方案,在宿主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<String> 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<String> stringSet = Sets.newHashSet(Splitter.on(",").splitToList(bindSharePreference.getString(configName, "")));
        stringSet.remove(name);
        bindSharePreference.edit().putString(configName, Joiner.on(",").join(stringSet)).apply();
    }

    Set<String> getConfig() {
        return Sets.newHashSet(Splitter.on(",").splitToList(getBindSharePreference().getString(configName, "")));
    }

    static boolean contains(Set<String> lists, String name) {
        if (lists == null) {
            return false;
        }
        for (String l : lists) {
            if (l.equals(name)) {
                return true;
            }
        }
        return false;
    }

}
换成xposed提供的XsharedPreference实现,那个Config模块
2018-3-24 10:28
0
雪    币: 3549
活跃值: (941)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
33
virjar 问题一: /data/local/tmp/libhook.so;&nbsp; segment&nbsp; 1:&nbsp; Permission&nbsp; de ...
厉害厉害
2018-4-24 19:20
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
smartdon 厉害厉害
dalao更新一下附件呗
2018-5-27 20:34
0
雪    币: 1759
活跃值: (2334)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
35
我在Android6.0 api23的https://www.androidos.net.cn/android/6.0.1_r16/xref/art/runtime/dex_file.cc 这个文件找到OpenMemory 的函数怎么没带这个DexFIle_thiz参数?
2018-11-11 11:54
0
雪    币: 3549
活跃值: (941)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
36
又见飞刀z 我在Android6.0 api23的https://www.androidos.net.cn/android/6.0.1_r16/xref/art/runtime/dex_file.cc 这个文件找 ...
这是这个对象的this指针
2018-11-12 09:17
0
雪    币: 1759
活跃值: (2334)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
37
smartdon 这是这个对象的this指针
那为何api21和22没有呢?
2018-11-12 13:48
0
雪    币: 1759
活跃值: (2334)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
38
smartdon 这是这个对象的this指针
2018-11-12 14:09
0
雪    币: 1759
活跃值: (2334)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
39
按理说,Api21,22,23的OpenMemory函数的应该没什么变化,为何在Hook时21和22没加这个this指针,而23加了呢?
2018-11-12 14:11
0
雪    币: 1759
活跃值: (2334)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
40
但是,的确我测试了下,在23系统上使用21,22的Hook方式的确得不到正确的dex文件,那说明23和21,22的OpenMemory函数还是有区别的,但是这个区别实在没看出来在哪,实在不明白你加这个this参数是怎么解决这区别的,能否简单说明下呢?
2018-11-12 14:33
0
游客
登录 | 注册 方可回帖
返回
//