안경잡이개발자

728x90
반응형

  Apktool을 이용해 APK 파일을 리버싱한 뒤에 이를 다시 재빌드(Rebuild)할 때 가끔 다음의 오류를 만날 수 있다.

 

brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1)

 

  이 오류는 Apktool을 이용해 리패키징을 진행할 때 마주칠 수 있는 오류이다. 이 오류는 대부분 AAPT 관련 이슈로 발생한다. AAPT(Android Asset Packaging Tool)안드로이드에서 사용되는 문자열, 이미지 등의 에셋(Asset)을 효율적으로 컴파일하고 패키징하기 위한 도구이다. 안드로이드 앱을 개발할 때는 별도의 에셋 폴더에 문자열, 이미지를 모아 놓는데 이것이 실제 코드와 함께 동작할 수 있도록 한다.

 

방법 1) 리패키징할 때 AAPT v2 사용 강제하기

 

  2020년 기준으로 최신 앱들은 AAPT v2를 사용하는 경우가 많은데, Apktool의 버전에 따라서 이를 처리하는 방법이 다르다. 예를 들어 Apktool v.2.3.4는 AAPT v1과 v2 바이너리를 모두 묶어서 .jar 파일에 넣는다. 이러한 과정에서 리패키징 오류가 발생할 수 있는데, AAPT v2 사용을 강제한다면 문제가 해결될 가능성이 있다.

 

  필자의 경우 Apktool v.2.4.1을 이용하였으며, 재빌드 과정에서 --use-aapt2 옵션을 넣어주었다. 일단 먼저 디컴파일을 하면 다음과 같이 실행될 것이다. 정상적으로 디컴파일이 완료된 것을 확인할 수 있다.

 

apktool -f d test.apk -o test_aapt_v2

 

 

  이후에 재빌드를 할 때 AAPT v2를 강제하지 않으면 다음과 같은 오류가 발생할 수 있다. 그것도 매우 많은 오류가 한꺼번에 발생할 수 있다. 아마 대부분 아래와 같은 오류를 만나서 헤맬 것이다.

 

apktool -f b test_aapt_v2

 

 

  이때 다음과 같이 AAPT v2 사용을 강제하면, 오류가 해결될 가능성이 있다.

 

apktool -f b test_aapt_v2 --use-aapt2

 

  다만 일부 앱에서는 AAPT v2를 강제하여도 오류가 남아 있거나 새로운 오류가 등장할 수 있다. 필자의 경우에도 여전히 오류가 남아 있어서, 다른 방법을 찾아야 했다. --use-aapt2 옵션을 추가하여 문제가 해결된 사람들은 여기에서 끝내도 된다.

 

 

방법 2) Apktool 버전 바꾸어 보기

 

  Apktool의 버전을 교체해본다. 필자의 경우 Apktool 최신 버전(Latest)인 2.4.1을 이용했는데, 이전 버전인 Apktool 2.3.4를 함께 이용해 보는 것도 방법이다. 포럼의 일부 게시글에서는 디컴파일과 리패키징에서 사용하는 Apktool의 버전을 다르게 하라는 조언이 있으며, 이를 통해 해결했다는 사례를 찾을 수 있었다.

 

  혹은 아예 더 낮은 Apktool 버전을 사용하면 일부 앱에 대해서는 정상 동작한다는 사례를 찾을 수 있었다. 따라서 자신의 앱에 대하여 오류가 발생한다면, 여러 가지 버전의 Apktool을 적용해보자. 참고로 필자의 경우에 이 방법을 사용해도 리패키징에서 실패하였다.

 

방법 3) Java 버전 바꾸어 보기

 

  포럼에서는 32-bit로 설치된 Java를 제거하고, 64-bit Java를 설치했더니 문제가 해결된 사례가 있었다고 한다. 필자의 경우 이건 적용해보지 않았다.

 

방법 4) 디컴파일 과정에서 리소스 제거하기

 

  만약 애초에 발생한 오류가 리소스(Resource) 컴파일 과정에서 발생한 것이라면, 리소스는 제외하고 디코딩을 한다면 나중에 리패키징을 할 때 오류가 발생하지 않는다. 소스코드를 수정하는 과정에서 리소스는 건드리지 않고 Java (smali) 코드만 수정하는 것이 목표인 경우, 이 방법만으로도 오류 없이 분석을 진행할 수 있다.

 

  공식 문서에 따르면 다음과 같이 기술되어 있다.

 

  "This will prevent the decompile of resources. This keeps the resources.arsc intact without any decode. If only editing Java (smali) then this is the recommended action for faster decompile & rebuild."

 

  여기에서 resources.arsc 각종 리소스 정보를 담고 있는 파일이다. 우리가 앱을 수정할 때 리소스 파일을 수정하게 되는 일이 필요할 수 있는데, 이때는 이 파일을 디코딩하여 우리가 분석할 수 있는 형태로 변환해야 한다. 예를 들어 새로운 이미지를 추가하거나, 문자열을 추가할 때 꼭 필요할 것이다. 만약 이런 행위 없이, 취약점 분석이 목적이라면 사실 resources.arsc 디코딩은 필요하지 않을 것이다.

 

  저자의 경우 취약점 분석이 목적이므로, 리소스를 제외하고 디코딩을 수행했다.

 

apktool -f d test.apk -o test_without_resource -r

 

 

  이 경우에 다시 리패키징을 할 때 오류가 발생하지 않는다.

 

apktool b test_without_resource

 

 

  필자는 앱을 분석할 때 리소스를 직접 추가하여 앱을 확장할 목적이 없고, 단순히 smali 코드 수정 및 분석이 주 목적이어서 이러한 방법을 이용해도 문제가 없는 상황이다. 결과적으로 다음과 같이 dist 폴더 안에 APK 파일이 생성된다.

 

 

※ 요약 ※

 

  깃허브와 포럼에서 찾아 본 결과, 해결 가능성이 있다고 제안된 방법들은 다음과 같다.

 

  1. 빌드할 때 --use-aapt2 옵션 넣어서, AAPT v2 사용 강제하기
  2. 빌드할 때 이전 Apktool 버전 사용해보기 (디컴파일 때와 다른 버전으로)
  3. Java 버전 및 운영체제 환경 바꾸어서 다시 빌드하기 (32bit -> 64bit)
  4. 리소스 수정이 필요하지 않은 경우, 디컴파일 할 때 -r 옵션 넣어서 resources.arsc 파일 제외하고 디코딩하기

 

  단, 앱 리소스 수정이 꼭 필요하면 1, 2, 3번 적용해보면서 문제 해결하야 할 것이다. 다만 취약점 분석이 목적이라면 대개 resources.arsc를 갈아 끼울 필요는 없고, smali 코드 수정이 필요한 정도라서 4번으로 진행해도 될 것이다.

728x90
반응형

Comment +0

728x90
반응형

  Apktool은 대표적인 안드로이드 애플리케이션(Android Application) 대상의 리버스 엔지니어링 도구입니다. APK 파일을 분석하여 리소스를 뽑아낼 수 있고(디코딩), 코드를 수정하여 다시 재빌드(Rebuild)할 수도 있습니다. 실제로 XML, 이미지 파일, .dex 파일을 포함하여 안드로이드 앱의 주요 소스를 뽑기 위해 가장 많이 사용되고 있습니다.

 

  ▶ Apktool 다운로드: ibotpeaches.github.io/Apktool/

 

  설치를 위해서 [Install] 페이지로 이동하고, 자신의 운영체제에 맞는 프로그램을 다운로드 받습니다.

 

 

  ▶ Apktool.jar 다운로드: bitbucket.org/iBotPeaches/apktool/downloads/

 

  설명에 나와 있는대로 차근차근 다운로드 및 세팅을 진행하시면 됩니다. 가장 먼저 Apktool은 아래와 같이 다운로드 가능합니다.

 

 

  이때 파일의 버전명을 지우고 이름을 apktool.jar로  바꾸어서 C:\\windows 경로에 두면 됩니다. 그리고 apktool.bat 파일 또한 만들어서 C:\\windows 위치에 둡니다. apktool.bat 파일의 내용은 다음의 경로에서 확인할 수 있습니다.

 

  ▶ apktool.bat 내용: https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/windows/apktool.bat

 

  최종적으로 다음과 같은 형태가 됩니다.

 

 

  이후에 명령 프롬프트를 실행하여 apktool 이라고 입력하시면, 정상적으로 툴이 실행됩니다.

 

 

※ 참고사항 ※

 

  참고로 Apktool은 버전에 따라서 APK 파일을 처리하는 방법이 다를 수 있기 때문에, 가능하면 최신 버전과 가장 많이 사용되는 버전 두 가지를 모두 이용하는 것이 좋습니다. 필자의 경우 최신 버전인 Apktool v2.4.1과 더불어 Apktool v.2.3.4를 같이 사용합니다. 저는 그래서 다음과 같이 apktool_2.3.4.jar 또한 다운로드 받아서 윈도우 폴더에 위치시킵니다.

 

 

  이 경우 직접 java를 이용하여 Apktool을 실행하실 수 있습니다.

 

java -jar C:\Windows\apktool_2.3.4.jar

 

 

※ 디컴파일 하는 방법 ※

 

  디컴파일(Decompile)을 위해 하나의 APK 파일을 준비한 뒤에 다음과 같이 명령어를 입력합니다. 여기에서 d는 특정한 파일을 디코딩(Decoding)하라는 의미입니다. 공식 문서에서는 Decoding이라는 표현을 쓰고 있네요. 참고로 -o 옵션을 넣어서 만들어질 소스 폴더의 경로를 설정할 수 있습니다. -o 옵션을 넣지 않으면 자동으로 앱 이름과 동일한 이름의 폴더가 만들어집니다.

 

apktool d {앱 파일} -o {소스 폴더 경로}

 

 

※ 재빌드 하는 방법 ※

 

  소스코드를 수정한 뒤에 다시 재빌드(Rebuild)할 때는 다음과 같은 명령어를 입력합니다. 여기에서 b는 특정한 폴더를 기준으로 다시 빌드(Build)를 진행한다는 의미입니다. 참고로 -o 옵션을 넣어서 빌드 결과로 만들어질 APK 파일의 경로를 설정할 수 있습니다.

 

apktool b {소스 폴더 경로} -o {앱 파일}

 

  재빌드가 성공적으로 이루어진다면 다음과 같이 APK 파일이 만들어지는 것을 확인할 수 있습니다.

 

 

※ 참고사항 ※

 

  추가적인 Apktool에 대한 사용 방법은 공식 문서를 참고하세요.

 

  ▶ 공식 문서: ibotpeaches.github.io/Apktool/documentation/

728x90
반응형

Comment +2

728x90
반응형

  기드라(Ghidra)미국 국가 안보국(NSA)에서 만들어 오픈 소스로 공개한 역어셈블리어 프레임워크입니다. 기드라를 이용하면 기존에 작성되어 있는 프로그램을 효과적으로 디버깅하고 분석할 수 있습니다. IDA Pro에 대적할 수 있는 무료 프로젝트라고 알려져 있습니다.

 

  ▶ 기드라(Ghidra) 공식 홈페이지: https://ghidra-sre.org/

 

  기드라는 공식 홈페이지에서 매우 간단하게 설치할 수 있습니다.

 

 

  기드라는 JDK 11 버전 이상을 요구합니다. 따라서 기드라를 정상적으로 이용하기 위해서는 사전에 JDK가 설치되어 있는지 확인해주셔야 합니다. JDK 11 이상이 설치되어 있지 않다면, JDK 11이 설치된 폴더를 입력하라는 박스가 나오게 됩디다. 혹시 JDK 11이 존재하지 않으시는 분은 아래 경로에서 설치하실 수 있습니다.

 

  ▶ JDK 11 홈페이지: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html

 

 

  이제 Windows 사용자의 경우, Ghidra 배치 파일을 실행하여 프로그램을 동작시킬 수 있습니다.

 

 

  Ghidra를 처음 실행한 분이라면 다음과 같이 [Ghidra Help] 창이 등장할 겁니다. 이 문서를 참고하여 Ghidra를 어떻게 사용할 수 있는지 공부해 보시는 것을 추천합니다. 이 창을 닫더라도 [F1]을 누르면 다시 등장합니다.

 

 

  기드라를 실행한 뒤에 프로젝트를 생성하여, 특정한 프로그램에 대한 분석이 가능합니다.

 

 

  [Ctrl + N]을 눌러서 하나의 프로젝트를 새롭게 만들어 주겠습니다.

 

 

  저는 다음과 같이 Test라는 이름으로 하나의 프로젝트를 생성해 보았습니다.

 

 

  이제 분석을 하고자 하는 프로그램 파일을 프로젝트 이름이 적힌 곳으로 Drag & Drop하여 놓으면 파일을 열어서 분석할 수 있게 됩니다. 이후에 프로그램은 어떠한 Format으로 열 것인지 설정할 수 있는데, 기본 설정 그대로 프로그램을 열 수 있습니다.

 

 

  프로그램이 열린 이후에는 자신이 새롭게 연 프로그램에 대하여 요약 된 정보를 보여줍니다.

 

 

  또한 특정한 옵션에 따라서 분석해주는 기능이 존재합니다.

 

 

  [Yes] 버튼을 눌러서 기본 옵션 그대로 분석(Analysis)을 진행할 수 있습니다.

 

 

  또한 자주 많이 사용하는 기능으로는 문자열(String) 검색이 있습니다.

 

 

  문자열을 어떤 방식으로 분석할 지 설정할 수 있는데, 기본 설정 그대로 하면 길이가 5 이상은 문자열을 추출합니다.

 

 

  다음과 같이 특정한 문자열을 검색하여, 해당 문자열이 어디에서 등장하는지 확인할 수 있습니다.

 

 

  저는 해당 문자열이 나온 부분을 확인하여, 이 문자열이 어떤 함수에서 참조되는지 확인해보았습니다.

 

 

  특정한 함수의 소스코드 부분을 클릭하면, 자동으로 [Decompile] 영역에 디컴파일 된 소스코드 내용이 출력됩니다. IDA Pro의 Hex-Ray와 흡사하게 동작한다고 이해할 수 있습니다.      

 

 

  그리고 역어셈블리어 도구라고 하면, 플로우 그래프를 그려주는 기능을 빼놓을 수 없습니다. 저는 [Function Graph] 창을 한 번 열어보았습니다.

 

 

  이후에 Main 함수를 검색하여, 해당 함수를 [Function Graph]로 확인하면 다음과 같습니다.

 

 

  이상으로 Ghidra의 기본적인 기능을 확인해보았습니다.

728x90
반응형

Comment +1

728x90
반응형

  OllyDbg는 어셈블리어 수준의 디버깅 도구입니다. 무료로 이용할 수 있으며, 돌아가고 있는 런타임 환경의 프로그램에 붙여서 동적 분석을 진행할 수 있도록 해줍니다. 흔히 프로그램을 분석해야 할 때 단순히 소스코드만 보고, 실행 과정을 파악하기 어려울 수 있는데 그럴 때 쓰기 좋은 도구입니다.

 

  따라서 Dev C++을 이용하여 간단히 Hello World 프로그램을 작성한 뒤에 이를 분석하여, 프로그램을 패치(Patch)하는 실습을 해보겠습니다.

 

#include <stdio.h>

int main(void) {
	printf("Hello World\n");
	return 0;
}

 

  32-bit 프로그램으로 설정한 뒤에 프로그램을 생성하겠습니다.

 

 

  이후에 다음의 경로에 접속하여 OllyDbg를 설치합니다. 아래쪽으로 내려오면 [download] 링크가 있으며, 여기에 들어가서 OllyDbg 1.10 버전을 받으시면 됩니다.

 

  ▶ OllyDbg 홈페이지: http://www.ollydbg.de/ 

 

 

  이후에 다음과 같이 [Download OllyDbg] 버튼을 눌러 OllyDbg를 설치합니다.

 

 

OllyDbg는 기본적으로 [관리자 권한으로 실행] 해주셔야 합니다.

 

 

이후에 [F3]을 눌러서 바로 특정한 프로그램을 열어 디버깅을 진행할 수 있습니다.

 

 

  그럼 다음과 같이 프로그램 창이 실행 되고, 왼쪽 위에 실행 버튼을 눌러서 프로그램을 동작시킬 수 있습니다.

 

 

  실행 버튼을 누른 결과 'Hello World'가 출력됩니다.

 

 

※ 프로그램 디버깅 및 패치 해보기 ※

 

  이제 'Hello World'를 다른 문자열로 바꾸어 출력하도록 해봅시다. 먼저 Ctrl + F2를 눌러서 Restart를 합니다. [Hex dump]를 확인하여 비어 있는 메모리 주소를 클릭한 뒤에 스페이스 바(Space Bar)를 눌러서 DUMP 수정 창을 열 수 있습니다.

 

 

  다음과 같이 정보를 수정 할 수 있습니다. 그냥 바꿀 아스키 코드를 입력하여 [OK]를 누르시면 됩니다.

 

 

  저는 'ABC HELLO!'라고 변경해보았습니다.

 

 

  이후에 "Hello World" 문자열을 참조하는 부분에서 주소 값을 "ABC HELLO!"의 주소 값으로 설정합니다. 저는 주소 값 403310의 위치에 문자열을 넣었으므로 이 주소로 설정했습니다.

  

  

    실행 결과, 정상적으로 변경된 문자열이 출력되었습니다.

  

 

  다른 방법도 존재합니다. 별도의 문자열을 메모리에 기록한 뒤에 그것을 가리켜 출력하도록 하는 것이 아니라,  'Hello World'가 원래 존재하던 메모리 주소에서 값을 변경하는 방법입니다. Hex Dump창에서 [Ctrl + G]를 눌러 "Hello World"의 주소 검색할 수 있습니다.

 

 

  이제 해당 주소 값으로 이동하여 "Hello World"를 "Hell  World"로 변경해보았습니다.

 

 

  이번에 실행해 보시면 마찬가지로 정상적으로 실행됩니다.

 

 

※ 패치된 파일 저장하기 ※

 

  프로그램 패치 후에 저장하는 방법 또한 간단합니다.

 

 

  [Hex Dump]의 내용을 변경한 이후에 바로 우클릭하여 [Copy to executable file]을 누릅니다.

 

 

  이제 열린 창에서 다시 우클릭 하여 [Save File]을 눌러서 저장을 진행하시면 됩니다.

 

 

  저장된 파일을 실행해 본 결과, 정상적으로 변경된 코드 내용으로 출력되는 것을 확인할 수 있습니다.

 

 

728x90
반응형

Comment +0