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++一个线程中去执行,然后将其放入任务队列中。所以不会影响主线程的执行。