Vraag Hoe sommige apps hun eigen de-installatie volgen op Android


Ik vond dat 360 beveiligingsapp na het verwijderen opent u hun pagina in de browser.

Ze kunnen het op alle Android-versies (4., 5. en 6. *) en ik begrijp niet hoe.

Misschien heeft iemand ideeën? Ik weet over dezelfde vragen hier en hier en anderen, maar ze hebben nog steeds geen antwoorden.

Het is geen fout met inotify  omdat het alleen op <4.4.2 Android werkt, zijn er geen andere processen die op een nieuwe manier naar dezelfde bug luisteren, controleerde ik.

Ze hadden wat magie in hun lib eternity.so


10
2017-07-19 13:00


oorsprong


antwoorden:


Laat me proberen het te verduidelijken.

Voor Android 4.4 konden we gebruiken inotify, dat een mechanisme biedt voor het bewaken van bestandsysteemgebeurtenissen, we creëren een daemon om te controleren of een bestand dat we in de directory van onze app hebben gemaakt, is verwijderd of onze belangrijkste app-map is verwijderd, wat zou moeten gebeuren wanneer de gebruiker de app verwijdert, de JNI-code eruit zal zien iets zoals dit:

// initializes a new inotify instance and returns a file descriptor
fd = inotify_init();
// watch directory delete/create events 
inotify_add_watch(fd, DIRECTORY, IN_DELETE | IN_CREATE);
__android_log_print(ANDROID_LOG_INFO, "TAG", "Watching [%s]", DIRECTORY);
// TODO: implement checkIfDeleted
if(checkIfDeleted()) {
    // execute intent to open url
    system("/system/bin/am start --user 0 -a android.intent.action.VIEW -d https://www...");

Dit werkt niet meer omdat uninstall ook groepsprocessen doodt en de relevante code uit de huidige broncode koppelt

ActivityManagerService invoke kill

ProcessRecord kill group

Bekijk git logboek

Ik heb meer tijd nodig om te onderzoeken op niet-geworteld apparaat, 360security pak de app in met specifieke architectuur (ook bekend als ABI) en waarschijnlijk per API om de APK-grootte te verminderen, helaas heeft apkmirror (.com) alleen ARM beschikbaar om te downloaden, lees ik liever x86, misschien bewerk dit antwoord in de nabije toekomst.

Tot nu toe lijkt het erop dat de native code bestanden aanmaakt en met de vergrendelingen speelt om te detecteren wanneer het proces is voltooid na het de-installeren en vervolgens de JNI-interface gebruiken om de callback in te roepen.

Om dit te vereenvoudigen, lijkt het zichzelf te vergrendelen en wordt dan lid van de synchronisatiemodule notify_and_waitfor.

U kunt een native codevoorbeeld zien voor Android 5.0 hier

NativeHelper-broncode (gedecompileerd):

Alle methode met trefwoord native zijn binnen geïmplementeerd eternity binair

package com.qihoo.eternity;

import com.qihoo.eternity.b;

public class NativeHelper {
    static {
        try {
            System.loadLibrary((String)"eternity");
        }
        catch (Exception exception) {}
    }

    public native void look(String var1, String var2, String var3, String var4, String var5);

    public void onU() {
        b.a().g();
    }

    public native void pass(String var1, String var2);

    public void peerDead() {
        b.a().f();
    }

    public native void watch(String var1, String var2, String var3, String var4);

    public native void watch2(String var1, String var2, String var3, String var4, String var5);
}

App-verwijzingen voor NativeHelper:

com/qihoo/eternity/b.java:203:
    new NativeHelper().look(b.this.h.getPackageName(), b.b((b)b.this).f, string2, b.b(b.this.i), string3);
com/qihoo/eternity/b.java:224:
    new NativeHelper().watch(new File(file, "a1").getAbsolutePath(), new File(file, "a2").getAbsolutePath(), new File(file, "a3").getAbsolutePath(), new File(file, "a4").getAbsolutePath());
com/qihoo/eternity/b.java:264:
    new NativeHelper().watch(new File(file, "a2").getAbsolutePath(), new File(file, "a1").getAbsolutePath(), new File(file, "a4").getAbsolutePath(), new File(file, "a3").getAbsolutePath());
com/qihoo/eternity/b.java:518:
    new NativeHelper().pass(this.a, this.b);
com/qihoo/eternity/b.java:563:
    new NativeHelper().watch2(new File(file, "b1").getAbsolutePath(), new File(file, "b2").getAbsolutePath(), new File(file, "b3").getAbsolutePath(), new File(file, "b4").getAbsolutePath(), b.this.h.getDir("lib", 0).getAbsolutePath());
com/qihoo/eternity/b.java:588:
    new NativeHelper().watch2(new File(file, "b2").getAbsolutePath(), new File(file, "b1").getAbsolutePath(), new File(file, "b4").getAbsolutePath(), new File(file, "b3").getAbsolutePath(), b.this.h.getDir("lib", 0).getAbsolutePath());

Een oplossing zal zijn om het gedeelde object op te nemen eternity.so in uw JNI-map en -implementatie NativeHelper.onU methode :)


6
2018-03-26 15:25



De app kan een BroadcastReceiver met actie:

"android.intent.action.PACKAGE_REMOVED" 

Het wordt elke keer dat een pakket wordt verwijderd opgeroepen, zelfs als dit het pakket van de app is. Vervolgens in de Receiver, de app kan controleren welk pakket precies is verwijderd en dienovereenkomstig reageren.

Let op dat verschillende versies van het systeem dit anders kunnen behandelen, waardoor het Receiver variërende hoeveelheden tijd voordat het proces van de app wordt afgesloten. De uitgevoerde actie moet daarom snel zijn en gericht zijn op een extern doel, zoals het verzenden van een ACTION_VIEW Bedoeling met een url van een webpagina die je noemde :-)


1
2017-07-19 13:34