Android ตรวจจับเมื่อเปิดแอปอื่น ๆ


93

ฉันกำลังพยายามพัฒนาแอปที่ป้องกันไม่ให้ผู้ใช้เข้าถึงแอปที่ระบุโดยไม่มีรหัสผ่าน สถานการณ์คือ ...

  1. ผู้ใช้คลิกแอป "อีเมล" (เช่น)
  2. แอปของฉันตรวจพบการเปิดตัวแอป
  3. แอปของฉันยืนยันว่าเป็นแอป "อีเมล"
  4. แอพของฉันเปิดมุมมองที่ด้านบนขอรหัสผ่าน
  5. ผู้ใช้ป้อนรหัสผ่านหากถูกต้องแอปของฉันจะหายไปโดยปล่อยให้แอป "อีเมล" อยู่ด้านบน

ฉันโอเคทำส่วนที่เหลือแค่ตอนที่ 2 ทำให้ฉันงงและหลังจากผ่านไปหลายวันอ่าน Broadcast Intents และอื่น ๆ และพยายามฟัง "android.intent.action.MAIN" และอื่น ๆ ในโครงการทดลองของฉันฉันทำไม่ได้ ดูเหมือนจะตรวจพบเมื่อแอปอื่นที่ไม่ใช่ของฉันเริ่มทำงาน

ใครสามารถช่วย? ฉันกำลังไปในทางที่ถูกต้องในการมองหาแอพใหม่ที่ถ่ายทอดความตั้งใจที่จะเริ่มต้นหรือฉันควรอ่านบันทึกของระบบเพื่อหา Intent ใหม่หรือทำอะไรบางอย่างในเนทีฟโค้ด

คำแนะนำใด ๆ จะช่วยได้แม้ว่าคุณจะไม่สามารถตอบได้ทั้งหมดฉันจะสามารถหาข้อมูลเพิ่มเติมได้ ขอบคุณมาก. เอียน


ฉันไม่แน่ใจว่าพวกเขาทำมันอย่างไร แต่แอพอย่างApp Protectorทำในสิ่งที่คุณต้องการดังนั้นจึงเป็นไปได้ในทางเทคนิค
hanspeide

@lan วิธีที่คุณแก้ไขปัญหาของคุณได้โปรดแบ่งปันความรู้ของคุณ
nida

สวัสดีคุณมีวิธีแก้ปัญหาหรือไม่?
ask4solutions

คำตอบ:


34

ฉันคิดว่าเราสามารถใช้logcat และวิเคราะห์ผลลัพธ์ได้

ในโปรแกรมที่คล้ายกันทั้งหมดฉันพบการอนุญาตนี้:

android.permission.READ_LOGS

หมายความว่าทุกคนใช้งานได้ แต่ดูเหมือนว่าโปรแกรมจะเริ่มทำงานและหลังจากนั้นโปรแกรม (ตัวป้องกันแอป) ของเราจะเริ่มและนำหน้า

ใช้รหัสด้านล่าง:

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();
    }

และอย่าลืมเพิ่มสิทธิ์ในไฟล์ Manifest


ได้โปรดเราต้องใส่รหัสนี้ที่ไหน? ในบริการ? ใน onStartCommand ()?
haythem souissi

56
จะไม่ทำงานจาก JellyBean ขึ้นไป ตอนนี้สิทธิ์ READ_LOGS สงวนไว้สำหรับแอประบบเท่านั้น
วิ่ง

5
คุณแน่ใจจริงๆเกี่ยวกับเรื่องนี้หรือไม่? เนื่องจาก Smart AppLock ดูเหมือนว่าจะสามารถทำได้แม้ในอุปกรณ์ JB เป็นเพราะแอปพลิเคชันยกระดับตัวเองเป็นสถานะผู้ดูแลอุปกรณ์หรือไม่? play.google.com/store/apps/…
Karthik Balakrishnan

1
@Torcellite แอปนั้นมีสิทธิ์ "เรียกใช้งาน" ดังนั้นจึงอาจใช้เทคนิคนั้นแทน
แซม

1
@Ran แล้วจะทำอย่างไรถึงจะใช้ได้ตอนนี้ ... มีวิธีแก้ปัญหาที่ระบุไว้ในคำถามหรือไม่เนื่องจากฉันต้องอยู่เหนือเยลลี่บีน ... โปรดให้ข้อเสนอแนะของคุณโดยเร็ว ...
Shreyan Mehta

19

วิธีที่เป็นลูกเล่นคือมีบริการที่มีการวนซ้ำตามกำหนดเวลาที่ตรวจสอบ

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

คุณเรียกดูรายการนั้นเพื่อดูสิ่งที่กำลังทำงานบนโทรศัพท์ ตอนนี้คุณสามารถระบุได้ด้วยรหัสและ processName ดังนั้นสำหรับกิจกรรมมาตรฐานนี่เป็นเรื่องง่ายสำหรับคนที่กำหนดเองได้ดีเว้นแต่คุณจะหยุดพวกเขาทั้งหมดมันยากที่จะแยกแยะ ...

หมายเหตุ:นี่ไม่ใช่รายการของสิ่งที่อยู่บนหน้าจอเป็นเพียงรายการของสิ่งที่กำลังทำงานอยู่ ... อาจทำให้เป้าหมายของคุณเป็นโมฆะ แต่อย่างน้อยคุณจะรู้ว่าเมื่อมีบางสิ่งเริ่มทำงาน ... มันจะยังคงอยู่ในนั้น แม้ว่าจะอยู่ในพื้นหลังก็ตาม

สำหรับรหัสผ่านคุณสามารถเริ่มกิจกรรมของคุณได้เมื่อคุณพบแอปที่ป้องกันหรืออะไรก็ตาม


เป็นไปได้หรือไม่ที่จะได้รับช่วงเวลาที่แอปเปิดตัว / กลับมาทำงานอีกครั้ง
0LLiena

4
ใน Android L ให้ใช้android.app.usageแพ็คเกจแทน developer.android.com/reference/android/app/usage/…
Plo_Koon

12

ฉันคิดและหวังว่านี่จะเป็นไปไม่ได้ พิจารณาว่าซอฟต์แวร์ที่เป็นอันตรายสามารถใช้ฟังก์ชันดังกล่าวได้ง่ายเพียงใด คุณสามารถฟัง Intent ที่ส่งถึงคุณและผู้ที่ออกอากาศได้ แต่การเปิดตัวแอปพลิเคชันไม่ควรเป็นกิจกรรมการออกอากาศ

สิ่งที่คุณอาจทำได้คือเปลี่ยนตัวเรียกใช้งาน หากผู้ใช้ยอมรับ


1
ทำไมต้องเป็นไปไม่ได้ เป็นอุปกรณ์ของฉันและฉันตัดสินใจว่าจะใช้งานอะไร ปัญหานี้มากกว่าการอนุญาตอื่น ๆ ที่เราให้เป็นประจำอย่างไร ตัวเรียกใช้งานทดแทนจะไม่จับการเปิดตัวแอปทั้งหมดเฉพาะแอปที่เปิดใช้โดยตรง มีความคิดเห็นมากมายเกี่ยวกับเรื่องนี้และเธรดที่คล้ายกันใน SO โดยอ้างว่าการที่สามารถดูเจตนาผ่านไปได้นั้นอาจเป็นปัญหาใหญ่ แต่ไม่มีใครอธิบายได้ว่าปัญหาคืออะไรและทำไมจึงถูกมองว่าน่ารังเกียจจนระบบสิทธิ์ที่มีอยู่ไม่สามารถทำได้ เพื่อให้ผู้ใช้เข้าใจได้ชัดเจนว่าเกิดอะไรขึ้น
Kevin Whitefoot

เมื่อได้รับอนุญาตในอนาคตคนนี้เป็นคนโง่ จุดสำคัญของการมีรูปแบบการรักษาความปลอดภัยคือการเปิดใช้กรณีการใช้งานที่ถูกต้องที่สุดในขณะที่ป้องกันการหาประโยชน์ส่วนใหญ่ ไม่ใช่แค่คุณ (ซึ่งน่าจะเป็นผู้ใช้ที่มีความรู้) ที่ต้องได้รับการปกป้อง แต่ยังรวมถึงผู้ใช้ที่ไม่ติดตั้งแอปและผู้เขียนแอปที่ไม่ต้องพิจารณาเวกเตอร์การโจมตีอื่น การรักษาความปลอดภัยทั้งหมดเป็นการแลกเปลี่ยน: ในกรณีนี้ระหว่างยูทิลิตี้และพลังงานกับความสามารถในการแสวงหาประโยชน์มหาศาล คุณมีอิสระที่จะโคลนสแต็ก Android และเขียนโค้ดระบบของคุณเองหากคุณต้องการอิสระในระดับนั้นจริงๆ
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();
    }
}

คุณสามารถเรียกใช้งานปัจจุบันActivityและตรวจสอบว่าสิ่งนี้Activityสอดคล้องกับEmail แอปพลิเคชันหรือไม่

รันCheckRunningActivity Threadเมื่อApplicationเริ่มต้น (หรือเมื่อบูตอุปกรณ์)

new CheckRunningActivity().start();

อัปเดต: คลาสนี้ต้องandroid.permission.GET_TASKSได้รับอนุญาตดังนั้นให้เพิ่มบรรทัดถัดไปใน Manifest:

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

ฉันใช้วิธีนี้ แต่วิธีนี้จะเปิด "// แสดงกิจกรรมของคุณที่นี่ด้านบนของ PACKAGE_NAME.ACTIVITY_NAME" ซ้ำแล้วซ้ำเล่า วิธีแก้ปัญหาใด ๆ สำหรับสิ่งนั้น?
Anuj Sharma

หยุดเธรด CheckRunningActivity เมื่อคุณได้ผลลัพธ์ที่ต้องการ
Veaceslav Gaidarji

ขอบคุณสำหรับการตอบกลับแล้วเธรดนี้จะเริ่มต้นใหม่อีกครั้งได้อย่างไร? ฉันใช้ Sticky Service
Anuj Sharma

ขึ้นอยู่กับบริบทของปัญหาโปรดอธิบายรายละเอียดเพิ่มเติมว่าคุณต้องการรับอะไร
Veaceslav Gaidarji

2
ในโค้ดของคุณที่นี่Looper.loop()คำสั่งดูเหมือนจะไม่ถูกดำเนินการเนื่องจากการwhile(true)วนซ้ำไม่สิ้นสุด ถือเป็นความผิดพลาดหรือไม่?
แซม

11

ปัญหาหลักคือคุณพยายามฟังเจตนาโดยนัยเมื่อตัวเรียกใช้งาน (หน้าจอหลัก) มักใช้เจตนาที่ชัดเจน

เจตนาโดยปริยายคือเมื่อคุณต้องการพูดว่า "ใครบางคนเล่นวิดีโอนี้" และ Android จะเลือกแอปที่สามารถจัดการกับเจตนานั้นได้

เจตนาที่ชัดเจนคือสิ่งที่เกิดขึ้นเมื่อคุณคลิกไอคอน "อีเมล" บนหน้าจอหลัก เป็นการบอกให้ Android เปิดแอปเฉพาะนั้นโดยใช้ชื่อแบบเต็ม (เช่น com.android.mail หรือบางอย่าง)

ไม่มีทางที่ AFAIK จะสกัดกั้นเจตนาที่ชัดเจนดังกล่าวได้ เป็นมาตรการรักษาความปลอดภัยใน Android ที่ไม่มีกิจกรรมสองอย่างที่สามารถมีชื่อแพ็กเกจแบบเต็มเหมือนกัน ซึ่งจะป้องกันไม่ให้บุคคลที่สามโคลนแอปและปลอมตัวเป็นแอปนั้น หากสิ่งที่คุณต้องการทำเป็นไปได้ในทางทฤษฎีคุณสามารถติดตั้งแอปที่สามารถบล็อกแอปของคู่แข่งทั้งหมดไม่ให้ทำงานได้

สิ่งที่คุณพยายามทำนั้นขัดกับรูปแบบความปลอดภัยของ Android

สิ่งหนึ่งที่คุณทำได้คือร่วมมือกับนักพัฒนาแอปเฉพาะเพื่อส่งต่อความตั้งใจไปยังระบบความปลอดภัยของคุณ แต่นั่นอาจไม่ใช่สิ่งที่คุณต้องการจัดการ


6

getRunningTasks() เลิกใช้งานแล้วใน Android L.

ในการรับสถิติการใช้งานแอปคุณสามารถใช้คลาสUsageStatsจากแพ็คเกจandroid.app.usage

API สถิติการใช้งานแอปใหม่ช่วยให้นักพัฒนาแอปสามารถรวบรวมสถิติที่เกี่ยวข้องกับการใช้งานแอปพลิเคชันได้ API นี้ให้ข้อมูลการใช้งานโดยละเอียดมากกว่าเมธอด getRecentTasks () ที่เลิกใช้แล้ว

หากต้องการใช้ API นี้ก่อนอื่นคุณต้องประกาศการandroid.permission.PACKAGE_USAGE_STATSอนุญาตในไฟล์ Manifest ของคุณ Settings > Security > Apps with usage accessผู้ใช้ยังต้องเปิดใช้งานการเข้าถึงสำหรับแอปนี้ผ่าน

นี่คือตัวอย่างแอปพื้นฐานที่แสดงวิธีใช้ API สถิติการใช้งานแอปเพื่อให้ผู้ใช้รวบรวมสถิติที่เกี่ยวข้องกับการใช้งานแอปพลิเคชัน


สถิติการใช้งานจะช่วยให้ทราบได้อย่างไรว่าแอปใดอยู่เบื้องหน้า
Ajay

3

บางทีคุณอาจต้องการบริการบางอย่างที่จะทำงานอยู่เบื้องหลังตลอดเวลา กว่าให้บริการของคุณทำตามที่คุณกล่าวไว้ ฟัง android.intent.action.MAIN ด้วยหมวด android.intent.category.LAUNCHER จากนั้นให้เครื่องรับสัญญาณออกอากาศแทนที่เมธอด onReceive และตรวจสอบเพื่อดูชื่อของแอปพลิเคชันเป็นต้น


2
นี่ฟังดูเหมือนเป็นวิธีที่ฉันคิด แต่ฉันกำลังดิ้นรนเพื่อรับการออกอากาศ MAIN (cat. LAUNCHER) ด้วย BroadcastReceiver พื้นฐาน มีใครจัดการทำสิ่งนี้มาก่อนหรือไม่? ในขั้นตอนนี้ฉันแค่ต้องการตรวจสอบว่ามีการเปิดใช้งานแอปพลิเคชันหรือกลับมาทำงานต่อ จากนั้นฉันสามารถเปรียบเทียบชื่อแพ็คเกจกับสตริงที่มีชื่อที่ฉันกำลังมองหา
เอียน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.