본문 바로가기

Mobile/Android

[연습1] 루팅 탐지(exec 방식)

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void RootClick(View v){
boolean rst = false;
TextView rootresult = (TextView) findViewById(R.id.rootresult);
try{
Runtime.getRuntime().exec("su");
rst = true;
}catch(Exception e){
rst = false;
}
if(rst==false){
//메시지 박스 추가 필요
}
rootresult.setText(String.valueOf(rst));
}
}


다음과 같이 작성하여 메시지 박스를 띄우는것을 목적으로 한다.


XML 코드는 다음과 같다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
android:id="@+id/rootresult"
android:layout_width="223dp"
android:layout_height="248dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="33dp"
android:layout_marginTop="41dp"
tools:text="rooting result" />

<Button
android:id="@+id/rootcheck"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/rootresult"
android:layout_alignParentTop="true"
android:layout_marginStart="204dp"
android:layout_marginTop="45dp"
android:text="Root_check"
android:onClick="RootClick"/>
</RelativeLayout>



TextView rootresult = (TextView) findViewById(R.id.rootresult); - XML 부분에서 텍스트뷰 생성 후 java에서 다음과 같이 선언이 필요하다.


TextView 타입의 rootresult 라는 이름의 컴포넌트에 (TextView) 타입의 rootresult라는것을 검색 후 할당한다. (일단 막 적는다 )ㅋㅋ


Runtime.getRuntime().exec("명령어") 를 사용하여 해당 명령어가 사용가능한지 아닌지 판별한다. 여기선 루팅할경우 생성되는 커맨드 중 하나인 su 명령어가 사용된다


* su 명령어가 사용되는 경우 true를 아닌 경우 false 를 리턴하도록 작성한다. 그와 동시에 값의 결과 TextView에서 선언한 값으로 반환되게 작성한다.




메시지박스까지 exec를 사용한 루팅탐지 최종본

package tuto.knowryu.tutorial;

import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void RootClick(View v){
boolean rst = false;
TextView rootresult = (TextView) findViewById(R.id.rootresult);
try{
Runtime.getRuntime().exec("su");
rst = true;
}catch(Exception e){
rst = false;
}
if(rst){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
alertDialogBuilder.setTitle("경고");
alertDialogBuilder.setMessage("루팅된 단말에서는 사용하실수없습니다.");
alertDialogBuilder.setPositiveButton("종료", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),"종료됩니다.",Toast.LENGTH_LONG).show();
int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
}
});
//메시지 박스 추가 필요
alertDialogBuilder.show();
}
rootresult.setText(String.valueOf(rst));
}

}


exec를 사용한 루팅탐지.apk





frida 를 사용하여 spawn 하기.


import frida, sys




pname = "tuto.knowryu.tutorial"

jscode ="""

console.log("[*] Start");

    Java.perform(function (){

        console.log("attache")

        }

   );

"""


device = frida.get_device_manager().enumerate_devices()[-1]

pid = device.spawn(pname)

session = device.attach(pid)

script = session.create_script(jscode)

script.load()

device.resume(pid)

#session.detach()

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



'Mobile > Android' 카테고리의 다른 글

[연습3]JNI 디버깅  (0) 2018.12.05
[연습1] 루팅 탐지(exec 방식) 을 Frida를 사용하여 우회.  (0) 2018.11.19