从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert) ! 你在网络安全公司 工作吗?想让你的公司在HackTricks中宣传 吗?或者想要获取PEASS的最新版本或下载HackTricks的PDF 吗?查看订阅计划 !
漏洞赏金技巧 :注册 Intigriti,一个由黑客创建的高级漏洞赏金平台 !立即加入我们,访问https://go.intigriti.com/hacktricks ,开始赚取高达**$100,000**的赏金!
这是帖子的摘要 :https://11x256.github.io/Frida-hooking-android-part-2/ (第2、3和4部分)
APK和源代码 :https://github.com/11x256/frida-android-examples
第1部分很简单。
原始代码的某些部分不起作用,在这里已经进行了修改。
第2部分
在这里,你可以看到一个示例,演示如何挂钩具有相同名称但不同参数的2个函数 。
此外,你将学习如何使用自己的参数调用函数 。
最后,还有一个示例,演示如何找到一个类的实例并使其调用一个函数 。
复制 //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
复制 // 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 ()
第3部分
Python
现在您将看到如何通过Python向挂钩的应用程序发送命令以调用函数:
复制 // 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
复制 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
};
第4部分
在这里,您将看到如何使用JSON对象使Python和JS进行交互 。JS使用send()
函数将数据发送到Python客户端,Python使用post()
函数将数据发送到JS脚本。JS将阻塞执行 ,直到收到来自Python的响应。
Python
复制 // 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
JS
复制 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);
}
});
这里有第5部分,我不打算解释,因为没有什么新内容。但如果你想阅读,可以点击这里:https://11x256.github.io/Frida-hooking-android-part-5/
漏洞赏金提示 :注册 Intigriti,这是一家由黑客创建的高级漏洞赏金平台 !立即加入我们:https://go.intigriti.com/hacktricks ,开始赚取高达**$100,000**的赏金!
从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert) ! 你在网络安全公司 工作吗?想要在HackTricks中看到你的公司广告 ?或者想要访问PEASS的最新版本或下载PDF格式的HackTricks ?查看订阅计划 !
加入 💬 Discord群组 ](https://discord.gg/hRep4RUj7f) 或电报群组 ](https://t.me/peass) 或在Twitter 上关注我 🐦@carlospolopm 。
通过向hacktricks仓库 ](https://github.com/carlospolop/hacktricks) 和 hacktricks-cloud仓库 提交PR来分享你的黑客技巧。