APK 역컴파일 해독 방법 및 암호화 조치

APK란 Android 운영 체제의 응용 프로그램 설치 파일을 말합니다.크랙이란 쉽게'해독'으로 이해된다.내가 구체적으로 말하는 것은 APK 파일을 역컴파일하여 어셈블리급의 코드 분석을 하고 자신의 코드를 수정하거나 삽입하여 다시 서명하여 APK 파일로 포장하여 프로그램의 원래 행위를 바꾸는 목적을 달성하는 것이다.이상의 설명에서 알 수 있듯이 우리는 Crack 하나의 APK 파일을 원한다. 주요 절차는 세 가지가 있는데 그것이 바로 역컴파일링, 코드 분석, 재포장 서명이다.기본적인 준비는 우리가 기본적인 도구를 필요로 하고 주요한 작업을 진행해야 한다.만약 당신이 안드로이드 APK의 한화를 할 줄 아는 친구라면, 이 도구들에 대해 매우 익숙해야 한다. 첫 번째 도구는android-apktool이고, A tool for reengineering 안드로이드 apk files이다.이 도구는 APK Crack의 핵심을 완성하고 이를 이용하여 APK 파일의 역컴파일링과 재포장을 실현합니다.Google Code의 Wiki, 소스 및 기타 정보를 Google Code의 웹 페이지에서 확인할 수 있는 가장 유명한 오픈 소스 프로젝트입니다.주소:http://code.google.com/p/android-apktool/ . 두 번째 도구는 Auto-sign입니다.이 도구는 APK 패키지의 서명 작업을 수행하는 작은 도구에 속합니다.이러한 기본 도구를 제외하고 코드를 더욱 잘 분석하기 위해서는 dex2jar와 jd-gui 등 다른 도구가 필요할 수 있습니다. 여기에는 상세한 설명이 없습니다.역컴파일링 만약 당신이 자주 APK 프로그램을 한화하는 친구라면, 역컴파일링은 틀림없이 낯설지 않을 것이다.그러나 이 글이 기본적인 절차 설명에 중심을 두었으니 이 단계는 생략할 수 없을 것 같다.그러니까 시끄럽다고 생각하는 친구는 넘어가세요.우선 역컴파일을 기다리는 APK가 필요합니다.여기에 HelloWorld APK를 직접 썼는데 코드는 다음과 같습니다.
 
 
package com.zh_weir.helloworld;import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
     }
}

 
우리는 android-apktool을 통해 이 APK를 역컴파일합니다.android-apktool의 사용에 대해 저는 번역 작업을 많이 하지 않고 설명 문서를 직접 드리겠습니다.간단하게 말하면 명령행 집행이다.
Apktool v1.3.2 - a tool for reengineering Android apk files
	Copyright 2010 Ryszard Wi?niewski <[email protected]>
	
	Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
	Usage: apktool [-v|--verbose] COMMAND [...]

	COMMANDs are:
	    d[ecode] [OPTS] <file.apk> [<dir>]
	        Decode <file.apk> to <dir>.
	        
	        OPTS:
	        -s, --no-src
	            Do not decode sources.
	        -r, --no-res
	            Do not decode resources.
	        -d, --debug
	            Decode in debug mode. Check project page for more info.
	        -f, --force
	            Force delete destination directory.
	        -t <tag>, --frame-tag <tag>
	            Try to use framework files tagged by <tag>.
	        --keep-broken-res
	            Use if there was an error and some resources were dropped, e.g.:
	            "Invalid config flags detected. Dropping resources", but you
	            want to decode them anyway, even with errors. You will have to
	            fix them manually before building.
	            
	    b[uild] [OPTS] [<app_path>] [<out_file>]
	        Build an apk from already decoded application located in <app_path>.
	        It will automatically detect, whether files was changed and perform
	        needed steps only.
	        If you omit <app_path> then current directory will be used.
	        If you omit <out_file> then <app_path>/dist/<name_of_original.apk>
	        will be used.

	        OPTS:
	        -f, --force-all
	            Skip changes detection and build all files.
	        -d, --debug
	            Build in debug mode. Check project page for more info.

	    if|install-framework <framework.apk> 
	        Install framework file to your system.

	For additional info, see: http://code.google.com/p/android-apktool/

apktool d HelloWorld를 통해apk의 명령으로 우리는 간단한 APK의 역컴파일 작업을 완성했다.'HelloWorld'라는 폴더를 얻었다.폴더 아래에 Manifest 파일이 있고, 역컴파일된res 자원 파일이 있습니다.이런 것들은 우리가 주의해야 할 중점이 아니라 평소에 한화에 특별히 관심을 갖는 것이다.우리가 주의해야 할 것은'smali'라는 폴더다.자세히 살펴보면 이 폴더 아래의 파일 조직 구조와 우리의 안드로이드 프로젝트에서 자바 원본의 조직 구조가 거의 일치하는 것을 발견할 수 있습니다.단지 Java 파일이.smali 파일이 대체되었습니다.우리는 텍스트 편집기로 이것들을 열었다.smali 파일은 모두 식별할 수 있고 매우 가지런한 텍스트 파일로 대체적으로 다음과 같다.
.class public Lcom/zh_weir/helloworld/MainActivity;
	.super Landroid/app/Activity;
	.source "MainActivity.java"
	# direct methods
	.method public constructor <init>()V
	    .locals 0
	    .prologue
	    .line 6
	    invoke-direct {p0}, Landroid/app/Activity;-><init>()V
	    return-void
	.end method

	# virtual methods
	.method public onCreate(Landroid/os/Bundle;)V
	    .locals 1
	    .parameter "savedInstanceState"
	    .prologue
	    .line 10
	    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
	    .line 11
	    const/high16 v0, 0x7f03
	    invoke-virtual {p0, v0}, Lcom/zh_weir/helloworld/MainActivity;->setContentView(I)V
	    .line 12
	    return-void
	.end method

Smali 파일은 사실 Dalvik 가상기에서 실행하는 dex 바이트 파일에 대응하는 어셈블리 파일이다.자바 가상기의 어셈블리 언어인 Jasmin을 알고 있다면, 두 개의 문법이 매우 비슷하다는 것을 발견할 수 있을 것이다.smali 문법 등의 문제는 더 이상 깊이 파고들지 않습니다. 더 알고 싶으면 Google Code에서 Smali 프로젝트 홈 페이지를 방문하십시오.http://code.google.com/p/smali/ . 코드 분석과 수정은 설령 당신이 Jasmin 문법을 할 줄 모른다 하더라도 위의 어셈블리 코드를 쉽게 이해할 수 있다.지적해야 할 것은 apktool이 역컴파일한 어셈블리 코드도 마찬가지로 대상을 대상으로 하는 것이지 과정을 대상으로 하는 것이 아니다.이 점은 C++의 어셈블리와 다를 수 있습니다.위의 코드에 의하면 이MainActivity의 클래스는 두 가지 구성원 방법이 있음을 알 수 있다.하나는 기본 구조 함수입니다.또 하나는 우리가 다시 싣는 Oncreate 방법입니다.자바 어셈블리에서 모든 구성원 방법은 자신이 사용하는 국부 변수의 개수를 먼저 설명하여 저장 공간을 분배할 수 있도록 해야 한다.예를 들어 Oncreate는 로컬 변수를 사용하여 다음과 같이 선언합니다.locals 1 .뒤에는 v0으로 표시한다.비정상적인 구성원 방법에서 p0은 이 클래스 자체의 인용을 대표하고this에 해당하며 p1이 시작되는 것이야말로 함수의 매개 변수이다.정적 방법에 대해this지침이 없기 때문에 p0은 함수의 첫 번째 매개 변수이다.(사실 자체this지침은 은밀한 매개 변수로 비정상적 구성원 함수에 전달되는 것이다).위의 Oncreate 어셈블리 코드를 분석해 보면 슈퍼 클래스의 onCreate 방법을 먼저 호출한 다음에 setContentView 설정 디스플레이를 알 수 있습니다.그 중에서 I, V 등은 함수의 매개 변수와 반환 변수의 유형을 나타내는데 이것은 일반적인 방법이므로 여기에 설명을 많이 하지 않겠다.여기까지 분석해 봤는데, 너는 문제를 발견했니?그것이 바로 우리가 같은 문법에 따라 문장을 수정하거나 삭제하면 프로그램에 대한 수정을 실현할 수 있는가?답은 긍정적이다.예를 들어, 우리는 이 APK 프로그램이 실행될 때 Toast가 해독되었다는 것을 알릴 수 있기를 바란다.Java를 사용하면 다음과 같이 표현해야 한다: Toast.makeText(this, "I'm Cracked!", Toast.LENGTH_LONG).show(); Java 어셈블리를 사용하면 const-string v0, "I\'m Cracked!"
 
const/4 v1, 0x1
	invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
	move-result-object v0
	invoke-virtual {v0}, Landroid/widget/Toast;->show()V

OK, 우리가 이 코드를 원래 프로그램의 Oncreate에 삽입하고 다시 프로그램을 포장하면, 우리는 이 프로그램이 실행될 때 Toast를 팝업할 수 있다.변경된 코드는 대체로 다음과 같습니다.
 
 
	# virtual methods

	.method public onCreate(Landroid/os/Bundle;)V
	    .locals 2
	    .parameter "savedInstanceState"
	    .prologue
	    .line 11
	    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
	    .line 12
	    const/high16 v0, 0x7f03
	    invoke-virtual {p0, v0}, Lcom/zh_weir/helloworld/MainActivity;->setContentView(I)V
	    .line 14
	    const-string v0, "I\'m Cracked!"
	    const/4 v1, 0x1
	    invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
	    move-result-object v0
	    invoke-virtual {v0}, Landroid/widget/Toast;->show()V
	    .line 15
	    return-void

	.end method

출처:http://www.unpack.cn/forum.php?mod=viewthread&tid=68732

좋은 웹페이지 즐겨찾기