Frida Tutorial 2

从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert)

漏洞赏金技巧注册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()
python loader.py

第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?查看订阅计划

  • 探索我们的独家NFTs收藏品The PEASS Family

  • 加入💬 Discord群组](https://discord.gg/hRep4RUj7f) 或电报群组](https://t.me/peass) 或在Twitter上关注我 🐦@carlospolopm

  • 通过向hacktricks仓库](https://github.com/carlospolop/hacktricks) hacktricks-cloud仓库 提交PR来分享你的黑客技巧。

最后更新于