본문 바로가기

컴퓨터/안드로이드 프로그래밍

다른 앱 데이터 파일 복사하기

반응형

보통 안드로이드의 앱의 데이터가 저장되는 장소는 /data/data/{app package name}/에 저장이 된다. 여기서 말하는 앱의 데이터는 SQLite로 쓰여진 Database나 SharedPreference로 쓰여진 shared_pref 파일, cache 파일들을 포함하고 있다. 이러한 데이터들에 쉽게 접근을 할 수 있다면 계정 정보의 탈취가 발생할 수 있으므로 일반적인 권한으로는 파일에 직접 접근을 할 수가 없으며, 다른 앱에서의 접근 또한 막아놓는 것이 정상적이다.


여기에서 등장하는 것이 바로 Rooting이다. Rooting은 관리자 권한을 획득하는 행위로, 일반적으로는 Android에서는 Root 권한을 제공하지 않는다. Rooting을 하려고 하는 이유는 안드로이드의 시스템 파일 등에 접근을 하고 수정을 할 수 있으며(오버 클럭이나 혹은 부팅 이미지 바꾸기 등), 다른 앱의 데이터의 접근이 가능해지며(게임의 경우에 가진 돈의 금액을 바꾸는 등), 기본적으로 휴대폰을 구매하면 설치되어 있는 통신사 앱들도 삭제가 가능하다.(쓰지도 않는 싸이월드나 증권 앱...)


이러한 Rooting의 위험성에 대해서는 나중에 설명하기로 하자. 여기에서는 루팅한 기기에서 다른 앱 데이터 파일을 복사하는 것이 목표이기 때문에 그에 대한 설명을 하도록 하겠다.


다른 앱 데이터 파일을 일반적인 방법으로 연다면 Access Denied라는 메시지를 보게 될 것이다.(그 앱의 데이터를 Global Mode로 생성하지 않는 이상...) 그렇기 때문에 구현한 앱이 루트 권한을 가지게 해서 파일을 열게 된다면 이 문제를 해결할 수 있다. 그래서 이것을 소스코드로 구현한 것이 바로 아래와 같은 코드이다.


private void copyFile(String filepath1, String filepath2){
	try{
		int user_id = getApplicationInfo().uid;
		Process suProcess = Runtime.getRuntime().exec("su");
		DataOutputStream os =
				new DataOutputStream(suProcess.getOutputStream());
		String [] commands = new String[]{
			"chmod 0777 " + filepath1 + "\n",
			"cat " + filepath1 + " > " + filepath2 + "\n",
			"chown "+user_id+":"+user_id+" "+ filepath2+ "\n",
			"chmod 0660 "+ filepath2+ "\n",
			"chmod 0660 "+ filepath1+ "\n"
		};
		for(String command:commands){
			os.writeBytes(command);
			os.flush();
		}
		os.writeBytes("exit\n");
		os.flush();
		suProcess.waitFor();
	} catch(IOException e){
		e.printStackTrace();
	} catch( InterruptedException e){
		e.printStackTrace();
	}
}


소스코드에 대해 설명하지면 일단 suProcess를 통해서 루트 권한의 프로세스를 생성한 다음, 복사할 파일의 권한을 0777로 바꾸고 cat 명령어로 데이터를 복사한 다음, 복사할 파일의 권한을 다시 0666으로 바꾸고, 복사된 파일 또한 다른 앱에서 접근을 할 수 없도록 0666으로 바꾸는 과정을 거치고, 마지막으로 exit 명령어로 루트 권한의 프로세스를 종료하는 과정이다. 그리고 루트 권한의 프로세스로 돌아가고 있기 때문에 생성된 파일의 소유자는 루트가 되어 있으므로, 이것을 우리가 만들고 있는 앱이 소유자가 될 수 있도록 하게 하기 위해서 getApplicationData().uid를 통해 앱의 userid를 알아내어서 chown 명령어로 소유자를 변경하였다.


가장 중요한 것은 테스트 기기가 무조건 루팅이 되어있어야 이 방법을 사용할 수 있다는 것을 명심해야 한다. 만약 루팅이 되어 있지 않고, 앱이 파일을 생성시 Global로 설정이 되어 있지 않다면, 안드로이드의 취약점을 이용하지 않는 이상 접근을 할 방법이 없다.



반응형