-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy patheventWatcher.js
More file actions
72 lines (64 loc) · 1.82 KB
/
eventWatcher.js
File metadata and controls
72 lines (64 loc) · 1.82 KB
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
let classFactory = null;
let javaClass = null;
let javaObject = null;
function main() {
Java.perform(doJavaHook);
}
function doJavaHook() {
const Application = Java.use("android.app.Application");
Application.attach.overload("android.content.Context").implementation = function (context) {
this.attach(context);
const classLoader = context.getClassLoader();
classFactory = Java.ClassFactory.get(classLoader);
};
if (classFactory) {
console.log("[!] with shell");
} else {
classFactory = Java;
console.log("[!] without shell");
}
hookOnClickListener();
}
function hookOnClickListener() {
// spawn
classFactory.use("android.view.View").setOnClickListener.implementation = function (listener) {
if (listener) {
watch(listener, "onClick");
}
this.setOnClickListener(listener);
};
// attach
classFactory.choose("android.view.View$ListenerInfo", {
onMatch: function (instance) {
const listener = instance.mOnClickListener.value;
if (listener) {
watch(listener, 'onClick');
}
},
onComplete: function () {
},
});
}
function watch(obj, mtdName) {
const listenerClassName = getObjClassName(obj);
const listenerClass = classFactory.use(listenerClassName);
if (!listenerClass || !mtdName in listenerClass) {
return;
}
listenerClass[mtdName].overloads.forEach(function (overload) {
overload.implementation = function () {
console.log(`[*] Watch Event: ${mtdName} - ${getObjClassName(this)}`);
return this[mtdName].apply(this, arguments);
};
})
}
function getObjClassName(obj) {
if (!javaClass) {
javaClass = classFactory.use("java.lang.Class");
}
if (!javaObject) {
javaObject = classFactory.use("java.lang.Object");
}
return javaClass.getName.call(javaObject.getClass.call(obj));
}
setImmediate(main);