2014-11-03 2 views
-1

Я занимаюсь тестированием пользовательского интерфейса Espresso с черным ящиком в приложении, в котором у меня есть только файл apk. Чтобы запустить тест Espresso, приложение, подлежащее тестированию, и тест должны быть подписаны с одной и той же подписью, поэтому мне нужно отменить приложение apk. Я попытался уйти в отставку приложение с этими командами:Как отменить или взломать Android-приложение, которое защищено от увольнения

zip -d $APK META-INF/\* 
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore $KEYSTORE -storepass $STOREPASS $APK $ALIAS 
jarsigner -verify -verbose -certs $APK 
zipalign -v 4 $APK $ALIGNED_APK 

в отставку приложение было успешно установлено. Но его нельзя было запустить. Вот бревно из LogCat:

11-03 11:12:08.546: I/ActivityManager(1020): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zg.zl/.ui.SplashActivity u=0} from pid 1128 
11-03 11:12:08.546: W/WindowManager(1020): Failure taking screenshot for (246x410) to layer 21005 
11-03 11:12:08.556: D/dalvikvm(795): WAIT_FOR_CONCURRENT_GC blocked 0ms 
11-03 11:12:08.586: D/dalvikvm(795): GC_EXPLICIT freed 37K, 4% free 7917K/8195K, paused 0ms+1ms, total 27ms 
11-03 11:12:08.586: D/dalvikvm(795): WAIT_FOR_CONCURRENT_GC blocked 0ms 
11-03 11:12:08.596: D/dalvikvm(795): GC_EXPLICIT freed <1K, 4% free 7917K/8195K, paused 0ms+1ms, total 5ms 
11-03 11:12:08.596: I/ActivityManager(1020): Start proc com.zg.zl for activity com.zg.zl/.ui.SplashActivity: pid=1587 uid=10044 gids={3003, 1015, 1006, 3002, 1028} 
11-03 11:12:08.606: D/dalvikvm(795): WAIT_FOR_CONCURRENT_GC blocked 0ms 
11-03 11:12:08.606: D/dalvikvm(795): GC_EXPLICIT freed <1K, 4% free 7917K/8195K, paused 1ms+1ms, total 6ms 
11-03 11:12:08.617: E/Trace(1587): error opening trace file: No such file or directory (2) 
11-03 11:12:08.646: D/dalvikvm(1587): WAIT_FOR_CONCURRENT_GC blocked 0ms 
11-03 11:12:08.716: D/dalvikvm(1587): GC_CONCURRENT freed 155K, 3% free 8200K/8391K, paused 21ms+1ms, total 40ms 
11-03 11:12:08.756: D/dalvikvm(1587): GC_CONCURRENT freed 118K, 3% free 8497K/8711K, paused 15ms+0ms, total 21ms 
11-03 11:12:08.806: D/dalvikvm(1587): GC_CONCURRENT freed 127K, 3% free 8808K/9031K, paused 12ms+0ms, total 17ms 
11-03 11:12:08.816: I/ActivityThread(1587): Pub com.zg.zl.db.preferencesprovider: com.zg.zl.db.PreferencesProvider 
11-03 11:12:08.826: D/dalvikvm(1587): Trying to load lib /mnt/asec/com.zg.zl-1/lib/libzl_native_lib.so 0xb55cfc48 
11-03 11:12:08.826: D/dalvikvm(1587): Added shared lib /mnt/asec/com.zg.zl-1/lib/libzl_native_lib.so 0xb55cfc48 
11-03 11:12:08.826: D/dalvikvm(1587): Trying to load lib /mnt/asec/com.zg.zl-1/lib/libzl_native_lib.so 0xb55cfc48 
11-03 11:12:08.826: D/dalvikvm(1587): Shared lib '/mnt/asec/com.zg.zl-1/lib/libzl_native_lib.so' already loaded in same CL 0xb55cfc48 
11-03 11:12:08.826: I/AndroidRuntime(1587): VM exiting with result code 0, cleanup skipped. 
11-03 11:12:08.846: I/ActivityManager(1020): Process com.zg.zl (pid 1587) has died. 
11-03 11:12:08.846: W/ActivityManager(1020): Force removing ActivityRecord{b59377c8 com.zg.zl/.ui.SplashActivity}: app died, no saved state 
11-03 11:12:08.886: W/InputMethodManagerService(1020): Window already focused, ignoring focus gain of: [email protected] attribute=null 
11-03 11:13:16.597: D/dalvikvm(1116): GC_CONCURRENT freed 384K, 7% free 8482K/9031K, paused 0ms+0ms, total 7ms 

(.. Если я удалить META-INF папку из покорного APK, и добавить META-INF папку, которая из исходного APK приложение может быть установлено и работает нормально)

Я считаю, что приложение защищено от того, что его подали в отставку с помощью другого сертификата. Как я могу обойти эту проблему?

+3

Получите новую, правильно подписанную версию от разработчиков. В противном случае трудно убедить кого-либо в том, что вы делаете только «тестирование черного ящика». – Sam

+0

Эспрессо не было построено с учетом теста «черного ящика», поэтому подписание не будет вашей единственной проблемой. Взгляните на UiAutomator (http://developer.android.com/tools/help/uiautomator/index.html) – yogurtearl

+0

@yogurtearl Я знал об UiAutomator, но он доступен только от API 16 (Android 4.1). Кроме того, UiAutomator работает медленно и flaky по сравнению с Expresso. Вы правы, что подписание - не единственная проблема. Но я экспериментировал с testapp и testapp_test в репозитории Espresso (https://code.google.com/p/android-test-kit/source/browse/). Предполагая на практике, у меня нет исходного кода testapp, я смог преобразовать class.dex (скомпилированного testapp) в jar и импортировать его в тестовый проект (testapp_test). Наконец, я сдал testapp, и тест прошел нормально. – Hieu

ответ

0

Как я где-то читал, зная, как выбрать замок, вы не становитесь разбойником. Поскольку этот вопрос не получил никаких ответов. Я хотел бы указать кому-то в правильном направлении, если они заинтересованы.

Во-первых, вам необходимо разложить/дизассемблировать приложение к smali-коду. Известный инструмент для этого - apktool/baksmali. dex2jar и jd-gui можно использовать для обратного преобразования приложения в код Java, который полезен для понимания кода smali.

Во-вторых, если у приложения есть некоторые виды защиты, он должен совершать определенные вызовы API. К Ищете вызов API, вы можете определить, какой код вам нужно изменить. В этом случае код Java может выглядеть так:

Context mContext = MainApplication.getApplicationContext(); 
byte[] signatureByteArray = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 64).signatures[0].toByteArray(); 

Эквивалент smali код будет:

:try_start_0 
invoke-static {}, Lcom/zing/zalo/app/MainApplication;->it()Landroid/content/Context; 
move-result-object v1 
invoke-virtual {v1}, Landroid/content/Context;->getPackageManager()Landroid/content/pm/PackageManager; 
move-result-object v2 
invoke-virtual {v1}, Landroid/content/Context;->getPackageName()Ljava/lang/String; 
move-result-object v1 
const/16 v3, 0x40 
invoke-virtual {v2, v1, v3}, Landroid/content/pm/PackageManager;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo; 
move-result-object v1 
iget-object v1, v1, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature; 
const/4 v2, 0x0 
aget-object v1, v1, v2 
invoke-virtual {v1}, Landroid/content/pm/Signature;->toByteArray()[B 
move-result-object v1 

На практике, приложение, как правило, затемненный и приложение может быть защищен от модификации другими способами, такими как проверка размера файла. Вот только общая идея .

Смежные вопросы