JHLBLUE
안드로이드 smali 패치하기3 본문
원본코드
smali 코드 패치로 토스트 메시지 출력하기
1. toast 메시지를 출력하는 smali 코드 확인하기
toast 메시지를 출력하는 smali 코드를 확인하기 위해 toast 메시지를 출력하는 java 코드를 작성한 뒤 디컴파일 과정을 거쳐 toast 메시지와 관련된 smali 코드를 알아낸다.
Toast.makeText() 함수는 총 3개의 파라미터를 필요로 하고, 각각 Context, 표시할 텍스트, 표시할 길이 정보이며, 이 중 Toast 메시지 출력을 위해서는 기존 코드에 추가로 표시할 텍스트, 표시할 길이 정보를 저장할 레지스터가 추가로 필요하다.
2. 원본코드의 onCreate() smali 코드 확인하기
다음은 안드로이드 스튜디오에서 프로젝트를 생성한 뒤 아무런 java 코드도 추가하지 않은 앱을 디컴파일했을 때 나오는 결과이다.
첫 번째로 추가 레지스터를 사용하기 위해 locals의 값을 0에서 1로 수정한다.
해당 함수에서는 p0, p1 레지스터를 이미 사용 중이며, 그 중 p0 레지스터는 context 정보를 가지고 있고, makeText() 함수의 파라미터 중 첫 번째는 context 정보를 입력해야 하기 때문에 해당 코드에서 임의의 데이터를 저장하여 사용할 수 있는 레지스터는 p1 레지스터이다. 따라서 추가로 하나의 레지스터를 더 사용하기 위해 locals의 값을 0에서 1로 수정한다.
두 번째로 표시할 텍스트 값을 저장하기 위해 레지스터에 텍스트 데이터를 저장하는 smali 코드를 추가한다. 이 때 레지스터는 p1 또는 v0 중 아무 레지스터나 사용해도 무방하다.
세 번째로 Toast 메시지를 표시할 길이정보를 저장할 레지스터에 값을 저장한다. 이 값은 0 또는 1로, Toast 클래스의 LENGTH_LONG, LENGTH_SHORT 변수 내용을 참고한다.
마지막으로 makeText() 함수를 호출하고, 해당 함수의 파라미터가 적절하게 입력되도록 코드를 추가한다.
이 부분에서 주의할 점은 makeText() 함수는 반환값이 존재하며, 반환하는 데이터는 Toast 객체이기 때문에 move-result-object p0 코드가 추가된다. 즉,
위의 java 코드는 아래 코드로 대체가 가능하다.
따라서 move-result-object 코드로 반환값을 레지스터에 저장한 뒤 show() 함수를 호출하는 코드를 추가해야 토스트 메시지가 출력된다.
패치 과정을 거친 smali 코드와 앱 실행 결과는 아래와 같다.
추가로 java 코드에서 Toast를 사용하기 위해서는 Toast 클래스를 import 하는 코드가 필요하지만, smali에서는 이와 관련된 코드가 존재하지 않는다.
또한, 패치한 앱을 jd-gui 등의 도구로 java 코드로 디컴파일할 경우 Toast 클래스를 import 하는 코드가 자동으로 생성된다.
import는 자바에서 사용하는 문법 중 클래스의 전체 경로를 입력하지 않아도 해당 클래스를 사용할 수 있도록 하는 일종의 문법으로, import 코드 없이 아래와 같이 사용할 클래스의 전체 경로를 입력하는 방법으로도 사용이 가능하기 때문이다.
또한, 아래의 예시와 같이 smali 코드에서도 전체 경로를 입력하여 해당 클래스나 함수 등을 사용하기 때문에 java의 import와 관련된 smali 코드는 없다고 볼 수 있다.
'Android' 카테고리의 다른 글
안드로이드 smali 패치하기4 (0) | 2019.02.08 |
---|---|
안드로이드 smali 패치하기2 (0) | 2019.01.22 |
안드로이드 smali 패치 설명 (0) | 2019.01.15 |
안드로이드 smali 패치하기1 (0) | 2019.01.07 |
Android ndk 라이브러리 추가해 사용하기 (0) | 2017.11.04 |