Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
ql04210214
jadx
提交
52ba33c5
J
jadx
项目概览
ql04210214
/
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 搜索 >>
提交
52ba33c5
编写于
5月 03, 2019
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: avoid local variables collision with full class names (#647)
上级
156c9798
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
141 addition
and
10 deletion
+141
-10
jadx-core/src/main/java/jadx/core/codegen/NameGen.java
jadx-core/src/main/java/jadx/core/codegen/NameGen.java
+4
-2
jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java
jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java
+6
-0
jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java
...e/src/main/java/jadx/core/dex/visitors/RenameVisitor.java
+11
-8
jadx-core/src/main/java/jadx/core/utils/CacheStorage.java
jadx-core/src/main/java/jadx/core/utils/CacheStorage.java
+17
-0
jadx-core/src/test/java/jadx/tests/integration/names/TestLocalVarCollideWithPackage.java
...sts/integration/names/TestLocalVarCollideWithPackage.java
+71
-0
jadx-core/src/test/smali/names/TestLocalVarCollideWithPackage/1.smali
...c/test/smali/names/TestLocalVarCollideWithPackage/1.smali
+18
-0
jadx-core/src/test/smali/names/TestLocalVarCollideWithPackage/2.smali
...c/test/smali/names/TestLocalVarCollideWithPackage/2.smali
+10
-0
jadx-core/src/test/smali/names/TestLocalVarCollideWithPackage/3.smali
...c/test/smali/names/TestLocalVarCollideWithPackage/3.smali
+4
-0
未找到文件。
jadx-core/src/main/java/jadx/core/codegen/NameGen.java
浏览文件 @
52ba33c5
package
jadx.core.codegen
;
import
java.util.
Linked
HashSet
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
...
...
@@ -30,7 +30,7 @@ public class NameGen {
private
static
final
Map
<
String
,
String
>
OBJ_ALIAS
;
private
final
Set
<
String
>
varNames
=
new
Linked
HashSet
<>();
private
final
Set
<
String
>
varNames
=
new
HashSet
<>();
private
final
MethodNode
mth
;
private
final
boolean
fallback
;
...
...
@@ -67,6 +67,8 @@ public class NameGen {
for
(
ClassNode
innerClass
:
parentClass
.
getInnerClasses
())
{
varNames
.
add
(
innerClass
.
getAlias
().
getShortName
());
}
// add all root package names to avoid collisions with full class names
varNames
.
addAll
(
mth
.
root
().
getCacheStorage
().
getRootPkgs
());
}
public
String
assignArg
(
CodeVar
var
)
{
...
...
jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java
浏览文件 @
52ba33c5
...
...
@@ -19,6 +19,7 @@ import jadx.core.dex.info.FieldInfo;
import
jadx.core.dex.info.InfoStorage
;
import
jadx.core.dex.info.MethodInfo
;
import
jadx.core.dex.visitors.typeinference.TypeUpdate
;
import
jadx.core.utils.CacheStorage
;
import
jadx.core.utils.ErrorsCounter
;
import
jadx.core.utils.StringUtils
;
import
jadx.core.utils.android.AndroidResourcesUtils
;
...
...
@@ -36,6 +37,7 @@ public class RootNode {
private
final
StringUtils
stringUtils
;
private
final
ConstStorage
constValues
;
private
final
InfoStorage
infoStorage
=
new
InfoStorage
();
private
final
CacheStorage
cacheStorage
=
new
CacheStorage
();
private
final
TypeUpdate
typeUpdate
;
private
ClspGraph
clsp
;
...
...
@@ -222,6 +224,10 @@ public class RootNode {
return
infoStorage
;
}
public
CacheStorage
getCacheStorage
()
{
return
cacheStorage
;
}
public
JadxArgs
getArgs
()
{
return
args
;
}
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java
浏览文件 @
52ba33c5
...
...
@@ -67,9 +67,7 @@ public class RenameVisitor extends AbstractVisitor {
}
}
}
if
(
args
.
isRenameValid
())
{
checkFieldsCollisionWithRootPackage
(
classes
);
}
processRootPackages
(
root
,
classes
);
}
private
void
checkClassName
(
ClassNode
cls
,
JadxArgs
args
)
{
...
...
@@ -140,12 +138,17 @@ public class RenameVisitor extends AbstractVisitor {
}
}
private
void
checkFieldsCollisionWithRootPackage
(
List
<
ClassNode
>
classes
)
{
private
void
processRootPackages
(
RootNode
root
,
List
<
ClassNode
>
classes
)
{
Set
<
String
>
rootPkgs
=
collectRootPkgs
(
classes
);
for
(
ClassNode
cls
:
classes
)
{
for
(
FieldNode
field
:
cls
.
getFields
())
{
if
(
rootPkgs
.
contains
(
field
.
getAlias
()))
{
deobfuscator
.
forceRenameField
(
field
);
root
.
getCacheStorage
().
setRootPkgs
(
rootPkgs
);
if
(
root
.
getArgs
().
isRenameValid
())
{
// rename field if collide with any root package
for
(
ClassNode
cls
:
classes
)
{
for
(
FieldNode
field
:
cls
.
getFields
())
{
if
(
rootPkgs
.
contains
(
field
.
getAlias
()))
{
deobfuscator
.
forceRenameField
(
field
);
}
}
}
}
...
...
jadx-core/src/main/java/jadx/core/utils/CacheStorage.java
0 → 100644
浏览文件 @
52ba33c5
package
jadx.core.utils
;
import
java.util.Collections
;
import
java.util.Set
;
public
class
CacheStorage
{
private
Set
<
String
>
rootPkgs
=
Collections
.
emptySet
();
public
Set
<
String
>
getRootPkgs
()
{
return
rootPkgs
;
}
public
void
setRootPkgs
(
Set
<
String
>
rootPkgs
)
{
this
.
rootPkgs
=
rootPkgs
;
}
}
jadx-core/src/test/java/jadx/tests/integration/names/TestLocalVarCollideWithPackage.java
0 → 100644
浏览文件 @
52ba33c5
package
jadx.tests.integration.names
;
import
java.util.List
;
import
org.junit.jupiter.api.Test
;
import
jadx.core.dex.nodes.ClassNode
;
import
jadx.tests.api.SmaliTest
;
import
static
org
.
hamcrest
.
MatcherAssert
.
assertThat
;
import
static
org
.
hamcrest
.
Matchers
.
containsString
;
import
static
org
.
hamcrest
.
Matchers
.
not
;
public
class
TestLocalVarCollideWithPackage
extends
SmaliTest
{
//@formatter:off
/*
-----------------------------------------------------------
package first;
import pkg.Second;
public class A {
public String test() {
Second second = new Second();
second.A.call(); // collision
return second.str;
}
}
-----------------------------------------------------------
package pkg;
public class Second {
public String str;
}
-----------------------------------------------------------
package second;
public class A {
}
-----------------------------------------------------------
*/
//@formatter:on
@Test
public
void
test
()
{
List
<
ClassNode
>
clsList
=
loadFromSmaliFiles
();
ClassNode
firstA
=
searchCls
(
clsList
,
"first.A"
);
String
code
=
firstA
.
getCode
().
toString
();
assertThat
(
code
,
containsString
(
"second.A.call();"
));
assertThat
(
code
,
not
(
containsString
(
"Second second = new Second();"
)));
}
@Test
public
void
testNoDebug
()
{
noDebugInfo
();
loadFromSmaliFiles
();
}
@Test
public
void
testWithoutImports
()
{
getArgs
().
setUseImports
(
false
);
loadFromSmaliFiles
();
}
@Test
public
void
testWithDeobfuscation
()
{
enableDeobfuscation
();
loadFromSmaliFiles
();
}
}
jadx-core/src/test/smali/names/TestLocalVarCollideWithPackage/1.smali
0 → 100644
浏览文件 @
52ba33c5
.class public Lfirst/A;
.super Ljava/lang/Object;
.method public test()Ljava/lang/String;
.registers 2
new-instance v1, Lpkg/Second;
invoke-direct {v1}, Lpkg/Second;-><init>()V
.local v1, "second":Lpkg/Second;
invoke-static {}, Lsecond/A;->call()Ljava/lang/String;
iget-object v0, v1, Lpkg/Second;->str:Ljava/lang/String;
return-object v0
.end method
jadx-core/src/test/smali/names/TestLocalVarCollideWithPackage/2.smali
0 → 100644
浏览文件 @
52ba33c5
.class public Lsecond/A;
.super Ljava/lang/Object;
.method static public call()Ljava/lang/String;
.registers 1
const v0, 0
return-object v0
.end method
jadx-core/src/test/smali/names/TestLocalVarCollideWithPackage/3.smali
0 → 100644
浏览文件 @
52ba33c5
.class public Lpkg/Second;
.super Ljava/lang/Object;
.field public str:Ljava/lang/String;
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录