2012-09-28 8 views
11

일부 안드로이드 APK를 리버스 엔지니어링하여 기능 테스트를위한 도구를 추가했습니다. 내가 원하는 내가 .smali 파일에 각각의 방법에.smali 파일 수정하기

Log.e(TAG, "some descritpion", e); 

같은 것을 추가하는 방법을 다음과 같이 smali을 부여 알고 있습니다.

.class public Ld; 
.super Landroid/view/View; 
.source "SourceFile" 


# instance fields 
.field a:Z 

.field b:Lcom/rovio/ka3d/App; 


# direct methods 
.method public constructor <init>(Lcom/rovio/ka3d/App;)V 
    .locals 2 
    .parameter 

    .prologue 
    const/4 v1, 0x1 

    .line 317 
    invoke-direct {p0, p1}, Landroid/view/View;-><init>(Landroid/content/Context;)V 

    .line 313 
    const/4 v0, 0x0 

    iput-boolean v0, p0, Ld;->a:Z 

    .line 314 
    const/4 v0, 0x0 

    iput-object v0, p0, Ld;->b:Lcom/rovio/ka3d/App; 

    .line 318 
    iput-object p1, p0, Ld;->b:Lcom/rovio/ka3d/App; 

    .line 319 
    invoke-virtual {p0, v1}, Ld;->setFocusable(Z)V 

    .line 320 
    invoke-virtual {p0, v1}, Ld;->setFocusableInTouchMode(Z)V 

    .line 321 
    return-void 
.end method 


# virtual methods 
.method public a(Z)V 
    .locals 4 
    .parameter 

    .prologue 
    const/4 v3, 0x0 

    .line 325 
    invoke-virtual {p0}, Ld;->getContext()Landroid/content/Context; 

    move-result-object v0 

    const-string v1, "input_method" 

    invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; 

    move-result-object v0 

    check-cast v0, Landroid/view/inputmethod/InputMethodManager; 

    .line 326 
    invoke-virtual {p0}, Ld;->getWindowToken()Landroid/os/IBinder; 

    move-result-object v1 

    invoke-virtual {v0, v1, v3}, Landroid/view/inputmethod/InputMethodManager;->hideSoftInputFromWindow(Landroid/os/IBinder;I)Z 

    .line 327 
    if-eqz p1, :cond_0 

    .line 329 
    invoke-virtual {p0}, Ld;->getWindowToken()Landroid/os/IBinder; 

    move-result-object v1 

    const/4 v2, 0x2 

    invoke-virtual {v0, v1, v2, v3}, Landroid/view/inputmethod/InputMethodManager;->toggleSoftInputFromWindow(Landroid/os/IBinder;II)V 

    .line 330 
    invoke-virtual {p0}, Ld;->requestFocus()Z 

    .line 333 
    :cond_0 
    iput-boolean p1, p0, Ld;->a:Z 

    .line 334 
    return-void 
.end method 

.method public onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; 
    .locals 3 
    .parameter 

    .prologue 
    .line 343 
    new-instance v0, La; 

    iget-object v1, p0, Ld;->b:Lcom/rovio/ka3d/App; 

    const/4 v2, 0x0 

    invoke-direct {v0, v1, p0, v2}, La;-><init>(Lcom/rovio/ka3d/App;Landroid/view/View;Z)V 

    .line 345 
    const/4 v1, 0x0 

    iput-object v1, p1, Landroid/view/inputmethod/EditorInfo;->actionLabel:Ljava/lang/CharSequence; 

    .line 350 
    const v1, 0x80090 

    iput v1, p1, Landroid/view/inputmethod/EditorInfo;->inputType:I 

    .line 351 
    const/high16 v1, 0x1000 

    iput v1, p1, Landroid/view/inputmethod/EditorInfo;->imeOptions:I 

    .line 352 
    return-object v0 
.end method 

답변

28

Log.e()를 호출하는 실제 코드는 매우 간단합니다.

const-string v0, "MyTag" 
const-string v1, "Something to print" 
# assuming you have an exception in v2... 
invoke-static {v0, v1, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I 

그러나 사용하는 레지스터는 신중해야합니다. 나중에 사용할 값이있는 레지스터를 훼손하고 싶지는 않습니다.

그래서 당신은 두 가지 옵션이 있습니다 :

  1. 는 "안전한"사용되지 않는 레지스터 찾아
  2. 이 방법의 레지스터 수를 증가 (까다로울 수)들을 사용하고 새로 만든 레지스터를 사용을

숫자 2는 새로운 레지스터가 레지스터 범위의 끝에 있지 않다는 것입니다. 실제로는 매개 변수 레지스터 바로 앞에 있습니다.

예를 들어 총 5 개의 레지스터 (.registers 5)가있는 메소드를 사용합니다. 그 중 3 개가 매개 변수 레지스터입니다. 따라서 비 매개 변수 레지스터 인 v0 및 v1과 3 매개 변수 레지스터 인 p0-p2가 있으며 v2-v4의 별칭입니다.

추가로 2 개의 레지스터를 추가해야하는 경우 최대 값은 .registers 7입니다. 매개 변수 레지스터는 레지스터 범위 끝에서 유지되므로 p0-p2는 이제 v4-v6의 별칭이되고 v2 및 v3은 안전하게 사용할 수있는 새 레지스터입니다.

+0

이 설명합니다. 감사! –

+1

이것은 매우 간결한 대답이지만, invoke-static의 끝에 작은 오타가 있다고 생각합니다. Ljava/lang/Throwable 이후 – GeekyDeaks

+0

이것은 수정되었습니다. – JesusFreke

10

JesusFreke의 대답에 대한 설명을하기에는 너무 큰 레지스터에 대한 의견. .register 지시어 대신 .local 지시어가 있으면 숫자 체계가 달라진다는 점을 언급 할 필요가 있습니다. 대략적으로 말하면, 지침은 다음과 같은 방식으로 관련 :

.registers = .locals + NUMBER_OF_PARAMETERS 

은 표시 할 수있는 지침을 3 개 레지스터 4 개 매개 변수를 가지고 있으며, 사용하는 기능을 가지고 그래서 경우 .registers 7 또는 .locals 3 있습니다. 다음과 같이

그리고 당신은 레지스터 설정을 얻을 것이다 :

v0 
v1 
v2 
v3 <==> p0 
v4 <==> p1 
v5 <==> p2 
v6 <==> p3 

출처 : smali 코드를 추가 할 수있는 간단한 방법 https://github.com/JesusFreke/smali/wiki/Registers

3

하나, 테스트 안드로이드 응용 프로그램에서 자바 코드를 작성하는 것입니다. apktool을 사용하여 디스 어셈블리하십시오. smali 파일을보고 smali 코드를 확인한 다음 분해 한 다른 응용 프로그램에 삽입하는 데 사용하십시오. 여기

다운로드 apktool : 내 노력이 때로는 알수없는 충돌을 일으킬 이유 http://ibotpeaches.github.io/Apktool/