Android, Deteksi saat aplikasi lain diluncurkan


93

Saya mencoba mengembangkan aplikasi yang mencegah pengguna mendapatkan aplikasi tertentu tanpa kata sandi. Skenarionya adalah ...

  1. pengguna mengklik aplikasi "Email" (misalnya)
  2. aplikasi saya mendeteksi peluncuran aplikasi
  3. aplikasi saya mengonfirmasi bahwa ini adalah aplikasi "Email"
  4. aplikasi saya membuka tampilan di atas, meminta kata sandi
  5. pengguna memasukkan sandi, jika benar, aplikasi saya menghilang, meninggalkan aplikasi "Email" di atas

Saya baik-baik saja melakukan sisanya, hanya bagian 2 yang membuat saya bingung, dan setelah beberapa hari membaca Broadcast Intents dll dan mencoba mendengarkan "android.intent.action.MAIN" dll dalam proyek uji coba saya, saya tidak bisa sepertinya mendeteksi saat aplikasi selain milik saya dimulai.

Adakah yang bisa membantu? Apakah saya melakukannya dengan cara yang benar, dalam mencari aplikasi baru yang menyiarkan maksud untuk memulai, atau haruskah saya membaca log sistem untuk maksud baru, atau melakukan sesuatu dalam kode native?

Petunjuk apa pun akan membantu, bahkan jika Anda tidak dapat menjawabnya sepenuhnya, saya akan dapat melakukan lebih banyak penelitian. Terima kasih banyak. Ian


Saya tidak yakin bagaimana mereka melakukannya, tetapi aplikasi seperti App Protector melakukan apa yang Anda minta, jadi secara teknis mungkin.
hanspeide

@lan bagaimana Anda menyelesaikan masalah Anda, bisakah Anda membagikan pengetahuan Anda
nida

hai apakah kamu sudah mendapatkan solusinya?
ask4solutions

Jawaban:


34

Saya pikir kita dapat menggunakan logcat dan menganalisis keluarannya.

Di semua program serupa, saya menemukan izin ini:

android.permission.READ_LOGS

Itu berarti mereka semua menggunakannya tetapi tampaknya program dimulai dan setelah itu program kami (pelindung aplikasi) akan mulai dan menampilkan.

Gunakan kode di bawah ini:

try
    {
        Process mLogcatProc = null;
        BufferedReader reader = null;
        mLogcatProc = Runtime.getRuntime().exec(new String[]{"logcat", "-d"});

        reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream()));

        String line;
        final StringBuilder log = new StringBuilder();
        String separator = System.getProperty("line.separator"); 

        while ((line = reader.readLine()) != null)
        {
            log.append(line);
            log.append(separator);
        }
        String w = log.toString();
        Toast.makeText(getApplicationContext(),w, Toast.LENGTH_LONG).show();
    }
    catch (Exception e) 
    {
        Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
    }

Dan jangan lupa untuk menambahkan izinnya di file Manifest.


tolong, dimana kita harus meletakkan kode ini? dalam pelayanan? di onStartCommand ()?
haythem souissi

56
tidak akan berfungsi dari JellyBean ke atas. Izin READ_LOGS sekarang hanya untuk aplikasi sistem.
Berlari

5
Apakah Anda benar-benar yakin tentang ini? Karena Smart AppLock tampaknya dapat melakukan ini bahkan di perangkat JB. Apakah karena aplikasi mengangkat dirinya sendiri ke status Administrator Perangkat? play.google.com/store/apps/…
Karthik Balakrishnan

1
@Torcellite, aplikasi tersebut memiliki izin "Jalankan tugas", jadi mungkin aplikasi tersebut menggunakan teknik itu.
Sam

1
@Ran jadi apa yang harus dilakukan untuk menggunakannya sekarang ... apakah ada solusi yang tersedia sekarang untuk menyelesaikan masalah yang dinyatakan dalam pertanyaan karena saya harus berada di atas kacang jeli ... tolong beri tanggapan Anda secepatnya ...
Shreyan Mehta

19

Cara menarik untuk melakukannya adalah memiliki layanan dengan loop berjangka waktu yang memeriksa

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();

Anda menelusuri daftar itu untuk melihat apa yang sedang berjalan di telepon. Sekarang Anda dapat mengidentifikasinya dengan id dan processName, jadi untuk aktivitas standar ini mudah untuk aktivitas kustom dengan baik kecuali jika Anda menghentikan semuanya, sulit untuk membedakan ...

Catatan: ini bukan daftar apa yang sebenarnya ada di layar, hanya daftar apa yang sedang berjalan ... agak meniadakan tujuan Anda mungkin tetapi setidaknya Anda akan tahu ketika sesuatu mulai berjalan ... itu akan tetap seperti itu daftar bahkan ketika di latar belakang sekalipun.

Untuk kata sandi Anda bisa memulai aktivitas Anda ketika Anda menemukan aplikasi yang dilindungi atau apa pun.


apakah mungkin untuk mendapatkan waktu saat aplikasi diluncurkan / dilanjutkan?
0LLiena

4
Di Android L gunakan android.app.usagepaket sebagai gantinya. developer.android.com/reference/android/app/usage/…
Plo_Koon

12

Saya pikir dan berharap ini tidak mungkin. Pertimbangkan betapa mudahnya fungsionalitas tersebut dapat disalahgunakan oleh perangkat lunak berbahaya. Anda bisa mendengarkan maksud yang ditujukan kepada Anda, dan yang disiarkan, tetapi peluncuran aplikasi tidak boleh menjadi acara siaran.

Apa yang mungkin dapat Anda lakukan adalah mengganti peluncur . Jika pengguna menyetujuinya.


1
Mengapa tidak mungkin? Ini perangkat saya dan saya memutuskan apa yang akan dijalankan di atasnya. Bagaimana ini lebih menjadi masalah daripada izin lain yang secara rutin kami berikan? Peluncur pengganti tidak akan menangkap peluncuran semua aplikasi hanya yang diluncurkan langsung olehnya. Ada banyak komentar tentang ini dan utas serupa di SO yang mengklaim bahwa hanya dapat melihat maksud lewat akan menjadi masalah besar tetapi tidak ada yang menjelaskan apa masalahnya dan mengapa itu harus dianggap begitu buruk sehingga sistem hak istimewa yang ada tidak dapat digunakan untuk menjelaskan kepada pengguna apa yang terjadi.
Kevin Whitefoot

Saat izin prospektif pergi, yang ini doozy. Tujuan memiliki model keamanan adalah mengaktifkan sebagian besar kasus penggunaan yang sah, sekaligus mencegah sebagian besar (idealnya semua) eksploitasi. Bukan hanya Anda (mungkin pengguna berpengetahuan luas) yang perlu dilindungi, tetapi juga pengguna yang naif yang memasang aplikasi, dan penulis aplikasi yang terhindar dari keharusan mempertimbangkan vektor serangan lain. Semua keamanan adalah pengorbanan: dalam hal ini, antara utilitas dan daya versus eksploitasi besar-besaran. Anda bebas mengkloning tumpukan Android dan mengkodekan sistem Anda sendiri jika Anda benar-benar menginginkan tingkat kebebasan itu untuk diri Anda sendiri.
Pontus Gagge

12
class CheckRunningActivity extends Thread{
    ActivityManager am = null;
    Context context = null;

    public CheckRunningActivity(Context con){
        context = con;
        am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    }

    public void run(){
        Looper.prepare();

        while(true){
            // Return a list of the tasks that are currently running,
            // with the most recent being first and older ones after in order.
            // Taken 1 inside getRunningTasks method means want to take only
            // top activity from stack and forgot the olders.
            List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);

            String currentRunningActivityName = taskInfo.get(0).topActivity.getClassName();

            if (currentRunningActivityName.equals("PACKAGE_NAME.ACTIVITY_NAME")) {
                // show your activity here on top of PACKAGE_NAME.ACTIVITY_NAME
            }
        }
        Looper.loop();
    }
}

Anda dapat menjalankan saat ini Activitydan memeriksa apakah ini Activitysesuai dengan Email aplikasi.

Jalankan CheckRunningActivity Threadsaat Applicationmulai (atau saat boot perangkat).

new CheckRunningActivity().start();

Pembaruan: Kelas ini membutuhkan android.permission.GET_TASKSizin, jadi tambahkan baris berikutnya ke Manifes:

<uses-permission android:name="android.permission.GET_TASKS" />

Saya menggunakan pendekatan ini, tetapi ini akan membuka "// tampilkan aktivitas Anda di sini di atas PACKAGE_NAME.ACTIVITY_NAME" lagi dan lagi karena loop. Ada solusi untuk itu?
Anuj Sharma

hentikan rangkaian CheckRunningActivity saat Anda mendapatkan hasil yang diinginkan
Veaceslav Gaidarji

Terima kasih atas balasannya, lalu bagaimana / kapan utas ini di-restart lagi? Saya menggunakan Layanan Lengket.
Anuj Sharma

tergantung konteks masalah, jelaskan lebih detail, silakan apa yang ingin Anda dapatkan.
Veaceslav Gaidarji

2
Dalam kode Anda di sini, Looper.loop()pernyataan tersebut sepertinya tidak akan pernah dijalankan karena while(true)loop tidak pernah selesai. Apa ini salah?
Sam

11

Masalah utamanya adalah Anda mencoba mendengarkan maksud implisit ketika Peluncur (layar utama) biasanya menggunakan maksud eksplisit.

Maksud implisit adalah saat Anda ingin mengatakan "Seseorang memutar video ini" dan Android memilih aplikasi yang bisa menangani maksud tersebut.

Maksud eksplisit adalah apa yang terjadi saat Anda mengklik ikon "Email" di layar beranda. Ini secara khusus memberi tahu Android untuk membuka aplikasi spesifik itu dengan nama yang sepenuhnya memenuhi syarat (yaitu com.android.mail atau sesuatu).

Tidak ada cara AFAIK untuk menghalangi maksud eksplisit seperti itu. Ini adalah ukuran keamanan bawaan Android sehingga tidak ada dua Aktivitas yang dapat memiliki nama paket yang sepenuhnya memenuhi syarat yang sama. Ini mencegah pihak ketiga mengkloning aplikasi dan menyamar sebagai aplikasi itu. Jika apa yang ingin Anda lakukan adalah mungkin, Anda secara teoritis dapat menginstal aplikasi yang dapat memblokir semua aplikasi pesaing Anda agar tidak berfungsi.

Apa yang Anda coba lakukan bertentangan dengan model keamanan Android.

Satu hal yang dapat Anda lakukan adalah bermitra dengan pengembang aplikasi tertentu untuk meneruskan maksud ke sistem keamanan Anda, tetapi itu mungkin bukan sesuatu yang ingin Anda tangani.


6

getRunningTasks() tidak digunakan lagi di Android L.

Untuk mendapatkan statistik penggunaan aplikasi Anda dapat menggunakan kelas UsageStats dari paket android.app.usage .

API statistik penggunaan Aplikasi baru memungkinkan pengembang aplikasi untuk mengumpulkan statistik terkait penggunaan aplikasi. API ini memberikan informasi penggunaan yang lebih detail daripada metode getRecentTasks () yang tidak digunakan lagi.

Untuk menggunakan API ini, Anda harus mendeklarasikan android.permission.PACKAGE_USAGE_STATSizin di manifes Anda terlebih dahulu . Pengguna juga harus mengaktifkan akses untuk aplikasi ini melalui Settings > Security > Apps with usage access.

Berikut adalah contoh aplikasi dasar yang menunjukkan cara menggunakan API statistik penggunaan aplikasi untuk memungkinkan pengguna mengumpulkan statistik terkait penggunaan aplikasi.


bagaimana statistik penggunaan dapat membantu mengetahui aplikasi mana yang berada di latar depan?
Ajay

3

Mungkin Anda memerlukan layanan, sesuatu yang akan terus berjalan di latar belakang. Dari pada meminta layanan Anda melakukan apa yang Anda katakan. Dengarkan android.intent.action.MAIN juga dengan kategori android.intent.category.LAUNCHER. Kemudian minta penerima siaran itu untuk mengganti metode onReceive dan lakukan pemeriksaan untuk melihat nama aplikasi, dll.


2
Ini terdengar seperti metode yang saya pikirkan, tetapi saya kesulitan untuk menerima siaran MAIN (cat. LAUNCHER) dengan BroadcastReceiver dasar. Adakah yang berhasil melakukan ini sebelumnya? Pada tahap ini saya hanya ingin mendeteksi bahwa aplikasi telah diluncurkan atau dilanjutkan. Saya kemudian dapat membandingkan nama paket dengan string yang berisi nama yang saya cari.
Ian
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.