diff --git a/README.md b/README.md index 3170e13fa..0a72b4fe2 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,9 @@ Command line and GUI tools for produce Java source code from Android Dex and Apk ![jadx-gui screenshot](http://skylot.github.io/jadx/jadx-gui.png) +### add by qi +add: check file's type by file header + ### Downloads - [unstable](https://drone.io/github.com/skylot/jadx/files) - from [github](https://github.com/skylot/jadx/releases) diff --git a/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java b/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java index 775210698..1a4e16e77 100644 --- a/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java @@ -11,6 +11,11 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; @@ -100,4 +105,93 @@ public class FileUtils { makeDirsForFile(file); return file; } + + //add by qi + public static String bytesToHex(byte[] bytes) { + char[] hexArray = "0123456789abcdef".toCharArray(); + if (bytes == null || bytes.length <= 0) { + return null; + } + char[] hexChars = new char[bytes.length * 2]; + for ( int j = 0; j < bytes.length; j++ ) { + int v = bytes[j] & 0xFF; + hexChars[j * 2] = hexArray[v >>> 4]; + hexChars[j * 2 + 1] = hexArray[v & 0x0F]; + } + return new String(hexChars); + } + + //add by qi + public static boolean isZipfile(File file) { + boolean isZipfile = false; + InputStream is = null; + try { + byte[] headers = new byte[4]; + is = new FileInputStream(file); + is.read(headers, 0, 4); + System.out.println(bytesToHex(headers)); + String headerString = bytesToHex(headers); + if (headerString.equals("504b0304")) { + isZipfile = true; + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + return isZipfile; + } + + //add by qi + public static List getZipfileList(File file) { + List filelist = new ArrayList(); + ZipFile zipFile = null; + try { + zipFile = new ZipFile(file); + Enumeration entries = zipFile.entries(); + + while(entries.hasMoreElements()){ + ZipEntry entry = entries.nextElement(); + filelist.add(entry.getName()); + System.out.println(entry.getName()); + } + } catch (IOException e) { + e.printStackTrace(); + System.out.println(e.getMessage()); + } + + return filelist; + } + + //add by qi + public static boolean isApkfile(File file) { + boolean isApkfile = false; + if (isZipfile(file)) { + List filelist = getZipfileList(file); + if (filelist.contains("AndroidManifest.xml") && filelist.contains("classes.dex")) { + isApkfile = true; + } + } + return isApkfile; + } + + //add by qi + public static boolean isZipDexfile(File file) { + boolean isZipDexFile = false; + if (isZipfile(file)) { + List filelist = getZipfileList(file); + if (filelist.contains("classes.dex")) { + isZipDexFile = true; + } + } + + return isZipDexFile; + } } diff --git a/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java b/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java index b0b29df8e..c2b0fc2ed 100644 --- a/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java +++ b/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java @@ -15,13 +15,14 @@ import java.util.jar.JarOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; + import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.android.dex.Dex; -import static jadx.core.utils.files.FileUtils.close; +import static jadx.core.utils.files.FileUtils.*; public class InputFile { private static final Logger LOG = LoggerFactory.getLogger(InputFile.class); @@ -44,6 +45,7 @@ public class InputFile { private void searchDexFiles() throws IOException, DecodeException { String fileName = file.getName(); + if (fileName.endsWith(".dex")) { addDexFile(new Dex(file)); return; @@ -52,7 +54,8 @@ public class InputFile { addDexFile(loadFromClassFile(file)); return; } - if (fileName.endsWith(".apk") || fileName.endsWith(".zip")) { + //modifed by qi:add isApkfile() and isZipdexfile() + if (fileName.endsWith(".apk") || fileName.endsWith(".zip") || isApkfile(file) || isZipDexfile(file)) { loadFromZip(".dex"); return; }