From 467f729f067f712f57b3d8ff52c75fa3ee7d3728 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BD=90=E6=8C=AF=E8=8A=B3?= Date: Thu, 28 Apr 2016 16:25:14 +0800 Subject: [PATCH 1/2] add file type detect, jadx file by file's header, not only file's extension --- README.md | 3 + .../java/jadx/core/utils/files/FileUtils.java | 94 +++++++++++++++++++ .../java/jadx/core/utils/files/InputFile.java | 7 +- 3 files changed, 102 insertions(+), 2 deletions(-) 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; } From b4472fd7d413e583b084adb1dd845dbc9a2686e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BD=90=E6=8C=AF=E8=8A=B3?= Date: Mon, 2 May 2016 09:03:25 +0800 Subject: [PATCH 2/2] delete comments --- .DS_Store | Bin 0 -> 6148 bytes README.md | 2 -- .../java/jadx/core/utils/files/FileUtils.java | 5 ----- .../java/jadx/core/utils/files/InputFile.java | 2 +- 4 files changed, 1 insertion(+), 8 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a4460729bb4ff35bc07d7b4b5206e2aa8acbbb42 GIT binary patch literal 6148 zcmeHKyH3ME5S)b|S)xfvc|SnGA6QZN0)7AzH$j$Cph%Ri_%1$;*$0K?Af=&!S!r+X z_IB=cQ+T}qY;zhOfHi=Q?uZW`mgf8J3%ja_qs1A+@U|a!$K%N5W#-%)>~O*XBWC;# zuXw?Lcidyo&BOQMmz}IEDIf);fE17dQsA5dRiwMybDN4u0V(jW74YvvqdWG6Q(}BN zI7ACTTrnKRdGr#*<^f_~I3+Sdv!oJ}YSm&`(iv}+*B4HSNr%PFJg089>QF3hXS_u^ ztWVS^1*E`Sf$LnZz5YMaf9U_`B(0=?6!=pL*lPQ<-SA0OTNjV>THEN)bkF&uyKx>A n4pEMYQI5Ira(ov_nb&;I{l0KY3_9aMC+cUwb&*Md-&WuY#*rHp literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 0a72b4fe2..7274c58f2 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,6 @@ 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) 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 1a4e16e77..09c8536c0 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 @@ -106,7 +106,6 @@ public class FileUtils { return file; } - //add by qi public static String bytesToHex(byte[] bytes) { char[] hexArray = "0123456789abcdef".toCharArray(); if (bytes == null || bytes.length <= 0) { @@ -121,7 +120,6 @@ public class FileUtils { return new String(hexChars); } - //add by qi public static boolean isZipfile(File file) { boolean isZipfile = false; InputStream is = null; @@ -149,7 +147,6 @@ public class FileUtils { return isZipfile; } - //add by qi public static List getZipfileList(File file) { List filelist = new ArrayList(); ZipFile zipFile = null; @@ -170,7 +167,6 @@ public class FileUtils { return filelist; } - //add by qi public static boolean isApkfile(File file) { boolean isApkfile = false; if (isZipfile(file)) { @@ -182,7 +178,6 @@ public class FileUtils { return isApkfile; } - //add by qi public static boolean isZipDexfile(File file) { boolean isZipDexFile = false; if (isZipfile(file)) { 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 c2b0fc2ed..bb32bab47 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 @@ -54,7 +54,7 @@ public class InputFile { addDexFile(loadFromClassFile(file)); return; } - //modifed by qi:add isApkfile() and isZipdexfile() + if (fileName.endsWith(".apk") || fileName.endsWith(".zip") || isApkfile(file) || isZipDexfile(file)) { loadFromZip(".dex"); return;