Skip to content

Commit b8d32bf

Browse files
author
WindySha
committed
add command to bypass apk file check
1 parent 1356de7 commit b8d32bf

File tree

3 files changed

+66
-2
lines changed

3 files changed

+66
-2
lines changed
Binary file not shown.

xpatch/src/main/java/com/storm/wind/xpatch/MainCommand.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.storm.wind.xpatch.task.ApkModifyTask;
55
import com.storm.wind.xpatch.task.BuildAndSignApkTask;
66
import com.storm.wind.xpatch.task.SaveApkSignatureTask;
7+
import com.storm.wind.xpatch.task.SaveOriginalApkTask;
78
import com.storm.wind.xpatch.task.SaveOriginalApplicationNameTask;
89
import com.storm.wind.xpatch.task.SoAndDexCopyTask;
910
import com.storm.wind.xpatch.util.FileUtils;
@@ -16,6 +17,7 @@
1617
import java.io.File;
1718
import java.text.SimpleDateFormat;
1819
import java.util.ArrayList;
20+
import java.util.Arrays;
1921
import java.util.Date;
2022
import java.util.List;
2123
import java.util.regex.Pattern;
@@ -70,6 +72,12 @@ public class MainCommand extends BaseCommand {
7072
@Opt(opt = "w", longOpt = "whale", hasArg = false, description = "Change hook framework to Lody's whale")
7173
private boolean useWhaleHookFramework = false; // 是否使用whale hook框架,默认使用的是SandHook
7274

75+
@Opt(opt = "hap", longOpt = "hookApkPath", hasArg = false, description = "Hook the apk installled path, " +
76+
"original apk will be replaced in the apk installed path, " +
77+
"to bypass apk completeness check. " +
78+
"This will pack original apk into the new apk and the size will be twice of original one.")
79+
private boolean hookInstalledApkPath = false; // 是否hook apk安装路径,使得绕过app对apk的校验
80+
7381
// 原来apk中dex文件的数量
7482
private int dexFileCount = 0;
7583

@@ -208,9 +216,24 @@ protected void doCommandLine() {
208216
dexFileCount));
209217
}
210218

219+
String[] userInsertModule = getXposedModules(xposedModules);
220+
List<String> xposedModuleList = new ArrayList<>();
221+
222+
if (hookInstalledApkPath) {
223+
mXpatchTasks.add(new SaveOriginalApkTask(apkPath, unzipApkFilePath));
224+
225+
// Load the xposed module that hook the apk installed path
226+
String dstXposedModulePath = (unzipApkFilePath + SaveOriginalApkTask.XPOSED_MODULE_ASSET_PATH).replace("/", File.separator);
227+
xposedModuleList.add(dstXposedModulePath);
228+
}
229+
230+
if (userInsertModule != null && userInsertModule.length > 0) {
231+
xposedModuleList.addAll(Arrays.asList(userInsertModule));
232+
}
233+
211234
// copy xposed so and dex files into the unzipped apk
212-
mXpatchTasks.add(new SoAndDexCopyTask(dexFileCount, unzipApkFilePath,
213-
getXposedModules(xposedModules), useWhaleHookFramework));
235+
mXpatchTasks.add(new SoAndDexCopyTask(dexFileCount, unzipApkFilePath, xposedModuleList.toArray(new String[0])
236+
, useWhaleHookFramework));
214237

215238
// compress all files into an apk and then sign it.
216239
mXpatchTasks.add(new BuildAndSignApkTask(keepBuildFiles, unzipApkFilePath, output, apkPath));
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.storm.wind.xpatch.task;
2+
3+
import com.storm.wind.xpatch.util.FileUtils;
4+
5+
import java.io.File;
6+
7+
/**
8+
* Created by Windysha
9+
* This is used to copy original apk into the apk asset directory, so another xposed module can use it to by pass apk check.
10+
*/
11+
public class SaveOriginalApkTask implements Runnable {
12+
13+
private final String apkPath;
14+
private String dstApkFilePath;
15+
private String dstXposedModulePath;
16+
17+
private static final String ORIGINAL_APK_ASSET_PATH = "assets/xpatch_asset/original_apk/base.apk";
18+
public static final String XPOSED_MODULE_ASSET_PATH = "assets/xpatch_asset/original_apk/xposedmodule.apk";
19+
20+
public SaveOriginalApkTask(String apkPath, String unzipApkFilePath) {
21+
this.apkPath = apkPath;
22+
this.dstApkFilePath = (unzipApkFilePath + ORIGINAL_APK_ASSET_PATH).replace("/", File.separator);
23+
this.dstXposedModulePath = (unzipApkFilePath + XPOSED_MODULE_ASSET_PATH).replace("/", File.separator);
24+
}
25+
26+
@Override
27+
public void run() {
28+
ensureDstFileCreated();
29+
FileUtils.copyFile(apkPath, dstApkFilePath);
30+
31+
String moduleAssetPath = "assets/xposedmodule/hook_apk_path_module.apk";
32+
FileUtils.copyFileFromJar(moduleAssetPath, dstXposedModulePath);
33+
}
34+
35+
private void ensureDstFileCreated() {
36+
File dstParentFile = new File(dstApkFilePath);
37+
if (!dstParentFile.getParentFile().exists()) {
38+
dstParentFile.getParentFile().mkdirs();
39+
}
40+
}
41+
}

0 commit comments

Comments
 (0)