zoukankan      html  css  js  c++  java
  • objection使用

    安装

    python3.6 -m pip install objection
    

    objection注入指定应用。

    objection -g cxa.com.logindemo explore
    

    查找所有可用activities

     android hooking list activities
    

    结果

    cxa.com.logindemo.MainActivity
    
    Found 1 classes
    

    之后可以查在这个类下面有哪些方法

    android hooking list class_methods cxa.com.logindemo.MainActivity
    

    结果

    public native java.lang.String cxa.com.logindemo.MainActivity.get_str(java.lang.String,java.lang.String)
    public static java.lang.Object cxa.com.logindemo.MainActivity.access$super(cxa.com.logindemo.MainActivity,java.lang.String,java.lang.Object...)
    public void cxa.com.logindemo.MainActivity.onCreate(android.os.Bundle)
    
    Found 3 method(s)
    

    发现方法名和参数基本上一样。
    之后可以通过objection生成frida的代码

    android hooking generate  simple cxa.com.logindemo.MainActivity
    

    生成的结果如下:

    Java.perform(function() {
        var clazz = Java.use('cxa.com.logindemo.MainActivity');
        clazz.get_str.implementation = function() {
    
            //
    
            return clazz.get_str.apply(this, arguments);
        }
    });
    
    
    Java.perform(function() {
        var clazz = Java.use('cxa.com.logindemo.MainActivity');
        clazz.access$super.implementation = function() {
    
            //
    
            return clazz.access$super.apply(this, arguments);
        }
    });
    
    
    Java.perform(function() {
        var clazz = Java.use('cxa.com.logindemo.MainActivity');
        clazz.onCreate.implementation = function() {
    
            //
    
            return clazz.onCreate.apply(this, arguments);
        }
    });
    

    生成了一个基本的框架,参数啥的还需要我们自己补充

    除此之外还可以监视进行某个操作的时候调用了哪些方法

    android hooking watch class cxa.com.logindemo.MainActivity
    

    得到结果

    (agent) Hooking cxa.com.logindemo.MainActivity.access$super(cxa.com.logindemo.MainActivity, java.lang.String, [Ljava.lang.Object;)
    (agent) Hooking cxa.com.logindemo.MainActivity.get_str(java.lang.String, java.lang.String)
    (agent) Hooking cxa.com.logindemo.MainActivity.onCreate(android.os.Bundle)
    (agent) Registering job 3rwdi3ui6lu. Type: watch-class for: cxa.com.logindemo.MainActivity
    

    然后可以调用上面查到的方法,查看其方法的调用栈和返回值以及参数

    android hooking watch class_method cxa.com.logindemo.MainActivity.get_str --dump-args --dump-return --dump-backtrace
    

    结果如下

    cxa.com.logindemo on (google: 8.1.0) [usb] # android hooking watch class_method cxa.com.logindemo.MainActivity
    .get_str --dump-args --dump-return --dump-backtrace
    
    (agent) Attempting to watch class cxa.com.logindemo.MainActivity and method get_str.
    (agent) Hooking cxa.com.logindemo.MainActivity.get_str(java.lang.String, java.lang.String)
    (agent) Registering job vut0pnx8gnn. Type: watch-method for: cxa.com.logindemo.MainActivity.get_str
    cxa.com.logindemo on (google: 8.1.0) [usb] # (agent) [vut0pnx8gnn] Called cxa.com.logindemo.MainActivity.get_str(java.lang.String, java.lang.String)
    (agent) [vut0pnx8gnn] Backtrace:
            cxa.com.logindemo.MainActivity.get_str(Native Method)
    	cxa.com.logindemo.MainActivity$1.onClick(MainActivity.java:37)
    	android.view.View.performClick(View.java:6294)
    	android.view.View$PerformClick.run(View.java:24770)
    	android.os.Handler.handleCallback(Handler.java:790)
    	android.os.Handler.dispatchMessage(Handler.java:99)
    	android.os.Looper.loop(Looper.java:164)
    	android.app.ActivityThread.main(ActivityThread.java:6494)
    	java.lang.reflect.Method.invoke(Native Method)
    	com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    	com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
    	de.robv.android.xposed.XposedBridge.main(XposedBridge.java:108)
    
    (agent) [vut0pnx8gnn] Arguments cxa.com.logindemo.MainActivity.get_str("same", "1234")
    (agent) [vut0pnx8gnn] Return Value: "samehook this method1234"
    

    可以发现它的两个参数类型为string,并且看到其调用栈以及其返回值。

    完整的android代码

    package cxa.com.logindemo;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Base64;
    import android.util.Log;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        EditText Name; //定义Plain Test控件第一个输入框的名字
        EditText Pass; //定义Plain Test控件第二个输入框的名字
        TextView message_tv;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Name = (EditText) findViewById(R.id.TEXT_NAME);//通过findViewById找到输入框控件对应的id,并给他起个名字
            Pass = (EditText) findViewById(R.id.TEST_PASS);//通过findViewById找到输入框控件对应的id,并给他起个名字
            message_tv = ((TextView) findViewById(R.id.textView3));
            Button Login = (Button) findViewById(R.id.BTN_LOGIN);
            Login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //check(Name.getText().toString().trim(), Pass.getText().toString().trim());
                    //调用check函数
                    if (Name.getText().toString().compareTo("cxa") == 0) {
                        message_tv.setText("你不能使用cxa这个用户登录");
                        return;
                    }
                    message_tv.setText("成果躲开用户判断 :" + Base64.encodeToString((Name.getText().toString() + ":" + Pass.getText().toString()).getBytes(), Base64.DEFAULT));
                    Toast.makeText(MainActivity.this, get_str(Name.getText().toString(),Pass.getText().toString()), Toast.LENGTH_SHORT).show();//弹框
    
                }
            });
        }
    
        //
    //    public void check(String name, String pass) {
    //        //定义函数check 这里检查用户名和密码
    //        //是否为
    //        if (name.equals("cxa") && pass.equals("1234")) {
    //            Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();//弹框
    //
    //        } else {
    //            Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_SHORT).show();// 弹框
    //
    //        }
    //
    //
    //    }
        public String get_str(String params_a,String params_b) {
            String c =params_a.concat("hook this method"+params_b);
            return c;
        }
    }
    
    

    spawn的形式

    objection -g com.hd.zhibo explore --startup-command "android hooking watch class_method android.app.AlertDialog.onCreate --dump-args --dump-backtrace --dump-return"
    

    参考链接:
    https://www.anquanke.com/post/id/197657

  • 相关阅读:
    测开之路一百一十:bootstrap图片
    测开之路一百零九:bootstrap列表
    测开之路一百零八:bootstrap表格
    测开之路一百零七:bootstrap排版
    测开之路一百零六:bootstrap布局
    学生管理之原生分页方法
    Ajax文件上传三式
    学生管理之模板继承
    Django之Models的class Meta
    [C++]指针/指针数组/数组指针/多维指针/单值指针/多值指针
  • 原文地址:https://www.cnblogs.com/c-x-a/p/13493629.html
Copyright © 2011-2022 走看看