【frida逆向开发】如何Hook app启动阶段的方法

如何Hook app启动阶段的方法onCreate

启动阶段即app没有完全启动起来。

正常在hook一个app之前,要将app运行起来才可以进行hook,但是有些时候我们hook的方法是在app启动阶段执行的,该方法在启动阶段执行一次之后在不会执行。我们知道只有在该方法执行的时候才能hook到。

那么现在两者冲突了

  • 正常hook要在app完全启动之后;
  • 该方法只在app启动阶段运行一次;

【frida逆向开发】如何Hook app启动阶段的方法_第1张图片
例如:onCreate方法在app启动阶段首先执行该方法(画界面),且执行一次之后不会在执行。

Hook脚本:

import frida  #导入frida模块
import sys    #导入sys模块

jscode = """
    Java.perform(function(){  
        var TestSig = Java.use("com.yaotong.crackme.MainActivity"); // 类的加载路径
        
        TestSig.onCreate.implementation = function(str){   
            send("success");
            this.onCreate();
        };
        
    });
"""

def on_message(message,data): #js中执行send函数后要回调的函数
    if message["type"] == "send":
        print("[*] {0}".format(message["payload"]))
    else:
        print(message)
    
process = frida.get_usb_device()

pid = process.spawn(['com.yaotong.crackme']) # app包名
session = process.attach(pid)  # 加载进程号
script = session.create_script(jscode) #创建js脚本
script.on('message',on_message) #加载回调函数,也就是js中执行send函数规定要执行的python函数
script.load() #加载脚本
process.resume(pid)  ########### 重启app
sys.stdin.read()

先启动app,根据包名找到应用程序,然后重启app,hook对应的方法(onCreate)。

【frida逆向开发】如何Hook app启动阶段的方法_第2张图片
脚本运行后报错了,原因是因为源代码中定义了onCreate方法中的传参类型

【frida逆向开发】如何Hook app启动阶段的方法_第3张图片
【frida逆向开发】如何Hook app启动阶段的方法_第4张图片
关于overload参考:https://blog.csdn.net/qq_18505715/article/details/70432196

关于android.os.Bundle:

这个是在Activity类里面导的一个包,在onCreate时候,会传入一个变量,里面包含上次退出的信息,这里面可以恢复上次退出的状态。

最终实现代码:

import frida  #导入frida模块
import sys    #导入sys模块

jscode = """
    Java.perform(function(){  
        var TestSig = Java.use("com.yaotong.crackme.MainActivity"); // 类的加载路径
        
        TestSig.onCreate.overload('android.os.Bundle').implementation = function(str){   
            send("success1");
            this.onCreate(str);
            send("success2");
        };
        
    });
"""

def on_message(message,data): #js中执行send函数后要回调的函数
    if message["type"] == "send":
        print("[*] {0}".format(message["payload"]))
    else:
        print(message)
    
process = frida.get_usb_device()

pid = process.spawn(['com.yaotong.crackme']) # app包名
session = process.attach(pid)  # 加载进程号
script = session.create_script(jscode) #创建js脚本
script.on('message',on_message) #加载回调函数,也就是js中执行send函数规定要执行的python函数
script.load() #加载脚本
process.resume(pid)  # 重启app
sys.stdin.read()

【frida逆向开发】如何Hook app启动阶段的方法_第5张图片

总结:因为我们hook onCreate方法时需要重启app,需要overload(‘android.os.Bundle’)来维持我们重启之前的状态。

你可能感兴趣的:(移动APP安全,java,frida,hook,app)