Odex修补:不修改apk实现破解
本帖最后由 小骚 于 2019-8-8 21:07 编辑看了别人的操作和我那个另类破解方法差不多,想能不能省略那么麻烦的步骤,灵感来源: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
核心代码: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;
}
///////////////////////////////////////////////// ///////////////////////////////
} [/ mw_shl_code]
截图
后续可能会有更多功能,比如可以hook植入classes2.dex什么的,梦想总是要有的 万一实现了呢
忘了放下载地址:http://t.cn/AiTitrUH
幸运破解器也是用这种方式修补APK的,另外还要先修改service.jar破掉系统的核心签名验证。 本帖最后由 小骚 于 2019-8-7 13:38 编辑
sumile 发表于 2019-8-7 13:27
幸运破解器也是用这种方式修补APK的,另外还要先修改service.jar破掉系统的核心签名验证。
没错,但是幸运破解器并没有开源吧,我东学西学终于完成这个过程了,接下来就是实现hookClassLoader实现插入代码,或者完成8.0以上的修补办法。虽然没测试过,但是应该不用核心破解,毕竟odex的校验是修复了的 谢谢大佬,前几天我正为这个事情发愁呢。 感谢大神提供新思路 前排支持,我的手机root了哈哈 太强了!顶一个 前排 顶一个! 不迷人 发表于 2019-8-7 13:40
前排 顶一个!
我咋就灌水了 这个方法对360等的加固应该很有用吧