2014-10-27 3 views
0

Я декомпилировал файл APK, затем попытался скомпилировать его и получил ошибку компилятора «Unreachable statement», я хочу знать, это трюк обфускатора или сбой декомпилятора? Как это возможно? Используется dex2jar и Java DecompilerUnreachable statement from output decompiler

А вот декомпилированный метод

public void onSensorChanged(SensorEvent paramSensorEvent) { 
    float[] arrayOfFloat = paramSensorEvent.values; 
    switch (paramSensorEvent.sensor.getType()) 
    { 
    } 
    do 
    { 
     return; 
    } while (this.aDegree == arrayOfFloat[0]); 
    this.aDegree = arrayOfFloat[0]; 
    invalidate(); 
} 
+1

Нам нужно убедиться, что исходный байт-код Dalvik, чтобы сказать наверняка. –

+0

Вы никогда не можете быть уверены в том, что декомпилятор дает вам точное приближение к исходному коду. Это верно, даже если вывод * не * подозрительный. Попытка рассуждать о выходе декомпилятора, который вы * знаете *, является плохим или подозрительным, в лучшем случае бессмысленна и опасна. Лучшее, что вы можете сделать, это пройти через байт-код самостоятельно. –

+0

Я часто получаю хороший декомпилированный вывод при компиляции без защиты pro, но с proguard я получаю неточные результаты, и я думал, что беспорядочный код является результатом proguard :) – mes

ответ

5

Это возможно потому, что unreachable statement полезная ошибка во время компиляции, а не во время выполнения проверки/ограничения.

код, который вы декомпилированы, возможно, было что-то вроде этого: первоначально

boolean debug = true; 
do { 
    if(debug) { 
     return; 
    } 
}while (this.aDegree == arrayOfFloat[0]); 

компилятор достаточно умен, чтобы знать, что debug всегда верно и не заморачиваться с проверкой в ​​байт-код (для КПД).

Очевидно, что мой пример довольно надуманный, на самом деле он был, вероятно, более сложным (хотя конечный результат тот же).

+0

Обратите внимание, что это всего лишь одно возможное объяснение; существует множество других причин, по которым декомпилятор может создавать плохой или подозрительный код, и, не видя байт-кода, нет способа узнать, что на самом деле делает код. –