APP/AOS

learnfrida hooking1 - SHAREDPREPERENCES CHECK

3년안에 내집 마련 2023. 1. 5. 21:12
반응형

SHAREDPREFERENCES CHECK 클릭 시 "Instrumentation is not coorect" Toast 메시지 출력하는 것 확인하였다.

JADX-gui를 통해 learnfrida APP 확인 해보니

learnfrida 코드

sharedPreferences.getString의 메소드를 사용하여 "2131689593"이라는 값을 찾아서stringValue 값에 집어 넣는데 만약 값이 없으면 "foobarstring"이라는 값을 stringValue에 넣는 것 같다.

그리고 stringValue 값과 "foobarstring" 값을 비교하여 만약 일치하는 경우 위에 그림처럼 나오는 것이고 아니면 다른 Toast 메시지를 출력하는 방식인 것 같다.

stringValue 값을 변조 하여 else문이 동작하도록 후킹코드를 짜 보았다.

Java.perform(() => {
   var sharedPreferences = Java.use('android.content.SharedPreferences');
   sharedPreferences.getString.overload('java.lang.String', 'java.lang.String').implementation = function(value, defaultvalue) {
      console.log("on_enter parameters", value, defaultvalue);
   };   
});

 

getString에서 return될 값을 변조할 것이기 때문에 getString 메소드 후킹을 시도 하였다.

getString 메소드를 후킹 하기 위해서는 getSting 메소드를 포함하고 있는 sharedPreferences 클래스를 사용해야 했고 sharedPreferences 클래스는 "android.content.SharedPreferences" 패키지 안에 정의되어 있으므로  사용하기 위하여  Java.use를 사용하였다.

SharedPreferences  |  Android Developers

 

SharedPreferences  |  Android Developers

 

developer.android.com

 

다음으로 여러개의 getString 메소드 중 우리는 문자열 2개를 받는 getString 메소드를 후킹할 것이기 때문에 "sharedPreferences.getString.overload('java.lang.String', 'java.lang.String').implementation = function(value, defaultvalue)" 방식으로 작성하였다.

우선 내 진단 폰에서는 현재 stringValue가 어떤 값을 출력하는지 확인하기 위하여 값을 찍어보는 코드를 작성하였다.

그 후 동작을 해보았다.

동작 코드 = frida -U -f [패키지명] -l [작성코드]

실행 시키니

정상적으로 실행은 되었지만 아무것도 출력되는것이 없었다.

확인을 해보니 sharedPreferences 클래스를 사용하기 위해서는 "android.app.SharedPreferencesImpl" 패키지를 불러왔어야 한다고 한다.

그래서 코드를 다음과 같이 수정하였다.

Java.perform(() => {
   var sharedPreferences = Java.use('android.app.SharedPreferencesImpl');
   sharedPreferences.getString.overload('java.lang.String', 'java.lang.String').implementation = function(value, defaultvalue) {
      console.log("on_enter parameters", value, defaultvalue);
   };
});

다시 실행시켜보니

다음과 같은 에러가 발생하였고 에러를 해석해보니 getString 메소드는 return 값이 필요하다는 에러인 것 같아서 return  값을 추가해주었다.

Java.perform(() => {
   var sharedPreferences = Java.use('android.app.SharedPreferencesImpl');
   sharedPreferences.getString.overload('java.lang.String', 'java.lang.String').implementation = function(value, defaultvalue) {
      console.log("on_enter parameters", value, defaultvalue);
      
      return value;
   };
});

다시 실행시켜보면

learnfrida의 getString 메소드에서 보이던 값이 출력이 되는 것을 확인하였다.

learnfrida 코드를 확인해보면 stringValue가 "foobarstring"이 아닌 경우 else문으로 동작하기 때문에 defaultvalue 값을 "foobarstring"이 아닌 다른 값으로 바꿔 주기로 했다.

Java.perform(() => {
   var sharedPreferences = Java.use('android.app.SharedPreferencesImpl');
   sharedPreferences.getString.overload('java.lang.String', 'java.lang.String').implementation = function(value,defaultvalue) {
      defaultvalue = "park"
      console.log("on_enter parameters", value, defaultvalue);
      return defaultvalue;
   };
});

나는 defaultvalue 값을 "park"으로 설정하였다. 또한 getString 메소드의 return 값을 "park"으로 설정하여 stringValue의 값을 "foobarstring"이 아닌 "park"으로 설정하였다.

이제 해당 후킹 코드를 실행 시키면

defaultvalue 값은 "park"으로 변경되어 있고 그 값이 stringValue 값으로 return 되므로 

후킹이 정상적으로 동작하여 "Instrumentation OK!"로 바뀌는 것을 확인할 수 있다.

반응형