Bug bounty tip : sign up for Intigriti , a premium bug bounty platform created by hackers, for hackers ! Join us at https://go.intigriti.com/hacktricks today, and start earning bounties up to $100,000 !
This is a summary of the post : https://11x256.github.io/Frida-hooking-android-part-2/ (Parts 2, 3 & 4)
APKs and Source code : https://github.com/11x256/frida-android-examples
第1部はとても簡単です。
元のコードの一部は動作せず、ここで修正されています。
Part 2
ここでは、同じ名前の2つの関数を異なるパラメータでフックする 方法の例を見ることができます。
また、自分のパラメータで関数を呼び出す 方法を学びます。
最後に、クラスのインスタンスを見つけて関数を呼び出す 方法の例があります。
Copy //s2.js
console .log ( "Script loaded successfully " );
Java .perform ( function x () {
console .log ( "Inside java perform function" );
var my_class = Java .use ( "com.example.a11x256.frida_test.my_activity" );
//Hook "fun" with parameters (int, int)
my_class . fun .overload ( "int" , "int" ). implementation = function (x , y) { //hooking the old function
console .log ( "original call: fun(" + x + ", " + y + ")" );
var ret_value = this .fun ( 2 , 5 );
return ret_value;
};
//Hook "fun" with paramater(String)
var string_class = Java .use ( "java.lang.String" );
my_class . fun .overload ( "java.lang.String" ). implementation = function (x) { //hooking the new function
console .log ( "*" )
//Create a new String and call the function with your input.
var my_string = string_class .$new ( "My TeSt String#####" );
console .log ( "Original arg: " + x);
var ret = this .fun (my_string);
console .log ( "Return value: " + ret);
console .log ( "*" )
return ret;
};
//Find an instance of the class and call "secret" function.
Java .choose ( "com.example.a11x256.frida_test.my_activity" , {
onMatch : function (instance) {
console .log (tring , and the it has "Found instance: " + instance);
console .log ( "Result of secret func: " + instance .secret ());
} ,
onComplete : function () { }
});
});
あなたは、最初に java.lang.String クラスを参照し、その後に文字列をコンテンツとして持つ $new オブジェクトをそのクラスの新しいオブジェクトとして作成していることがわかります。これはクラスの新しいオブジェクトを作成する正しい方法です。しかし、この場合、this.fun()
に任意の文字列を渡すことができます。例えば: this.fun("hey there!")
Python
Copy // loader . py
import frida
import time
device = frida . get_usb_device ()
pid = device . spawn ([ "com.example.a11x256.frida_test" ])
device . resume (pid)
time . sleep ( 1 ) #Without it Java.perform silently fails
session = device . attach (pid)
script = session . create_script ( open ( "s2.js" ). read ())
script . load ()
#prevent the python script from terminating
raw_input ()
Part 3
Python
今から、フックされたアプリにコマンドを送信して関数を呼び出す方法を見ていきます:
Copy // loader . py
import time
import frida
def my_message_handler ( message , payload ):
print message
print payload
device = frida . get_usb_device ()
pid = device . spawn ([ "com.example.a11x256.frida_test" ])
device . resume (pid)
time . sleep ( 1 ) # Without it Java.perform silently fails
session = device . attach (pid)
with open ( "s3.js" ) as f :
script = session . create_script (f. read ())
script . on ( "message" , my_message_handler)
script . load ()
command = ""
while 1 == 1 :
command = raw_input ( "Enter command:\n1: Exit\n2: Call secret function\n3: Hook Secret\nchoice:" )
if command == "1" :
break
elif command == "2" :
script . exports . callsecretfunction ()
elif command == "3" :
script . exports . hooksecretfunction ()
コマンド "1 " は 終了 し、コマンド "2 " はクラスの インスタンスを見つけてプライベート関数 secret() を呼び出し、コマンド "3 " は関数 secret() を フック して 異なる文字列 を 返します 。
そのため、もし "2 " を呼び出すと 本当の秘密 が得られますが、もし "3 " を呼び出してから "2 " を呼び出すと 偽の秘密 が得られます。
JS
Copy console .log ( "Script loaded successfully " );
var instances_array = [];
function callSecretFun () {
Java .perform ( function () {
if ( instances_array . length == 0 ) { // if array is empty
Java .choose ( "com.example.a11x256.frida_test.my_activity" , {
onMatch : function (instance) {
console .log ( "Found instance: " + instance);
instances_array .push (instance)
console .log ( "Result of secret func: " + instance .secret ());
} ,
onComplete : function () { }
});
}
else { //else if the array has some values
console .log ( "Result of secret func: " + instances_array[ 0 ] .secret ());
}
});
}
function hookSecret () {
Java .perform ( function () {
var my_class = Java .use ( "com.example.a11x256.frida_test.my_activity" );
var string_class = Java .use ( "java.lang.String" );
my_class . secret .overload (). implementation = function (){
var my_string = string_class .$new ( "TE ENGANNNNEEE" );
return my_string;
}
});
}
rpc .exports = {
callsecretfunction : callSecretFun ,
hooksecretfunction : hookSecret
};
Part 4
ここでは、PythonとJSがJSONオブジェクトを使用して相互作用する 方法を示します。JSはsend()
関数を使用してデータをPythonクライアントに送信し、Pythonはpost()
関数を使用してデータをJSスクリプトに送信します。JSはPythonからの応答を受け取るまで実行をブロックします。
Python
Copy // loader . py
import time
import frida
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" )
user , pw = data . split ( ":" )
data = ( "admin" + ":" + pw) . encode ( "base64" )
print "encoded data:" , data
script . post ({ "my_data" : data}) # send JSON object
print "Modified data sent"
device = frida . get_usb_device ()
pid = device . spawn ([ "com.example.a11x256.frida_test" ])
device . resume (pid)
time . sleep ( 1 )
session = device . attach (pid)
with open ( "s4.js" ) as f :
script = session . create_script (f. read ())
script . on ( "message" , my_message_handler) # register the message handler
script . load ()
raw_input ()
JS
Copy 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;
}) .wait (); //block execution till the message is received
console .log ( "Final string_to_recv: " + string_to_recv)
return this .setText (string_to_recv);
}
});
There is a part 5 that I am not going to explain because there isn't anything new. But if you want to read it is here: https://11x256.github.io/Frida-hooking-android-part-5/
バグバウンティのヒント : ハッカーによって、ハッカーのために作られたプレミアム バグバウンティプラットフォーム Intigritiにサインアップ しましょう!今日、https://go.intigriti.com/hacktricks に参加して、最大**$100,000**の報酬を得始めましょう!