http://taesun1114.tistory.com/entry/안드로이드-프록시-사용-유무-체크에서 포스팅했던 Proxy Check하는 App을 이용하여 Proxy Check를 우회해 보려고 합니다.


Frida 공식 홈페이지는 아래와 같으며, 홈페이지를 통해 여러 정보를 획득할 수 있습니다.

https://www.frida.re/docs/home/



Test App Souce)


package com.example.gnsan.myapplication;

import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.*;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textview = (TextView)findViewById(R.id.test);
if(System.getProperty("http.proxyHost")!=null) {
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
android.os.Process.killProcess(android.os.Process.myPid());
}
});
alert.setMessage("Denied Proxy");
alert.show();
textview.setText(System.getProperty("http.proxyHost"));
}
}
}

프록시 유무를 체크한 후, 프록시를 사용중이라면 알림을 띄운 후 앱을 종료하는 간단한 소스입니다.


          

<프록시 사용 x>                                <프록시 사용 o>





프록시를 우회하는 Frida Code는 다음과 같습니다.



import sys
import frida



def on_message(message,data):
 print "[RET Value] -> %s" % (message)



PACKAGE_NAME = "com.example.gnsan.myapplication"

jscode = """
 Java.perform(function(){
  var System = Java.use("java.lang.System");   //System.getProperty함수는 java.lang.System
  System.getProperty.overloads[0].implementation = function(prop){ 
   return ;  // 프록시를 사용하지 않을 때 getProperty함수는 null을 리턴함
  }
 });
"""


try:
     device = frida.get_usb_device(timeout=10)
     pid = device.spawn([PACKAGE_NAME])    //Packagename으로 앱을 찾음
     print("App is starting ... pid : {}".format(pid))
     process = device.attach(pid)        
     device.resume(pid)    //resume을 해주지 않으면 화면을 불러올 수 없음
     script = process.create_script(jscode)
     script.on('message',on_message)
     print('[*] Running Frida')
     script.load()
     sys.stdin.read()
except Exception as e:
     print(e)



출처: http://hyunmini.tistory.com/111?category=523090 [Hyunmini]


-----------------------------------------------------------------------------------

실패한 jscode


var isproxy = Java.use("java.lang.System");
 isproxy.getProperty.implementation=function(a){   

 

  //overloads를 해주지 않으면 error 

  //어느경우에 overload를 하는지 아시는분은 댓글로 부탁드립니다

  //overload는 다음을 통해 알게됨 : 출처: http://hyunmini.tistory.com/111?category=523090 [Hyunmini]


 console.log("getProperty's called!");
 this.getProperty();
 };



var test = Java.use("java.lang.System");
 Interceptor.attach(Module.findExportByName(null,'getProperty'),{

             //findExportByName으로 getProperty를 찾으려했으나 실패함
  onLeave: function(retVal){
   console.log("HI");
   var orig_rtn = retVal.toString();
   send("return vallue :"+orig_rtn);
   retVal.replace("null");
  }
 };


-----------------------------------------------------------------------------------

  .overload() Example
    .overload('java.lang.String')
    .overload('android.app.Activity')
    .overload('int')
    .overload('[B') // byte array
    .overload('float')
    .overload('android.content.Context')
    .overload('[C')
    .overload('android.content.Context', 'android.view.View')
    .overload('android.app.Activity', 'com.cherrypicks.hsbcpayme.model.object.PayMeNotification')
    .overload('android.content.Context', 'boolean')
    .overload('android.content.Context', 'int')
    .overload('android.content.Context', 'java.lang.String')
    .overload('android.app.Activity', 'int')
    .overload('java.lang.String', 'java.lang.String')
    .overload('android.content.Context', 'android.graphics.Bitmap')
    .overload('java.lang.String', 'java.io.File')
    .overload('android.content.Context', 'java.lang.String', 'java.util.List')
    .overload('java.lang.String', 'java.lang.String', 'java.lang.String')
    .overload('java.lang.String', '[B', '[B')
    .overload('java.lang.String', 'java.lang.String', 'android.content.Context')
    .overload('android.app.Activity', 'com.cherrypicks.hsbcpayme.model.object.PayMeNotification', 'int')
    .overload('[B', '[B', '[B')
    .overload('android.content.Context', 'java.lang.String', 'java.lang.String')
    .overload('android.app.Activity', 'int', 'int', 'int', 'boolean')

+ Recent posts