安裝
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"