|
4 | 4 | import com.storm.wind.xpatch.task.ApkModifyTask;
|
5 | 5 | import com.storm.wind.xpatch.task.BuildAndSignApkTask;
|
6 | 6 | import com.storm.wind.xpatch.task.SaveApkSignatureTask;
|
| 7 | +import com.storm.wind.xpatch.task.SaveOriginalApkTask; |
7 | 8 | import com.storm.wind.xpatch.task.SaveOriginalApplicationNameTask;
|
8 | 9 | import com.storm.wind.xpatch.task.SoAndDexCopyTask;
|
9 | 10 | import com.storm.wind.xpatch.util.FileUtils;
|
|
16 | 17 | import java.io.File;
|
17 | 18 | import java.text.SimpleDateFormat;
|
18 | 19 | import java.util.ArrayList;
|
| 20 | +import java.util.Arrays; |
19 | 21 | import java.util.Date;
|
20 | 22 | import java.util.List;
|
21 | 23 | import java.util.regex.Pattern;
|
@@ -70,6 +72,12 @@ public class MainCommand extends BaseCommand {
|
70 | 72 | @Opt(opt = "w", longOpt = "whale", hasArg = false, description = "Change hook framework to Lody's whale")
|
71 | 73 | private boolean useWhaleHookFramework = false; // 是否使用whale hook框架,默认使用的是SandHook
|
72 | 74 |
|
| 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 | + |
73 | 81 | // 原来apk中dex文件的数量
|
74 | 82 | private int dexFileCount = 0;
|
75 | 83 |
|
@@ -208,9 +216,24 @@ protected void doCommandLine() {
|
208 | 216 | dexFileCount));
|
209 | 217 | }
|
210 | 218 |
|
| 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 | + |
211 | 234 | // 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)); |
214 | 237 |
|
215 | 238 | // compress all files into an apk and then sign it.
|
216 | 239 | mXpatchTasks.add(new BuildAndSignApkTask(keepBuildFiles, unzipApkFilePath, output, apkPath));
|
|
0 commit comments