apk-hook-study
工具:
主要使用Mumu模拟器与frida。
使用js脚本启动
首先使用frida-ps -U -a
查看进程的id,如下图:
接着写test.js脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12
| setImmediate(function() { console.log("[*] Starting script");
Java.perform(function() { var myClass = Java.use("com.example.ctf2.MainActivity"); myClass.implementation = function(v) { }; console.log("done"); }) })
|
运行frida -U -l test.js -f com.example.ctf2
,得到:
使用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)
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()
|
运行脚本时显示:
更多的运用还没学,链接为: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
| 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
| 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++一个线程中去执行,然后将其放入任务队列中。所以不会影响主线程的执行。