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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.