2

我正在使用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调用。

知道我该怎么做吗?

4

0 回答 0