apk-hook-study

工具:

主要使用Mumu模拟器与frida。

使用js脚本启动

​ 首先使用frida-ps -U -a查看进程的id,如下图:

image-20221116171934180

​ 接着写test.js脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
// test.js
setImmediate(function() {
console.log("[*] Starting script");

Java.perform(function() {
var myClass = Java.use("com.example.ctf2.MainActivity"); // com.example.ctf2->包名,MainActivity->某个Activity名。(幸亏学过安卓。。
myClass.implementation = function(v) {
// do sth.
};
console.log("done");
})
})

​ 运行frida -U -l test.js -f com.example.ctf2,得到:

image-20221116171934180

使用python脚本启动

​ python脚本如下:

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
import frida, sys

jscode = """
Java.perform(function () {
//这里写要Hook的软件的类名,建议配合jadx和JEB使用(类名为a)
var Myclass= Java.use('com.example.ctf2.a');
//这里写要Hook的类下的方法名Mymethod(方法名为onClick)
Myclass.onClick.implementation = function (str) {
//这里是输出打印相关的提示语结果
send('Hook success');
console.log('string is: ' + str);
};
});
"""

def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)


# 这里写要Hook的软件的pid(pid为2164)
process = frida.get_usb_device().attach(2164)
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Hook Start Running')
script.load()
sys.stdin.read()

​ 运行脚本时显示:

image-20221116174151926

​ 更多的运用还没学,链接为:https://blog.csdn.net/yi_rui_jie/article/details/115462824

知识点1:js中的setImmediate方法。

1
2
3
4
function func(...data) {
console.log(data)
}
setImmediate(func, 111,222)

​ setImmediate表示立即执行,它是宏任务,回调函数会被放置到事件循环的check阶段。在应用中如果大量的计算型任务,它是不适合放在主线程中执行的,因为计算任务会阻塞主线程,主线程一旦被阻塞,其他任务就需要等待,所以这种类型的任务最好交给C++维护线程去执行。可以通过setImmediate方法将任务放入事件循环中的check阶段,因为代码在这一个阶段执行不会阻塞主线程,也不会阻塞事件循环。

1
2
3
4
5
6
7
8
9
10
11
12
// example1
function sleep(delay) {
var start = new Date().getTime()
while (new Date().getTime() - start < delay) {
continue
}
console.log('ok')
}

console.log('start')
sleep(2000)
console.log('end')
1
2
3
4
5
6
7
8
9
10
11
// example1
function sleep(delay) {
var start = new Date().getTime()
while (new Date().getTime() - start < delay) {
continue
}
console.log('ok')
}
console.log('start')
setImmediate(sleep, 2000)
console.log('end')

​ 第一种情况,先打印出start,然后等待2000ms后再打印ok和end。
​ 第二种情况,先打印出start,然后再打印end,最后等待2000ms后打印end。
​ 出现这种情况的原因是:setImmediate将其中的函数作为宏任务,放到C++一个线程中去执行,然后将其放入任务队列中。所以不会影响主线程的执行。

留言

2022-11-16

© 2024 wd-z711

⬆︎TOP