Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2301_76393173
jadx
提交
1832f2ae
J
jadx
项目概览
2301_76393173
/
jadx
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jadx
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
1832f2ae
编写于
4月 21, 2022
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: allow to load custom input (#1457)
上级
1ec127c3
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
74 addition
and
21 deletion
+74
-21
jadx-core/build.gradle
jadx-core/build.gradle
+1
-1
jadx-core/src/main/java/jadx/api/JadxArgsValidator.java
jadx-core/src/main/java/jadx/api/JadxArgsValidator.java
+17
-13
jadx-core/src/main/java/jadx/api/JadxDecompiler.java
jadx-core/src/main/java/jadx/api/JadxDecompiler.java
+12
-1
jadx-core/src/test/java/jadx/api/JadxArgsValidatorOutDirsTest.java
.../src/test/java/jadx/api/JadxArgsValidatorOutDirsTest.java
+1
-1
jadx-core/src/test/java/jadx/api/JadxDecompilerTest.java
jadx-core/src/test/java/jadx/api/JadxDecompilerTest.java
+18
-0
jadx-core/src/test/resources/test-samples/hello.dex
jadx-core/src/test/resources/test-samples/hello.dex
+0
-0
jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/DexFileLoader.java
...t/src/main/java/jadx/plugins/input/dex/DexFileLoader.java
+8
-4
jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/DexInputPlugin.java
.../src/main/java/jadx/plugins/input/dex/DexInputPlugin.java
+17
-0
jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/DexLoadResult.java
...t/src/main/java/jadx/plugins/input/dex/DexLoadResult.java
+0
-1
未找到文件。
jadx-core/build.gradle
浏览文件 @
1832f2ae
...
...
@@ -14,7 +14,7 @@ dependencies {
testImplementation
'org.apache.commons:commons-lang3:3.12.0'
test
RuntimeOnly
(
project
(
':jadx-plugins:jadx-dex-input'
))
test
Implementation
(
project
(
':jadx-plugins:jadx-dex-input'
))
testRuntimeOnly
(
project
(
':jadx-plugins:jadx-smali-input'
))
testRuntimeOnly
(
project
(
':jadx-plugins:jadx-java-convert'
))
testRuntimeOnly
(
project
(
':jadx-plugins:jadx-java-input'
))
...
...
jadx-core/src/main/java/jadx/api/JadxArgsValidator.java
浏览文件 @
1832f2ae
...
...
@@ -13,8 +13,9 @@ public class JadxArgsValidator {
private
static
final
Logger
LOG
=
LoggerFactory
.
getLogger
(
JadxArgsValidator
.
class
);
public
static
void
validate
(
JadxArgs
args
)
{
checkInputFiles
(
args
);
public
static
void
validate
(
JadxDecompiler
jadx
)
{
JadxArgs
args
=
jadx
.
getArgs
();
checkInputFiles
(
jadx
,
args
);
validateOutDirs
(
args
);
if
(
LOG
.
isDebugEnabled
())
{
...
...
@@ -22,9 +23,9 @@ public class JadxArgsValidator {
}
}
private
static
void
checkInputFiles
(
JadxArgs
args
)
{
private
static
void
checkInputFiles
(
Jadx
Decompiler
jadx
,
Jadx
Args
args
)
{
List
<
File
>
inputFiles
=
args
.
getInputFiles
();
if
(
inputFiles
.
isEmpty
())
{
if
(
inputFiles
.
isEmpty
()
&&
jadx
.
getCustomLoads
().
isEmpty
()
)
{
throw
new
JadxArgsValidateException
(
"Please specify input file"
);
}
for
(
File
inputFile
:
inputFiles
)
{
...
...
@@ -66,19 +67,22 @@ public class JadxArgsValidator {
@NotNull
private
static
File
makeDirFromInput
(
JadxArgs
args
)
{
File
outDir
;
String
outDirName
;
File
file
=
args
.
getInputFiles
().
get
(
0
);
String
name
=
file
.
getName
();
int
pos
=
name
.
lastIndexOf
(
'.'
);
if
(
pos
!=
-
1
)
{
outDirName
=
name
.
substring
(
0
,
pos
);
List
<
File
>
inputFiles
=
args
.
getInputFiles
();
if
(
inputFiles
.
isEmpty
())
{
outDirName
=
JadxArgs
.
DEFAULT_OUT_DIR
;
}
else
{
outDirName
=
name
+
'-'
+
JadxArgs
.
DEFAULT_OUT_DIR
;
File
file
=
inputFiles
.
get
(
0
);
String
name
=
file
.
getName
();
int
pos
=
name
.
lastIndexOf
(
'.'
);
if
(
pos
!=
-
1
)
{
outDirName
=
name
.
substring
(
0
,
pos
);
}
else
{
outDirName
=
name
+
'-'
+
JadxArgs
.
DEFAULT_OUT_DIR
;
}
}
LOG
.
info
(
"output directory: {}"
,
outDirName
);
outDir
=
new
File
(
outDirName
);
return
outDir
;
return
new
File
(
outDirName
);
}
private
static
void
checkFile
(
File
file
)
{
...
...
jadx-core/src/main/java/jadx/api/JadxDecompiler.java
浏览文件 @
1832f2ae
...
...
@@ -98,6 +98,8 @@ public final class JadxDecompiler implements Closeable {
private
final
IDecompileScheduler
decompileScheduler
=
new
DecompilerScheduler
(
this
);
private
final
List
<
ILoadResult
>
customLoads
=
new
ArrayList
<>();
public
JadxDecompiler
()
{
this
(
new
JadxArgs
());
}
...
...
@@ -108,7 +110,7 @@ public final class JadxDecompiler implements Closeable {
public
void
load
()
{
reset
();
JadxArgsValidator
.
validate
(
arg
s
);
JadxArgsValidator
.
validate
(
thi
s
);
LOG
.
info
(
"loading ..."
);
loadPlugins
(
args
);
loadInputFiles
();
...
...
@@ -132,11 +134,20 @@ public final class JadxDecompiler implements Closeable {
loadedInputs
.
add
(
loadResult
);
}
}
loadedInputs
.
addAll
(
customLoads
);
if
(
LOG
.
isDebugEnabled
())
{
LOG
.
debug
(
"Loaded using {} inputs plugin in {} ms"
,
loadedInputs
.
size
(),
System
.
currentTimeMillis
()
-
start
);
}
}
public
void
addCustomLoad
(
ILoadResult
customLoad
)
{
customLoads
.
add
(
customLoad
);
}
public
List
<
ILoadResult
>
getCustomLoads
()
{
return
customLoads
;
}
private
void
reset
()
{
root
=
null
;
classes
=
null
;
...
...
jadx-core/src/test/java/jadx/api/JadxArgsValidatorOutDirsTest.java
浏览文件 @
1832f2ae
...
...
@@ -57,7 +57,7 @@ public class JadxArgsValidatorOutDirsTest {
}
private
void
checkOutDirs
(
String
outDir
,
String
srcDir
,
String
resDir
)
{
JadxArgsValidator
.
validate
(
args
);
JadxArgsValidator
.
validate
(
new
JadxDecompiler
(
args
)
);
LOG
.
debug
(
"Got dirs: out={}, src={}, res={}"
,
args
.
getOutDir
(),
args
.
getOutDirSrc
(),
args
.
getOutDirRes
());
assertThat
(
args
.
getOutDir
(),
is
(
toFile
(
outDir
)));
assertThat
(
args
.
getOutDirSrc
(),
is
(
toFile
(
srcDir
)));
...
...
jadx-core/src/test/java/jadx/api/JadxDecompilerTest.java
浏览文件 @
1832f2ae
package
jadx.api
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.net.URL
;
import
org.hamcrest.Matchers
;
import
org.junit.jupiter.api.Test
;
import
jadx.core.utils.files.FileUtils
;
import
jadx.plugins.input.dex.DexInputPlugin
;
import
static
org
.
hamcrest
.
MatcherAssert
.
assertThat
;
import
static
org
.
hamcrest
.
Matchers
.
notNullValue
;
...
...
@@ -38,6 +42,20 @@ public class JadxDecompilerTest {
}
}
@Test
public
void
testDirectDexInput
()
throws
IOException
{
try
(
JadxDecompiler
jadx
=
new
JadxDecompiler
();
InputStream
in
=
new
FileInputStream
(
getFileFromSampleDir
(
"hello.dex"
)))
{
jadx
.
addCustomLoad
(
new
DexInputPlugin
().
loadDexFromInputStream
(
in
,
"input"
));
jadx
.
load
();
for
(
JavaClass
cls
:
jadx
.
getClasses
())
{
System
.
out
.
println
(
cls
.
getCode
());
}
assertThat
(
jadx
.
getClasses
(),
Matchers
.
hasSize
(
1
));
assertThat
(
jadx
.
getErrorsCount
(),
Matchers
.
is
(
0
));
}
}
private
static
final
String
TEST_SAMPLES_DIR
=
"test-samples/"
;
public
static
File
getFileFromSampleDir
(
String
fileName
)
{
...
...
jadx-core/src/test/resources/test-samples/hello.dex
0 → 100644
浏览文件 @
1832f2ae
文件已添加
jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/DexFileLoader.java
浏览文件 @
1832f2ae
...
...
@@ -64,10 +64,7 @@ public class DexFileLoader {
if
(
isStartWithBytes
(
magic
,
DexConsts
.
DEX_FILE_MAGIC
)
||
fileName
.
endsWith
(
".dex"
))
{
in
.
reset
();
byte
[]
content
=
readAllBytes
(
in
);
if
(
options
.
isVerifyChecksum
())
{
DexCheckSum
.
verify
(
content
);
}
DexReader
dexReader
=
new
DexReader
(
getNextUniqId
(),
fileName
,
content
);
DexReader
dexReader
=
loadDexReader
(
fileName
,
content
);
return
Collections
.
singletonList
(
dexReader
);
}
if
(
file
!=
null
)
{
...
...
@@ -80,6 +77,13 @@ public class DexFileLoader {
}
}
public
DexReader
loadDexReader
(
String
fileName
,
byte
[]
content
)
{
if
(
options
.
isVerifyChecksum
())
{
DexCheckSum
.
verify
(
content
);
}
return
new
DexReader
(
getNextUniqId
(),
fileName
,
content
);
}
private
List
<
DexReader
>
collectDexFromZip
(
File
file
)
{
List
<
DexReader
>
result
=
new
ArrayList
<>();
try
{
...
...
jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/DexInputPlugin.java
浏览文件 @
1832f2ae
package
jadx.plugins.input.dex
;
import
java.io.Closeable
;
import
java.io.InputStream
;
import
java.nio.file.Path
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.Map
;
...
...
@@ -13,6 +15,7 @@ import jadx.api.plugins.input.data.ILoadResult;
import
jadx.api.plugins.input.data.impl.EmptyLoadResult
;
import
jadx.api.plugins.options.JadxPluginOptions
;
import
jadx.api.plugins.options.OptionDescription
;
import
jadx.api.plugins.utils.CommonFileUtils
;
public
class
DexInputPlugin
implements
JadxInputPlugin
,
JadxPluginOptions
{
public
static
final
String
PLUGIN_ID
=
"dex-input"
;
...
...
@@ -38,6 +41,20 @@ public class DexInputPlugin implements JadxInputPlugin, JadxPluginOptions {
return
new
DexLoadResult
(
dexReaders
,
closeable
);
}
public
ILoadResult
loadDex
(
byte
[]
content
,
@Nullable
String
fileName
)
{
String
fileLabel
=
fileName
==
null
?
"input.dex"
:
fileName
;
DexReader
dexReader
=
loader
.
loadDexReader
(
fileLabel
,
content
);
return
new
DexLoadResult
(
Collections
.
singletonList
(
dexReader
),
null
);
}
public
ILoadResult
loadDexFromInputStream
(
InputStream
in
,
@Nullable
String
fileLabel
)
{
try
{
return
loadDex
(
CommonFileUtils
.
loadBytes
(
in
),
fileLabel
);
}
catch
(
Exception
e
)
{
throw
new
DexException
(
"Failed to read input stream"
,
e
);
}
}
@Override
public
void
setOptions
(
Map
<
String
,
String
>
options
)
{
this
.
options
.
apply
(
options
);
...
...
jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/DexLoadResult.java
浏览文件 @
1832f2ae
...
...
@@ -34,7 +34,6 @@ public class DexLoadResult implements ILoadResult {
@Override
public
void
close
()
throws
IOException
{
dexReaders
.
clear
();
if
(
closeable
!=
null
)
{
closeable
.
close
();
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录