zoukankan      html  css  js  c++  java
  • frida动态修改

    即将手机上的app的内容发送到PC上的frida python程序,然后处理后返回给app,然后app再做后续的流程,核心是理解send/recv函数

    <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="please input username and password"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    
        <EditText
            android:id="@+id/editText"
            android:layout_width="fill_parent"
            android:layout_height="40dp"
            android:hint="username"
            android:maxLength="20"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="1.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.095" />
    
        <EditText
            android:id="@+id/editText2"
            android:layout_width="fill_parent"
            android:layout_height="40dp"
            android:hint="password"
            android:maxLength="20"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.239" />
    
        <Button
            android:id="@+id/button"
            android:layout_width="100dp"
            android:layout_height="35dp"
            android:layout_gravity="right|center_horizontal"
            android:text="提交"
            android:visibility="visible"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.745" />
    
    public class MainActivity extends AppCompatActivity {
    
        EditText username_et;
        EditText password_et;
        TextView message_tv;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            password_et = (EditText) this.findViewById(R.id.editText2);
            username_et = (EditText) this.findViewById(R.id.editText);
            message_tv = ((TextView) findViewById(R.id.textView));
    
            this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    if (username_et.getText().toString().compareTo("admin") == 0) {
                        message_tv.setText("You cannot login as admin");
                        return;
                    }
                    //hook target
                    message_tv.setText("Sending to the server :" + Base64.encodeToString((username_et.getText().toString() + ":" + password_et.getText().toString()).getBytes(), Base64.DEFAULT));
    
                }
            });
    
        }
    }
    

    先分析问题,我的最终目标是让message_tv.setText可以"发送"username为admin的base64字符串。
    那肯定是hook TextView.setText这个函数。

    console.log("Script loaded successfully ");
    Java.perform(function () {
        var tv_class = Java.use("android.widget.TextView");
        tv_class.setText.overload("java.lang.CharSequence").implementation = function (x) {
            var string_to_send = x.toString();
            var string_to_recv;
            send(string_to_send); // send data to python code
            recv(function (received_json_object) {
                string_to_recv = received_json_object.my_data
                console.log("string_to_recv: " + string_to_recv);
            }).wait(); //block execution till the message is received
            var my_string = Java.use("java.lang.String").$new(string_to_recv);
            this.setText(my_string);
        }
    });
    
    import time
    import frida
    import base64
    
    def my_message_handler(message, payload):
        print(message)
        print(payload)
        if message["type"] == "send":
            print(message["payload"])
            data = message["payload"].split(":")[1].strip()
            print( 'message:', message)
            #data = data.decode("base64")
            #data = data
            data = str(base64.b64decode(data))
            print( 'data:',data)
            user, pw = data.split(":")
            print( 'pw:',pw)
            #data = ("admin" + ":" + pw).encode("base64")
            data = str(base64.b64encode(("admin" + ":" + pw).encode()))
            print( "encoded data:", data)
            script.post({"my_data": data})  # send JSON object
            print( "Modified data sent")
    
    device = frida.get_usb_device()
    pid = device.spawn(["myapplication.example.com.frida_demo"])
    device.resume(pid)
    time.sleep(1)
    session = device.attach(pid)
    with open("frida_demo2.js") as f:
        script = session.create_script(f.read())
    script.on("message", my_message_handler)
    script.load()
    input()
    

    参考链接:https://github.com/Mind0xP/Frida-Python-Binding

  • 相关阅读:
    .Net Core 静态文件跨域访问
    SQL Server查看锁表与解锁表
    C# 获取Bilibili网站中的视频信息
    C# 生成条形码、二维码
    HttpWebRequest 远程服务器返回错误: (403) 已禁止
    C# NPOI导出Excel以及动态设置列宽
    【c++设计模式】观察者模式
    【c++设计模式】状态模式
    【c++设计模式】职责链模式
    【c++设计模式】命令模式
  • 原文地址:https://www.cnblogs.com/pythonywy/p/14759623.html
Copyright © 2011-2022 走看看