add file type detect, jadx file by file's header, not only file's extension
This commit is contained in:
@@ -12,6 +12,9 @@ Command line and GUI tools for produce Java source code from Android Dex and Apk
|
||||
|
||||

|
||||
|
||||
### 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user