2016-12-15 8 views
1

Android 애플리케이션을 뒤집습니다. 읽는 동안, 나는 p1이나 p2과 같은 변수를 사용하는 몇 가지 방법을 본다 ... 나는 그 변수들을 어디에 참조 할 수 있는지 모른다. 예를 들어 :Android 바이트 코드 : 일부 변수의 값이 정의되지 않았습니다.

.method public b(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V 
    .locals 1 

    invoke-static {}, Lpnf/this/object/does/not/Exist;->a()Z 

    move-result v0 

    invoke-static {v0}, Lpnf/this/object/does/not/Exist;->b(I)V 

    .prologue 
    .line 33 
    if-eqz p1, :cond_0 

    if-eqz p2, :cond_0 

    if-eqz p3, :cond_0 

    .line 34 
    invoke-static {p1, p2, p3}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I 

    .line 36 
    :cond_0 
    return-void 
.end method 

내가 이해하지 못하는 것은입니다 : 내가 변수 여기 p1p2p3를 모르는

if-eqz p1, :cond_0 

if-eqz p2, :cond_0 

if-eqz p3, :cond_0 

. 말해줘. 감사합니다

답변

1

p1, p2 등은 어셈블러에서 제공 한 구문 식 설탕입니다. Dex 코드에서 지역 변수와 매개 변수는 배열의 마지막 몇 슬롯에 매개 변수가 전달 된 거대한 배열입니다. 어셈블러는 유용하게도 얼마나 많은 로컬 변수를 추적하고 적절한 vn을 사용하지 않고 pn 구문을 통해 직접 매개 변수를 참조 할 수있게합니다.

게시 된 예제에는 1 개의 로컬 변수와 4 개의 매개 변수가 있습니다. 즉, 레지스터는 {v0, p0, p1, p2, p3}처럼 보입니다.

나중에 4는 메서드 시작시 전달 된 매개 변수 값으로 자동 초기화됩니다.

+0

감사합니다 : D 자세한 정보는 다음 링크를 참조하십시오. https://github.com/JesusFreke/smali/wiki/Registers –