Odex修补:不修改apk实现破解

看了别人的操作和我那个另类破解方法差不多,想能不能省略那么麻烦的步骤,灵感来源:https://forum.xda-developers.com/galaxy-s2/themes-apps/how-to-manually-deodex-odex-t1208320
引用百度百科:
什么是ODEX文件?

ODEX是安卓上的应用程序apk中提取出来的可运行文件,即将APK中的classes.dex文件通过dex优化过程将其优化生成一个·odex文件单独存放,原apk文件中的classes.dex文件可以保留,也可以删除。这样做可以加快软件的启动速度,预先提取,减少对RAM的占用,因为没有odex的话,系统要从apk包中提取dex再运行。
前提:
1.需要Root
2.可能用到幸运破解器
3.一个5.0以上8.0以下的手机,虚拟机还没试(应该没问题)。
4.一个破解完成的apk(有没有修复没关系,360加固的添加个classes2一样用)
ps:为何需要5.0以上,因为我写软件的时候没考虑过还有4.4的手机。为何8.0以下,因为8.0之后是有vdex的,此方法暂时对8.0以上无用


原理大概就是把软件里面的dex转换成odex再替换apk目录下的odex实现破解具体思路看我另一个帖子:https://www.52pojie.cn/thread-935810-1-1.html.也可以开源
演示视频地址:http://www.bilibili.com/video/av62548161

核心代码:[Java] 纯文本查看 复制代码

public class OdexPatchActivity extends Activity implements View.OnClickListener, FileSelectDialog.IFileSelection {

    private EditText apkPathEt;
    private String apkPath;

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);

        setContentView(R.layout.activity_odex_patch);

        initView();

    }

    private void initView() {
        this.apkPathEt = (EditText) findViewById(R.id.et_apkpath);

        Button selectBtn = (Button) findViewById(R.id.btn_select_apkpath);
        selectBtn.setOnClickListener(this);
        Button applyBtn = (Button) findViewById(R.id.btn_apply_patch);
        applyBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.btn_select_apkpath) {
            FileSelectDialog dlg = new FileSelectDialog(this, this, ".apk", "", null);
            dlg.show();
        } else if (id == R.id.btn_apply_patch) {
            this.apkPath = apkPathEt.getText().toString();
            ProcessingDialog dlg = new ProcessingDialog(this, new PatchProcessor(), -1);
            dlg.show();
        }
    }

    ////////////////////////////////////////////////////////////////////////////////
    // Processing Dialog

    class PatchProcessor implements ProcessingDialog.ProcessingInterface {
        private String errMessage;
        private String odexPath;

        @Override
        public void process() throws Exception {
            ApkInfoParser parser = new ApkInfoParser();
            ApkInfoParser.AppInfo info = parser.parse(OdexPatchActivity.this, apkPath);
            if (info == null) {
                return;
            }

            String packageName = info.packageName;
            OdexPatcher patcher = new OdexPatcher(packageName);
            patcher.applyPatch(OdexPatchActivity.this, apkPath);

            odexPath = patcher.targetOdex;
            if (patcher.errMessage != null) {
                this.errMessage = patcher.errMessage;
                throw new Exception(errMessage);
            }
        }

        @Override
        public void afterProcess() {
            if (errMessage == null) {
                Toast.makeText(OdexPatchActivity.this, "修补到 " + odexPath, Toast.LENGTH_LONG).show();
            }
        }
    }

    ////////////////////////////////////////////////////////////////////////////////
    // File selection

    @Override
    public void fileSelectedInDialog(String filePath, String extraStr, boolean openFile) {
        apkPathEt.setText(filePath);
    }

    @Override
    public boolean isInterestedFile(String filename, String extraStr) {
        return filename.endsWith(".apk");
    }

    @Override
    public String getConfirmMessage(String filePath, String extraStr) {
        return null;
    }

    ////////////////////////////////////////////////////////////////////////////////

}

截图

THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
管埋员的头像-小北的自留地

昵称

取消
昵称