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!
여기에서 같은 이름을 가진 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()
명령어 "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};
Part 4
여기에서는 Python과 JS가 JSON 객체를 사용하여 상호작용하는 방법을 보여줍니다. JS는 send() 함수를 사용하여 데이터를 Python 클라이언트에 전송하고, Python은 post() 함수를 사용하여 데이터를 JS 스크립트에 전송합니다. JS는 Python으로부터 응답을 받을 때까지 실행을 차단합니다.