如何Hook app启动阶段的方法onCreate
启动阶段即app没有完全启动起来。
正常在hook一个app之前,要将app运行起来才可以进行hook,但是有些时候我们hook的方法是在app启动阶段执行的,该方法在启动阶段执行一次之后在不会执行。我们知道只有在该方法执行的时候才能hook到。
那么现在两者冲突了
- 正常hook要在app完全启动之后;
- 该方法只在app启动阶段运行一次;
例如: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)。
脚本运行后报错了,原因是因为源代码中定义了onCreate方法中的传参类型
关于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()
总结:因为我们hook onCreate方法时需要重启app,需要overload(‘android.os.Bundle’)来维持我们重启之前的状态。
本文含有隐藏内容,请 开通VIP 后查看