2013. 1. 29. 20:50

android decompile and recompile.


이전 글(소스보기)에 이어 이번에는 소스 수정한 후 다시 컴파일 하는 것까지 해보자.

2013/01/15 - [bring/steal] - 안드로이드 apk 디컴파일(Decompile) / 소스보기



1. 준비물

  • JRE
    • 이건 알아서 설치.
  • APK Extracter
    • 이전 글(소스보기) 참고. 여러가지 방법이 있음. apk 받을 수만 있으면 됨.
  • APK TOOL
  • 텍스트 에디터
    • 알아서.. 아무거나
  • signapk.jar 및 키파일
    • 안드로이드 full source 안에 있다고 함. 따로 분리되어서 인터넷에 떠돌아다니니 찾아 받으셔도 됨. 일반적인 경우 키 파일도 대충 아무거나 생성해서 쓰면 됨.
      signapk.zip



2. 방법

2.1 APK 파일을 받자.

APK 파일 추출기로 받으삼. 참고로 필자는 "MN 앱 관리"라는 국산 제품을 사용했음. 그 프로그램에서는 앱을 길게 누르면 뜨는 메뉴에서 "설치파일 보내기" 누르면 컴퓨터로 옮길 수 있었음.




2.2. PC로 옮긴 APK 파일을 apktool 로 decode 하자.

아래는 naverapp 이라는 폴더로 디코드한 예.

java -jar apktool.jar d com.nhn.android.search-1.apk naverapp



naverapp 폴더 안에 풀린 리소스들과 smali 파일들이 나타난다. smali 파일에서 원하는 부분을 수정하면 된다. (smali 파일은 dalvik 바이트코드를 디어셈블한 간이 코드, 자세한건 http://code.google.com/p/smali/ 를 참고).


2.3. 수정한 코드를 다시 build 하자.

아래는 naverapp 이라는 폴더를 naverapp.apk 로 다시 빌드한 예.

java -jar apktool.jar b naverapp naverapp.apk



이런.. 에러가 발생했다. 대략 보니 res\values-en\strings.xml:40 위치에 하나와 res\xml 안에 있는 widget 관련 파일들이다. 그냥 수정하고 다시 시도하자. 40 라인은 별 필요없어 보이니 값을 제거하고, widget 관련 파일들은 widgetCategory 라는 attribute 가 문제인듯 싶으니 해당 attribute 를 제거해준다. 그리고 다시 명령어를 실행하면 다행히 성공.



naverapp.apk 가 생성되었다. 하지만 이 apk 를 그대로 폰에 올리면 설치가 안된다. signing 작업을 해줘야함.


2.4. 빌드한 apk 파일을 signapk 로 signing 해주자.

아래는 naverapp.apk 를 naverapp_signed.apk 로 signing 한 예.


java -jar signapk.jar testkey.x509.pem testkey.pk8 naverapp.apk naverapp_signed.apk




2.5 다 된 naverapp_signed.apk 파일을 폰에 올려보자.

이건 여러가지 방법이 있는데 혹시 모르면 알아서 찾아보셈. 참고로 필자는 개인 웹서버에 올려서 모바일 브라우저에서 다운받아 설치하는 방법을 주로 사용하고 있다.



필자가 예제로 빌드한 apk 파일은 용량이 10MB가 넘어서 못 올렸고, 대신 그 스크린 샷만 첨부한다.



필자는 \smali\com\nhn\android\search\ui\main\tab\NaverHomeTabFragment.smali 파일의 2532 라인(상단 왼쪽 NAVER 버튼 등을 누르면 네이버로 이동)과 2561 라인(처음 실행하면 네이버로 이동)을 수정하여 Daum 사이트로 이동하게 수정해 보았다.


    const-string v2, "naver-home"


    const-string v3, "http://m.naver.com?app_page=main"


    invoke-virtual {v1, v2, v3}, Lcom/nhn/android/apptoolkit/AppConfig;->getServerAddress(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;



를 아래처럼 변경.


    const-string v2, "naver-home"


    const-string v3, "http://m.daum.net/"


    invoke-virtual {v1, v2, v3}, Lcom/nhn/android/apptoolkit/AppConfig;->getServerAddress(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;




그럼 즐핵.


ps. 다음앱 같은 일부의 경우 AndroidManifest.xml 파일에 android:sharedUserId="daum.uid.shared" 가 들어있어서 설치시 signing 에러가 발생한다. AndroidManifest.xml 파일의 android:sharedUserId="daum.uid.shared" 을 삭제하고 빌드해야한다.


기타 관련 사이트 :

http://code.google.com/p/smali/

http://netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html




Posted by 아즈키