Commit 467f729f authored by 齐振芳's avatar 齐振芳

add file type detect, jadx file by file's header, not only file's extension

parent b2f41e95
......@@ -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)
......
......@@ -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<String> getZipfileList(File file) {
List<String> filelist = new ArrayList<String>();
ZipFile zipFile = null;
try {
zipFile = new ZipFile(file);
Enumeration<? extends ZipEntry> 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<String> 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<String> filelist = getZipfileList(file);
if (filelist.contains("classes.dex")) {
isZipDexFile = true;
}
}
return isZipDexFile;
}
}
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment