Skip to content

Commit 35ce8fc

Browse files
authored
Issue 2943 - Support raw disassembly w/ AndResGuard (#2944)
* fix: allow copying r/R if in raw mode * test: assert raw files disassembled from AndResGuard
1 parent e32309c commit 35ce8fc

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

brut.apktool/apktool-lib/src/main/java/brut/androlib/Androlib.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -842,7 +842,7 @@ public void close() throws IOException {
842842
private final static String APK_DIRNAME = "build/apk";
843843
private final static String UNK_DIRNAME = "unknown";
844844
private final static String[] APK_RESOURCES_FILENAMES = new String[] {
845-
"resources.arsc", "AndroidManifest.xml", "res" };
845+
"resources.arsc", "AndroidManifest.xml", "res", "r", "R" };
846846
private final static String[] APK_RESOURCES_WITHOUT_RES_FILENAMES = new String[] {
847847
"resources.arsc", "AndroidManifest.xml" };
848848
private final static String[] APP_RESOURCES_FILENAMES = new String[] {

brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/AndResGuardTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,18 @@ public void checkifAndResDecodeRemapsRFolder() throws BrutException, IOException
5656
File aPng = new File(sTestOrigDir,"res/mipmap-hdpi-v4/a.png");
5757
assertTrue(aPng.isFile());
5858
}
59+
60+
@Test
61+
public void checkifAndResDecodeRemapsRFolderInRawMode() throws BrutException, IOException {
62+
String apk = "issue1170.apk";
63+
ApkDecoder apkDecoder = new ApkDecoder(new File(sTmpDir + File.separator + apk));
64+
sTestOrigDir = new ExtFile(sTmpDir + File.separator + apk + ".raw.out");
65+
66+
apkDecoder.setOutDir(new File(sTmpDir + File.separator + apk + ".raw.out"));
67+
apkDecoder.setDecodeResources(ApkDecoder.DECODE_RESOURCES_NONE);
68+
apkDecoder.decode();
69+
70+
File aPng = new File(sTestOrigDir,"r/a/a.png");
71+
assertTrue(aPng.isFile());
72+
}
5973
}

brut.j.dir/src/main/java/brut/directory/DirUtil.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import brut.util.BrutIO;
2424
import brut.util.OS;
2525
import java.io.*;
26+
import java.nio.file.Files;
2627
import java.util.logging.Logger;
2728

2829
public class DirUtil {
@@ -84,14 +85,13 @@ public static void copyToDir(Directory in, File out, String fileName)
8485
if (in.containsDir(fileName)) {
8586
OS.rmdir(new File(out, fileName));
8687
in.getDir(fileName).copyToDir(new File(out, fileName));
88+
} else if (!in.containsDir(fileName) && !in.containsFile(fileName)) {
89+
// Skip copies of directories/files not found.
8790
} else {
88-
if (fileName.equals("res") && !in.containsFile(fileName)) {
89-
return;
90-
}
9191
String cleanedFilename = BrutIO.sanitizeUnknownFile(out, fileName);
9292
File outFile = new File(out, cleanedFilename);
9393
outFile.getParentFile().mkdirs();
94-
BrutIO.copyAndClose(in.getFileInput(fileName), new FileOutputStream(outFile));
94+
BrutIO.copyAndClose(in.getFileInput(fileName), Files.newOutputStream(outFile.toPath()));
9595
}
9696
} catch (RootUnknownFileException | InvalidUnknownFileException | TraversalUnknownFileException exception) {
9797
LOGGER.warning(String.format("Skipping file %s (%s)", fileName, exception.getMessage()));

0 commit comments

Comments
 (0)