2013-08-26 1 views
2

smali (여기서 Android에서 제공)의 간단한 메서드를 살펴 봤는데 반환 값 false와 같은 간단한 작업을 수행하는 방법에 대해 궁금합니다. 필자는 Java와 비교하여 일부 예제를 이해하려고 노력하고 있었고 대부분의 방법이 작동한다고 생각하지만 변경 한 사항은 잘 진행되지 않습니다.Smali에서 기존 메서드 수정

public static boolean isEnabled(){ 
    return com.example.test.isEnabled(); 
} 

와 smali에는 다음과 같습니다 :

는 자바 방법은

현재 위의 맥락에서

.method public static isEnabled()Z 
    .registers 1 

    .prologue 
    .line 3714 
    invoke-static {}, Lcom/example/test;->isEnabled()Z 

    move-result v0 

    return v0 
.end method 

, 내가 자바 return false;의 상당을 바로 할 수있는 방법을 수정 얼마나 ? 내가 볼 수 있었던 것에서, 0x0은 거짓이지만, smali를 컴파일 할 때 (문제가되는 REGISTER?) 문제를 일으키는 것을 반환하기 때문에 정확히 무엇을해야하는지 궁금합니다.

솔루션뿐만 아니라 설명도 인정 될 것이다! 그것은 특별히 아무것도 아니에요, 난 그냥이 물건을보고 싶어요.

+1

같은 것을하게 될 겁니다'이동-result' 만 등록됩니다. 레지스터 v0에 'const/4 v0, 0'을 사용하여 0을로드 할 수 있습니다. http://milk.com/kodebase/dalvik-docs-mirror/docs/dalvik-bytecode.html (또는 http://source.android.com/devices/tech/dalvik/dalvik-bytecode.html)을 참조하십시오. 형식 지정은 다루기가 쉽지 않음). – fadden

답변

8

빠른 자바 프로그램을 작성하고, 컴파일하고, dx'ing 한 다음, 역 어셈블하여 쉽게 대답 할 수 있습니다.

public class EnabledTest { 
    public static boolean isEnabled() { 
     return false; 
    } 
} 

그리고/DX/그것에게

javac EnabledTest.java 
dx --dex --output=EnabledTest.dex EnabledTest.class 
baksmali EnabledTest.dex 

를 분해 컴파일 그리고 당신은

.method public static isEnabled()Z 
    .registers 1 
    const v0, 0 
    return v0 
.end method 
+0

오, 그래서 당신은 단지 거짓을 0으로 사용할 수 있습니까? 그리고 명령에 감사드립니다. 또한 라인 참조가 그때있을 필요가 없을까요? – whitfin

+0

예, 바이트 코드 레벨에는 0과 1의 특정 "부울"유형이 없습니다. 저는 긍정적이지는 않지만 임의의 0이 아닌 값을 true로 사용할 수 있다고 생각하지 않습니다. – JesusFreke

+1

줄 번호는 디버그 정보 일뿐입니다. 예외 추적에 행 번호를 추가하고 디버깅하는 동안 원본 소스 위치로 다시 매핑하는 데 사용됩니다. 그러나 프로그램의 실제 기능에 영향을주지 않고 안전하게 제거 할 수 있습니다. – JesusFreke