我正在使用Frida来拦截我的 Android 应用程序事件。
假设我有一个 Activity 被调用MainActivity
,并且在那里我有一个函数叫做sendMessage
:
public void sendMessage(View view)
{
Log.i("MainActivity", "MainActivity: button clicked");
}
在我的 activity_main.xml 中,我有一个按钮:
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10mm"
android:clickable="true"
android:text="My Button"
android:onClick="sendMessage"/>
请注意 android:onClick=" sendMessage " - 这告诉 android 应用程序查找调用的函数sendMessage
并在单击按钮时执行它。
我使用 Frida 并拦截sendMessage
事件的 python 脚本如下所示:
import frida, sys
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
jscode = """
Java.perform(function () {
// Function to hook is defined here
var MainActivity = Java.use('com.example.androiddemo.MainActivity');
// Whenever button is clicked
var sendMessage = MainActivity.sendMessage;
sendMessage.implementation = function (v) {
// Show a message to know that the function got called
send('CLICK START');
// Call the original onClick handler
sendMessage.call(this, v);
// Log to the console that it's done, and we should have the flag!
console.log('CLICK END');
};
});
"""
process = frida.get_usb_device().attach('com.example.androiddemo')
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
sys.stdin.read()
这很好用,但它要求我事先知道函数的名称 (sendMessage)。相反,我想拦截通用onClick
调用。
知道我该怎么做吗?