Ви працюєте в кібербезпеці компанії? Хочете, щоб ваша компанія рекламувалася на HackTricks? або ви хочете мати доступ до останньої версії PEASS або завантажити HackTricks у форматі PDF? Перевірте ПЛАНИ ПІДПИСКИ!
Відкрийте для себе Сім'ю PEASS, нашу колекцію ексклюзивних NFT
Підказка щодо баг-баунті: зареєструйтеся на Intigriti, преміальній платформі для баг-баунті, створеній хакерами для хакерів! Приєднуйтесь до нас на https://go.intigriti.com/hacktricks сьогодні, і почніть заробляти винагороди до $100,000!
Деякі частини оригінального коду не працюють і були змінені тут.
Частина 2
Тут ви можете побачити приклад того, як підключити 2 функції з однаковою назвою, але з різними параметрами.
Також ви дізнаєтеся, як викликати функцію зі своїми параметрами.
І нарешті, є приклад того, як знайти екземпляр класу та змусити його викликати функцію.
//s2.jsconsole.log("Script loaded successfully ");Java.perform(functionx() {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 functionconsole.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 functionconsole.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.pyimport fridaimport timedevice = frida.get_usb_device()pid = device.spawn(["com.example.a11x256.frida_test"])device.resume(pid)time.sleep(1)#Without it Java.perform silently failssession = device.attach(pid)script = session.create_script(open("s2.js").read())script.load()#prevent the python script from terminatingraw_input()
python loader.py
Частина 3
Python
Зараз ви побачите, як надсилати команди до підцепленої програми через Python для виклику функції:
Команда "1" вийде, команда "2" знайде та екземпляр класу та викличе приватну функціюsecret(), а команда "3" підключить функцію secret() так, що вона повернеінший рядок.
Таким чином, якщо ви викличете "2", ви отримаєте справжню таємницю, але якщо ви викличете "3", а потім "2", ви отримаєте фальшиву таємницю.
JS
console.log("Script loaded successfully ");var instances_array = [];functioncallSecretFun() {Java.perform(function () {if (instances_array.length==0) { // if array is emptyJava.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 valuesconsole.log("Result of secret func: "+ instances_array[0].secret());}});}functionhookSecret() {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
Тут ви побачите, як зробити взаємодію Python та JS за допомогою об'єктів JSON. JS використовує функцію send() для відправлення даних клієнту Python, а Python використовує функції post() для відправлення даних до JS скрипту. JS буде блокувати виконання до отримання відповіді від Python.
Підказка щодо винагороди за помилки: зареєструйтеся на Intigriti, преміальній платформі для винагород за помилки, створеній хакерами для хакерів! Приєднуйтесь до нас на https://go.intigriti.com/hacktricks сьогодні, і почніть заробляти винагороди до $100,000!
Ви працюєте в кібербезпецівій компанії? Хочете, щоб ваша компанія рекламувалася на HackTricks? або ви хочете мати доступ до останньої версії PEASS або завантажити HackTricks у PDF? Перевірте ПЛАНИ ПІДПИСКИ!
Дізнайтеся про Сім'ю PEASS, нашу колекцію ексклюзивних NFT