Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2301_76393173
jadx
提交
1ce3fc97
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,体验更适合开发者的 AI 搜索 >>
未验证
提交
1ce3fc97
编写于
8月 22, 2021
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: improve disassemble view for java-input
上级
9ea3f0f2
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
115 addition
and
38 deletion
+115
-38
jadx-gui/src/main/java/jadx/gui/device/debugger/smali/Smali.java
...i/src/main/java/jadx/gui/device/debugger/smali/Smali.java
+41
-20
jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/insns/DexInsnData.java
...c/main/java/jadx/plugins/input/dex/insns/DexInsnData.java
+5
-0
jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/insns/DexInsnMnemonics.java
...n/java/jadx/plugins/input/dex/insns/DexInsnMnemonics.java
+23
-12
jadx-plugins/jadx-java-input/build.gradle
jadx-plugins/jadx-java-input/build.gradle
+4
-0
jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/code/JavaCodeReader.java
...ava/jadx/plugins/input/java/data/code/JavaCodeReader.java
+4
-3
jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/code/JavaInsnData.java
.../java/jadx/plugins/input/java/data/code/JavaInsnData.java
+14
-1
jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/utils/DisasmUtils.java
.../main/java/jadx/plugins/input/java/utils/DisasmUtils.java
+17
-2
jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/impl/CallSite.java
.../main/java/jadx/api/plugins/input/data/impl/CallSite.java
+5
-0
jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/insns/InsnData.java
.../src/main/java/jadx/api/plugins/input/insns/InsnData.java
+2
-0
未找到文件。
jadx-gui/src/main/java/jadx/gui/device/debugger/smali/Smali.java
浏览文件 @
1ce3fc97
...
...
@@ -7,6 +7,7 @@ import java.util.Collections;
import
java.util.HashMap
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.Locale
;
import
java.util.Map
;
import
java.util.Map.Entry
;
...
...
@@ -72,6 +73,8 @@ public class Smali {
private
final
boolean
printFileOffset
=
true
;
private
final
boolean
printBytecode
=
true
;
private
boolean
isJavaBytecode
;
private
Smali
()
{
}
...
...
@@ -79,6 +82,7 @@ public class Smali {
cls
=
cls
.
getTopParentClass
();
SmaliWriter
code
=
new
SmaliWriter
(
cls
);
Smali
smali
=
new
Smali
();
smali
.
isJavaBytecode
=
cls
.
getInputFileName
().
endsWith
(
".class"
);
// TODO: add flag to api
smali
.
writeClass
(
code
,
cls
);
smali
.
codeInfo
=
code
.
finish
();
return
smali
;
...
...
@@ -334,33 +338,41 @@ public class Smali {
}
private
void
formatInsn
(
InsnData
insn
,
InsnNode
node
,
LineInfo
line
)
{
line
.
getLineWriter
().
delete
(
0
,
line
.
getLineWriter
().
length
());
StringBuilder
lw
=
line
.
getLineWriter
();
lw
.
delete
(
0
,
lw
.
length
());
fmtCols
(
insn
,
line
);
if
(
fmtPayloadInsn
(
insn
,
line
))
{
return
;
}
line
.
getLineWriter
()
.
append
(
String
.
format
(
FMT_INSN_COL
,
MNEMONIC
.
MNEMONICS
[
getOpenCodeByte
(
insn
)]))
.
append
(
" "
);
lw
.
append
(
formatInsnName
(
insn
)).
append
(
" "
);
fmtRegs
(
insn
,
node
.
getType
(),
line
);
if
(!
tryFormatTargetIns
(
insn
,
node
.
getType
(),
line
))
{
if
(
hasLiteral
(
insn
))
{
l
ine
.
getLineWriter
()
.
append
(
", "
).
append
(
literal
(
insn
));
l
w
.
append
(
", "
).
append
(
literal
(
insn
));
}
else
if
(
node
.
getType
()
==
InsnType
.
INVOKE
)
{
l
ine
.
getLineWriter
()
.
append
(
", "
).
append
(
method
(
insn
));
l
w
.
append
(
", "
).
append
(
method
(
insn
));
}
else
if
(
insn
.
getIndexType
()
==
InsnIndexType
.
FIELD_REF
)
{
l
ine
.
getLineWriter
()
.
append
(
", "
).
append
(
field
(
insn
));
l
w
.
append
(
", "
).
append
(
field
(
insn
));
}
else
if
(
insn
.
getIndexType
()
==
InsnIndexType
.
STRING_REF
)
{
l
ine
.
getLineWriter
()
.
append
(
", "
).
append
(
str
(
insn
));
l
w
.
append
(
", "
).
append
(
str
(
insn
));
}
else
if
(
insn
.
getIndexType
()
==
InsnIndexType
.
TYPE_REF
)
{
l
ine
.
getLineWriter
()
.
append
(
", "
).
append
(
type
(
insn
));
l
w
.
append
(
", "
).
append
(
type
(
insn
));
}
else
if
(
insn
.
getOpcode
()
==
CONST_METHOD_HANDLE
)
{
l
ine
.
getLineWriter
()
.
append
(
", "
).
append
(
methodHandle
(
insn
));
l
w
.
append
(
", "
).
append
(
methodHandle
(
insn
));
}
else
if
(
insn
.
getOpcode
()
==
CONST_METHOD_TYPE
)
{
l
ine
.
getLineWriter
()
.
append
(
", "
).
append
(
proto
(
insn
,
insn
.
getIndex
()));
l
w
.
append
(
", "
).
append
(
proto
(
insn
,
insn
.
getIndex
()));
}
}
line
.
addInsnLine
(
insn
.
getOffset
(),
line
.
getLineWriter
().
toString
());
line
.
addInsnLine
(
insn
.
getOffset
(),
lw
.
toString
());
}
private
String
formatInsnName
(
InsnData
insn
)
{
if
(
isJavaBytecode
)
{
// add api opcode, because registers not used
return
String
.
format
(
"%-"
+
INSN_COL_WIDTH
+
"s | %-15s"
,
insn
.
getOpcodeMnemonic
(),
insn
.
getOpcode
().
name
().
toLowerCase
(
Locale
.
ROOT
).
replace
(
'_'
,
'-'
));
}
return
String
.
format
(
FMT_INSN_COL
,
insn
.
getOpcodeMnemonic
());
}
private
boolean
tryFormatTargetIns
(
InsnData
insn
,
InsnType
insnType
,
LineInfo
line
)
{
...
...
@@ -647,23 +659,30 @@ public class Smali {
private
void
fmtRegs
(
InsnData
insn
,
InsnType
insnType
,
LineInfo
line
)
{
boolean
appendBrace
=
insnType
==
InsnType
.
INVOKE
||
isRegList
(
insn
);
StringBuilder
lw
=
line
.
getLineWriter
();
if
(
insnType
==
InsnType
.
INVOKE
)
{
int
resultReg
=
insn
.
getResultReg
();
if
(
resultReg
!=
-
1
)
{
lw
.
append
(
line
.
getRegName
(
resultReg
)).
append
(
" <= "
);
}
}
if
(
appendBrace
)
{
l
ine
.
getLineWriter
()
.
append
(
"{"
);
l
w
.
append
(
"{"
);
}
if
(
isRangeRegIns
(
insn
))
{
l
ine
.
getLineWriter
()
.
append
(
line
.
getRegName
(
insn
.
getReg
(
0
)))
l
w
.
append
(
line
.
getRegName
(
insn
.
getReg
(
0
)))
.
append
(
" .. "
)
.
append
(
line
.
getRegName
(
insn
.
getReg
(
insn
.
getRegsCount
()
-
1
)));
}
else
if
(
insn
.
getRegsCount
()
>
0
)
{
for
(
int
i
=
0
;
i
<
insn
.
getRegsCount
();
i
++)
{
if
(
i
>
0
)
{
l
ine
.
getLineWriter
()
.
append
(
", "
);
l
w
.
append
(
", "
);
}
l
ine
.
getLineWriter
()
.
append
(
line
.
getRegName
(
insn
.
getReg
(
i
)));
l
w
.
append
(
line
.
getRegName
(
insn
.
getReg
(
i
)));
}
}
if
(
appendBrace
)
{
l
ine
.
getLineWriter
()
.
append
(
"}"
);
l
w
.
append
(
"}"
);
}
}
...
...
@@ -692,9 +711,11 @@ public class Smali {
private
void
formatByteCode
(
StringBuilder
smali
,
byte
[]
bytes
)
{
int
maxLen
=
Math
.
min
(
bytes
.
length
,
4
*
2
);
// limit to 4 units
StringBuilder
inHex
=
new
StringBuilder
();
for
(
int
i
=
0
;
i
<
maxLen
-
1
;
i
+=
2
)
{
int
temp
=
((
bytes
[
i
]
&
0xff
)
<<
8
)
|
(
bytes
[
i
+
1
]
&
0xff
);
inHex
.
append
(
String
.
format
(
"%04x "
,
temp
));
for
(
int
i
=
0
;
i
<
maxLen
;
i
++)
{
inHex
.
append
(
String
.
format
(
"%02x"
,
bytes
[
i
]));
if
(
i
%
2
==
1
)
{
inHex
.
append
(
' '
);
}
}
smali
.
append
(
String
.
format
(
FMT_BYTECODE_COL
,
inHex
));
if
(
maxLen
<
bytes
.
length
)
{
...
...
jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/insns/DexInsnData.java
浏览文件 @
1ce3fc97
...
...
@@ -66,6 +66,11 @@ public class DexInsnData implements InsnData {
return
info
.
getApiOpcode
();
}
@Override
public
String
getOpcodeMnemonic
()
{
return
DexInsnMnemonics
.
get
(
opcodeUnit
);
}
@Override
public
byte
[]
getByteCode
()
{
return
externalReader
.
getByteCode
(
insnStart
,
length
*
2
);
// a unit is 2 bytes
...
...
jadx-
gui/src/main/java/jadx/gui/device/debugger/smali/MNEMONIC
.java
→
jadx-
plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/insns/DexInsnMnemonics
.java
浏览文件 @
1ce3fc97
package
jadx.
gui.device.debugger.smali
;
package
jadx.
plugins.input.dex.insns
;
public
class
MNEMONIC
{
public
static
final
String
[]
MNEMONICS
=
new
String
[]
{
"nop"
,
"move"
,
"move/from16"
,
"move/16"
,
"move-wide"
,
public
class
DexInsnMnemonics
{
public
static
String
get
(
int
opcode
)
{
return
MNEMONICS
[
opcode
&
0xFF
];
}
private
static
final
String
[]
MNEMONICS
=
new
String
[]
{
"nop"
,
"move"
,
"move/from16"
,
"move/16"
,
"move-wide"
,
"move-wide/from16"
,
"move-wide/16"
,
"move-object"
,
"move-object/from16"
,
"move-object/16"
,
"move-result"
,
"move-result-wide"
,
"move-result-object"
,
"move-exception"
,
"return-void"
,
"return"
,
"return-wide"
,
"return-object"
,
"const/4"
,
"const/16"
,
"const"
,
"const/high16"
,
"const-wide/16"
,
"const-wide/32"
,
"const-wide"
,
"return"
,
"return-wide"
,
"return-object"
,
"const
/4"
,
"const/16"
,
"const
"
,
"const/high16"
,
"const-wide/16"
,
"const-wide/32"
,
"const-wide"
,
"const-wide/high16"
,
"const-string"
,
"const-string/jumbo"
,
"const-class"
,
"monitor-enter"
,
"monitor-exit"
,
"check-cast"
,
"instance-of"
,
"array-length"
,
"new-instance"
,
"new-array"
,
"filled-new-array"
,
"filled-new-array/range"
,
"fill-array-data"
,
"throw"
,
"goto"
,
"goto/16"
,
"goto/32"
,
"packed-switch"
,
"sparse-switch"
,
"goto"
,
"goto/16"
,
"goto/32"
,
"packed-switch"
,
"sparse-switch"
,
"cmpl-float"
,
"cmpg-float"
,
"cmpl-double"
,
"cmpg-double"
,
"cmp-long"
,
"if-eq"
,
"if-ne"
,
"if-lt"
,
"if-ge"
,
"if-gt"
,
"if-
le"
,
"if-eqz"
,
"if-nez"
,
"if-ltz"
,
"if-g
ez"
,
"
if-gtz"
,
"if-lez
"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"
(unused)"
,
"(unused)"
,
"(unused)"
,
"
aget"
,
"aget-wide"
,
"if-eq"
,
"if-ne"
,
"if-lt"
,
"if-ge"
,
"if-gt"
,
"if-le"
,
"if-
eqz"
,
"if-nez"
,
"if-ltz"
,
"if-gez"
,
"if-gtz"
,
"if-l
ez"
,
"
(unused)"
,
"(unused)"
,
"(unused)
"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"aget"
,
"aget-wide"
,
"aget-object"
,
"aget-boolean"
,
"aget-byte"
,
"aget-char"
,
"aget-short"
,
"aput"
,
"aput-wide"
,
"aput-object"
,
"aput-boolean"
,
"aput-byte"
,
"aput-char"
,
"aput-short"
,
"iget"
,
"iget-wide"
,
"iget-object"
,
...
...
@@ -52,6 +59,10 @@ public class MNEMONIC {
"(unused)"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"(unused)"
,
"invoke-polymorphic"
,
"invoke-polymorphic/range"
,
"invoke-custom"
,
"invoke-custom/range"
,
"const-method-handle"
,
"invoke-polymorphic"
,
"invoke-polymorphic/range"
,
"invoke-custom"
,
"invoke-custom/range"
,
"const-method-handle"
,
"const-method-type"
};
}
jadx-plugins/jadx-java-input/build.gradle
浏览文件 @
1ce3fc97
...
...
@@ -4,4 +4,8 @@ plugins {
dependencies
{
api
(
project
(
":jadx-plugins:jadx-plugins-api"
))
// show bytecode disassemble
implementation
'org.ow2.asm:asm:9.2'
implementation
'org.ow2.asm:asm-util:9.2'
}
jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/code/JavaCodeReader.java
浏览文件 @
1ce3fc97
...
...
@@ -61,15 +61,16 @@ public class JavaCodeReader implements ICodeReader {
state
.
setInsn
(
insn
);
int
offset
=
0
;
while
(
offset
<
codeSize
)
{
insn
.
setDecoded
(
false
);
insn
.
setOffset
(
offset
);
insn
.
setInsnStart
(
reader
.
getOffset
());
int
opcode
=
reader
.
readU1
();
JavaInsnInfo
insnInfo
=
JavaInsnsRegister
.
get
(
opcode
);
if
(
insnInfo
==
null
)
{
throw
new
JavaClassParseException
(
"Unknown opcode: 0x"
+
Integer
.
toHexString
(
opcode
));
}
insn
.
setDecoded
(
false
);
insn
.
setInsnInfo
(
insnInfo
);
insn
.
setInsnStart
(
reader
.
getOffset
());
insn
.
setOffset
(
offset
);
insn
.
setInsnInfo
(
insnInfo
);
insn
.
setRegsCount
(
insnInfo
.
getRegsCount
());
insn
.
setOpcode
(
insnInfo
.
getApiOpcode
());
...
...
jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/code/JavaInsnData.java
浏览文件 @
1ce3fc97
...
...
@@ -12,6 +12,7 @@ import jadx.api.plugins.input.insns.InsnIndexType;
import
jadx.api.plugins.input.insns.Opcode
;
import
jadx.api.plugins.input.insns.custom.ICustomPayload
;
import
jadx.plugins.input.java.data.ConstPoolReader
;
import
jadx.plugins.input.java.data.DataReader
;
import
jadx.plugins.input.java.data.code.decoders.IJavaInsnDecoder
;
public
class
JavaInsnData
implements
InsnData
{
...
...
@@ -74,9 +75,21 @@ public class JavaInsnData implements InsnData {
this
.
opcode
=
opcode
;
}
@Override
public
String
getOpcodeMnemonic
()
{
return
insnInfo
.
getName
();
}
@Override
public
byte
[]
getByteCode
()
{
return
new
byte
[
0
];
DataReader
reader
=
state
.
reader
();
int
startOffset
=
reader
.
getOffset
();
try
{
reader
.
absPos
(
insnStart
);
return
reader
.
readBytes
(
1
+
payloadSize
);
}
finally
{
reader
.
absPos
(
startOffset
);
}
}
@Override
...
...
jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/utils/DisasmUtils.java
浏览文件 @
1ce3fc97
...
...
@@ -3,27 +3,42 @@ package jadx.plugins.input.java.utils;
import
java.io.ByteArrayOutputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.PrintWriter
;
import
java.io.StringWriter
;
import
java.nio.file.Files
;
import
java.nio.file.Path
;
import
java.nio.file.StandardOpenOption
;
import
java.util.concurrent.TimeUnit
;
import
org.objectweb.asm.ClassReader
;
import
org.objectweb.asm.util.TraceClassVisitor
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
public
class
DisasmUtils
{
private
static
final
Logger
LOG
=
LoggerFactory
.
getLogger
(
DisasmUtils
.
class
);
public
static
String
get
(
byte
[]
bytes
)
{
return
useASM
(
bytes
);
}
private
static
String
useASM
(
byte
[]
bytes
)
{
StringWriter
out
=
new
StringWriter
();
TraceClassVisitor
tcv
=
new
TraceClassVisitor
(
new
PrintWriter
(
out
));
new
ClassReader
(
bytes
).
accept
(
tcv
,
0
);
return
out
.
toString
();
}
/**
* Use javap as a temporary disassembler for java bytecode
* Don't remove! Useful for debug.
*/
p
ublic
static
String
get
(
byte
[]
bytes
)
{
p
rivate
static
String
useSystemJavaP
(
byte
[]
bytes
)
{
try
{
Path
tmpCls
=
null
;
try
{
tmpCls
=
Files
.
createTempFile
(
"jadx"
,
".class"
);
Files
.
write
(
tmpCls
,
bytes
,
StandardOpenOption
.
WRITE
,
StandardOpenOption
.
TRUNCATE_EXISTING
);
Process
process
=
Runtime
.
getRuntime
().
exec
(
new
String
[]
{
"javap"
,
"-constants"
,
"-v"
,
"-p"
,
"-c"
,
tmpCls
.
toAbsolutePath
().
toString
()
...
...
jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/impl/CallSite.java
浏览文件 @
1ce3fc97
...
...
@@ -33,4 +33,9 @@ public class CallSite implements ICallSite {
public
List
<
EncodedValue
>
getValues
()
{
return
values
;
}
@Override
public
String
toString
()
{
return
"CallSite{"
+
values
+
'}'
;
}
}
jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/insns/InsnData.java
浏览文件 @
1ce3fc97
...
...
@@ -17,6 +17,8 @@ public interface InsnData {
Opcode
getOpcode
();
String
getOpcodeMnemonic
();
byte
[]
getByteCode
();
InsnIndexType
getIndexType
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录