1
1
package cn .com .x1001 ;
2
2
3
- import cn .com .x1001 .classmap .ClassInfo ;
4
- import cn .com .x1001 .classmap .Edge ;
5
- import cn .com .x1001 .classmap .GraphNode ;
6
- import cn .com .x1001 .classmap .HookGraph ;
3
+ import cn .com .x1001 .classmap .*;
7
4
import cn .com .x1001 .util .ClassUtil ;
8
5
9
- import java .util .Collections ;
10
6
import java .util .HashSet ;
11
7
import java .util .Set ;
12
8
import java .util .concurrent .CopyOnWriteArraySet ;
13
9
14
10
/**
15
- * @author keven1z
16
- * @Date 2021/6/17
11
+ * @author keven1z
12
+ * @Date 2021/6/17
17
13
* @Description hook 的上下文信息
18
- */
14
+ */
19
15
public class InstrumentationContext {
20
16
21
17
/**
22
18
* 类的图集合
23
19
*/
24
20
private HookGraph classMap = new HookGraph ();
25
21
/*
26
- * 存储hook的接口或类
27
- */
28
- private Set < ClassInfo > hookClasses = new CopyOnWriteArraySet ();
22
+ * 存储hook的接口或类
23
+ */
24
+ private CopyOnWriteArraySet < HookClass > hookClasses = new CopyOnWriteArraySet <> ();
29
25
30
26
31
- public Set < ClassInfo > getClassHashSet () {
27
+ public CopyOnWriteArraySet < HookClass > getClassHashSet () {
32
28
return hookClasses ;
33
29
}
34
30
35
- public void addHook (ClassInfo classInfo ) {
36
- this .getClassHashSet ().add (classInfo );
31
+ public void addHook (HookClass hookClass ) {
32
+ this .getClassHashSet ().add (hookClass );
37
33
}
34
+
38
35
public HookGraph getClassMap () {
39
36
return classMap ;
40
37
}
@@ -43,68 +40,136 @@ public HookGraph getClassMap() {
43
40
* 是否为hook点
44
41
*/
45
42
public boolean isHookClass (String className ) {
46
- for (ClassInfo hookClassInfo : getClassHashSet ()) {
47
- String hookClassName = hookClassInfo .getClassName ();
43
+ for (HookClass hookHookClass : getClassHashSet ()) {
44
+ String hookClassName = hookHookClass .getClassName ();
48
45
if (hookClassName .equals (className )) {
49
46
return true ;
50
47
}
51
48
}
52
49
return false ;
53
50
}
54
- public void setHooked (String className ){
55
- GraphNode node = this .getClassMap ().getNode (className );
56
- node .hooked ();
51
+
52
+ public boolean isHookClass (String className , String method , String desc ) {
53
+ for (HookClass hookHookClass : getClassHashSet ()) {
54
+ String hookClassName = hookHookClass .getClassName ();
55
+ String m = hookHookClass .getMethod ();
56
+ String d = hookHookClass .getDesc ();
57
+ if (hookClassName .equals (className ) && m .equals (method ) && d .equals (desc )) {
58
+ return true ;
59
+ }
60
+ }
61
+ return false ;
57
62
}
58
- public ClassInfo getHookClass (String className ) {
59
- for (ClassInfo hookClassInfo : getClassHashSet ()) {
60
- String hookClassName = hookClassInfo .getClassName ();
61
- if (hookClassName .equals (className )) {
62
- return hookClassInfo ;
63
+
64
+ public HookClass getHookClass (Set <HookClass > hookClasses , String method , String desc ) {
65
+
66
+ for (HookClass hookClass : hookClasses ) {
67
+ String m = hookClass .getMethod ();
68
+ String d = hookClass .getDesc ();
69
+ if (m .equals (method ) && d .equals (desc )) {
70
+ return hookClass ;
63
71
}
64
72
}
65
73
return null ;
66
74
}
67
- public void addHooKClass (String className ,ClassInfo hookClass ){
68
- ClassInfo vertex = getClassMap ().getVertex (className );
69
- vertex .setMethodDesc (hookClass .getMethodDesc ());
70
- getClassHashSet ().add (vertex );
75
+
76
+ public HookClass getHookClass (String className , String method , String desc ) {
77
+ Set <HookClass > hookClasses = getHookClasses (className );
78
+ for (HookClass hookClass : hookClasses ) {
79
+ String m = hookClass .getMethod ();
80
+ String d = hookClass .getDesc ();
81
+ if (m .equals (method ) && d .equals (desc )) {
82
+ return hookClass ;
83
+ }
84
+ }
85
+ return null ;
86
+ }
87
+
88
+ /**
89
+ * 設置已hook
90
+ */
91
+ public void setHooked (String className ) {
92
+ Set <HookClass > hookClasses = getHookClasses (className );
93
+ for (HookClass hookClass : hookClasses ) {
94
+ hookClass .setHooked (true );
95
+ }
96
+ }
97
+
98
+ public Set <HookClass > getHookClasses (String className ) {
99
+ HashSet <HookClass > hashSet = new HashSet <>();
100
+ for (HookClass hookHookClass : getClassHashSet ()) {
101
+ String hookClassName = hookHookClass .getClassName ();
102
+ if (hookClassName .equals (className )) {
103
+ hashSet .add (hookHookClass );
104
+ }
105
+ }
106
+ return hashSet ;
107
+ }
108
+
109
+ public boolean containAction (String className , int action ) {
110
+ Set <HookClass > hookClasses = getHookClasses (className );
111
+ for (HookClass hookClass : hookClasses ) {
112
+ Set <Integer > actions = hookClass .getActions ();
113
+ if (actions .contains (action )) return true ;
114
+ }
115
+ return false ;
116
+ }
117
+
118
+ /**
119
+ * 通过父类增加hook点
120
+ *
121
+ * @param className
122
+ * @param superClassName
123
+ */
124
+ public void addHooKClass (String className , String superClassName ) {
125
+ Set <HookClass > superHookClasses = getHookClasses (superClassName );
126
+ for (HookClass hookClass : superHookClasses ) {
127
+ HookClass hc = new HookClass (className , hookClass .getMethod (), hookClass .getDesc (), hookClass .getReturnValue (), hookClass .getParameters (), hookClass .getActions ());
128
+ getClassHashSet ().add (hc );
129
+ }
71
130
}
72
- public void addHooKClass (Set <ClassInfo > classInfoHashSet ,ClassInfo hookClass ){
73
- for (ClassInfo classInfo :classInfoHashSet ){
74
- classInfo .setMethodDesc (hookClass .getMethodDesc ());
131
+
132
+ public void addHooKClass (String className , Set <ClassVertex > childClasses ) {
133
+ Set <HookClass > hookClasses = getHookClasses (className );
134
+
135
+ for (HookClass hookClass : hookClasses ) {
136
+ for (ClassVertex classVertex : childClasses ) {
137
+ HookClass hc = new HookClass (classVertex .getClassName (), hookClass .getMethod (), hookClass .getDesc (), hookClass .getReturnValue (), hookClass .getParameters (), hookClass .getActions ());
138
+ getClassHashSet ().add (hc );
139
+ }
75
140
}
76
- getClassHashSet ().addAll (classInfoHashSet );
77
141
}
142
+
78
143
/**
79
144
* 判断该节点的父类是否在hook表中
145
+ *
80
146
* @param className 待hook的className
81
147
*/
82
- public Set <ClassInfo > getChildHookClasses (String className ){
83
- ClassInfo superClassInfo = getClassMap ().getVertex (className );
84
- HashSet <Edge > toEdges = getClassMap ().getToEdges (superClassInfo );
85
- HashSet <ClassInfo > classInfos = new HashSet <>();
86
- for (Edge edge :toEdges ){
87
- ClassInfo from = edge .getFrom ();
88
- if (!ClassUtil .isInterface (from .getAccess ())){
89
- classInfos .add (from );
90
- }
91
- else classInfos .addAll (getChildHookClasses (from .getClassName ()));
148
+ public Set <ClassVertex > getChildClasses (String className ) {
149
+ ClassVertex vertex = classMap .getVertex (className );
150
+ HashSet <Edge > toEdges = getClassMap ().getToEdges (vertex );
151
+ HashSet <ClassVertex > classVertices = new HashSet <>();
152
+ for (Edge edge : toEdges ) {
153
+ ClassVertex from = edge .getFrom ();
154
+ if (!ClassUtil .isInterface (from .getAccess ())) {
155
+ classVertices .add (from );
156
+ } else classVertices .addAll (getChildClasses (from .getClassName ()));
92
157
}
93
- return classInfos ;
158
+ return classVertices ;
94
159
}
95
- public ClassInfo getSuperHookClasses (String className ){
96
- ClassInfo classInfo = getClassMap ().getVertex (className );
160
+
161
+ public ClassVertex getSuperClasses (String className ) {
162
+ ClassVertex classVertex = getClassMap ().getVertex (className );
97
163
/*如果为接口则不加入hook点*/
98
- if (ClassUtil .isInterface (classInfo .getAccess ())){
164
+ if (ClassUtil .isInterface (classVertex .getAccess ())) {
99
165
return null ;
100
166
}
101
- HashSet <Edge > fromEdges = getClassMap ().getFromEdges (classInfo );
102
- for (Edge edge : fromEdges ){
103
- ClassInfo to = edge .getTo ();
104
- if (isHookClass (to .getClassName ())){
167
+ HashSet <Edge > fromEdges = getClassMap ().getFromEdges (classVertex );
168
+ for (Edge edge : fromEdges ) {
169
+ ClassVertex to = edge .getTo ();
170
+ if (isHookClass (to .getClassName ())) {
105
171
return to ;
106
- }
107
- else getSuperHookClasses (to .getClassName ());
172
+ } else getSuperClasses (to .getClassName ());
108
173
}
109
174
return null ;
110
175
}
0 commit comments