理论上我们可以通过反射的思想,写出一个脚本hook住所有的类,以及类的方法和重载,这样也就不用考虑定位了,自动化的实现我们快速hook的需求,将hook的所有日志保留,然后我们去搜索我们需要的东西。现在人工智能、大数据、AI这么火,怎么让我们逆向也变得智能呢?输入一个简单的指令,程序自我hook,快速计算,然后反馈关键的类、方法给我们。也许这样的工具已经有大佬实现了。
enumerateLoadedClassesSync 列出当前已经加载的类,但是有很多,打印出来的数据多的看不清,全部hook APP 肯定会奔溃。
1
2
3
4
5
6
7
8
|
Java.perform(function(){
var classz
=
Java.enumerateLoadedClassesSync()
console.log(classz)
})
on.Animator$AnimatorListener,android.animation.AnimatorSet$SeekState,android.os.Registrant,android.app.ActivityManager$StackId,com.android.internal.telephony.ISub$Stub$Proxy,android.widget.FastScroller$
6
,android.media.EncoderCapabilities,android.hardware.camera2.CaptureResult$
2
,android.app.job.JobInfo$TriggerContentUri,android.app.ApplicationPackageManager$OnPermissionsChangeListenerDelegate,android.text.method.TextKeyListener,android.app.job.JobService,android.widget.GridLayout$
5
,android.app.WindowConfiguration,android.widget.TextView$
3
,android.app.ActivityManager$RunningAppProcessInfo,android.security.net.config.CertificateSource,android.app.assist.AssistStructure$ViewNode,android.media.Utils,android.database
...
|
可以过滤出我们需要的类
1
2
3
4
5
6
7
8
9
10
|
Java.perform(function(){
var classz
=
Java.enumerateLoadedClassesSync();
for
(var i
=
0
;i<classz.length;i
+
+
){
if
(classz[i].indexOf(
"com.xiaojianbang.app"
) !
=
-
1
){
console.log(classz[i])
}
}
})
|
返回的结果,可以看出,从几百,几千缩减了到几个几十个,在对他们进行hook,此时问题应该不大。先来看结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[Xiaomi MI
8
::HookTestDemo]
-
> com.xiaojianbang.app.DESede
com.xiaojianbang.app.Money$innerClass
com.xiaojianbang.app.Money
com.xiaojianbang.app.MainActivity$
1
com.xiaojianbang.app.MainActivity
com.xiaojianbang.app.SHA
com.xiaojianbang.app.RSA
com.xiaojianbang.app.MAC
com.xiaojianbang.app.Utils
com.xiaojianbang.app.AES
com.xiaojianbang.app.DES
com.xiaojianbang.app.NativeHelper
com.xiaojianbang.app.RSAHex
com.xiaojianbang.app.MD5
com.xiaojianbang.app.ShufferMap
|
1
2
3
4
5
|
var MainActivity
=
Java.use(
"com.xiaojianbang.app.MainActivity"
);
var methods
=
MainActivity.
class
.getDeclaredMethods();
for
(var i
=
0
;i<methods.length;i
+
+
){
console.log(methods[i].getName())
}
|
返回结果:
1
2
3
4
5
|
[Xiaomi MI
8
::HookTestDemo]
-
> decrypt
onClick
onCreate
showMap_
toastPrint
|
对比源代码 太多了所以部分截图,方法名也是一一对上的。
如果方法的重载只有2、3个可以手动写,但是有10个?100个?所有看代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
var Utils
=
Java.use(
"com.xiaojianbang.app.Utils"
);
Utils[
"test"
].implementation
=
function () {
console.log(
"test is called"
);
var ret
=
this.test();
console.log(
'test ret value is '
+
ret);
return
ret;
};
结果:可以看出有三个重载
[Xiaomi MI
8
::HookTestDemo]
-
> Error: test(): has more than one overload, use .overload(<signature>) to choose
from
:
.overload()
.overload(
'com.xiaojianbang.app.Money'
)
.overload(
'int'
)
at throwOverloadError (frida
/
node_modules
/
frida
-
java
-
bridge
/
lib
/
class
-
factory.js:
1020
)
at frida
/
node_modules
/
frida
-
java
-
bridge
/
lib
/
class
-
factory.js:
707
|
利用反射的思想,来一次性hook住他们
1
2
3
4
5
6
7
8
9
10
11
12
13
|
var Utils
=
Java.use(
"com.xiaojianbang.app.Utils"
);
var overloads
=
Utils[
"test"
].overloads;
for
(var i
=
0
;i< overloads.length;i
+
+
){
overloads[i].implementation
=
function () {
var params
=
"";
for
(var j
=
0
;j<arguments.length;j
+
+
){
params
=
params
+
arguments[j]
+
" "
}
console.log(
"params"
,params)
return
this.test.
apply
(this,arguments);
};
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
var classz
=
Java.enumerateLoadedClassesSync();
for
(var i
=
0
; i < classz.length; i
+
+
) {
if
(classz[i].indexOf(
"om.xiaojianbang.app.Utils"
) !
=
-
1
) {
var class_name
=
classz[i];
console.log(
"class_name"
, class_name);
var cz
=
Java.use(class_name);
var methods
=
cz.
class
.getDeclaredMethods();
for
(var i1
=
0
; i1 < methods.length
-
1
; i1
+
+
) {
var classz_method_name
=
methods[i1].getName();
console.log(
"classz_method_name => "
, class_name, classz_method_name)
try
{
var overloadAyy
=
cz[classz_method_name].overloads;
console.log(overloadAyy)
if
(overloadAyy && overloadAyy.length>
0
){
for
(var i2
=
0
; i2 < overloadAyy.length; i2
+
+
) {
overloadAyy[i2].implementation
=
function () {
var params
=
"";
for
(var j
=
0
; j < arguments.length; j
+
+
) {
params
=
params
+
arguments[j]
+
" "
}
console.log(
"params"
, class_name, classz_method_name, params)
return
this[classz_method_name].
apply
(this, arguments);
};
}
}
else
{
cz[classz_method_name].implementation
=
function () {
var params
=
"";
for
(var j
=
0
; j < arguments.length; j
+
+
) {
params
=
params
+
arguments[j]
+
" "
}
console.log(
"params"
, class_name, classz_method_name, params)
return
cz[classz_method_name].
apply
(this, arguments);
};
}
} catch (error) {
console.log(
"异常类的加载,请特殊处理"
, class_name, classz_method_name)
}
}
}
}
|
更多【Frida Hook 所有类的方法以及重载】相关视频教程:www.yxfzedu.com