Android手机控制

7

我不想做广告,但是我的应用程序行为的示例应用程序是ESET防病毒软件。

我的应用程序有一个请求的功能,需要密码才能卸载。我将我的应用程序添加到设备管理员列表中,现在无法卸载它。但是您可以将应用程序作为管理员设备停用。当您转到“设置”>“位置和安全性”>“选择设备管理员”,并尝试停用ESET Security时,它会启动活动(我猜测来自DeviceAdminReceiver.onDisableRequested()),该活动正在等待密码并且您的手机被锁定。主页按钮、返回按钮甚至SwitchOff按钮都没有反应=>

为什么主页、返回、SwitchOff和相机按钮没有反应呢?

编辑-第二个问题已删除 (我从手机中取出电池后-ESET也不是设备管理员)

感谢您的建议。


1
感谢您指出安卓系统中的这些安全问题。通常情况下,您可以通过发送电子邮件至security@android.com来报告此类问题,而不是在类似于StackOverflow之类的地方发布。普通的SDK应用程序不应该能够执行您所提到的操作,我会花一些时间确定发生了什么,并确保进行修复。 - CommonsWare
1个回答

2
好的,抱歉ESET,但是这个功能看起来非常有趣,所以我查看了反编译的源代码 :)
基本工作流程如下:
  • com.eset.ems.antitheft.receiver.AdminReceiverDeviceAdminReceiver 的子类,用于注册广播操作 DEVICE_ADMIN_ENABLEDDEVICE_ADMIN_DISABLED
  • 当设备管理员被禁用时,会调用 com.eset.ems.antitheft.receiver.AdminReceiver.onDisabled()
  • com.eset.ems.antitheft.LockActivityAdminReceiver.onDisabled() 开始启动
  • LockActivity 显示 com.eset.ems.antitheft.LockingDialog,其中最重要的阻止魔法发生
关于主页和其他按钮的防病毒块,它使用 Android 内部的 ActivityManagerNative 进行以下技巧。为了使 LockActivity 始终位于所有其他活动之上,它启动一个线程,该线程不断调用具有 LockActivity 任务 ID 的 ActivityManagerNative.moveTaskToFront()。在 API 级别 10 之前,使用反射访问 ActivityManager 类中隐藏的 moveTaskToFront(),而在 API 级别 10 之后,它只是使用 Android 代码库中的 ActivityManagerNative 代码来访问它。 此外,LockActivityLockingDialog 都多次调用 ActivityManagerNative.closeSystemDialogs() 方法。可能是为了取消长按电源按钮后出现的系统对话框。
关于停止执行DeviceAdminReceiver.onDisableRequested,实际上我在代码中没有注意到任何特别的地方。它只是在设备管理员被禁用后启动活动,就这样而已。而且在我的手机上,当我取出电池后设备管理员就被禁用了。

我很高兴能够给你我的观点。谢谢。这是7个月后唯一有用的答案。现在我将尝试使用您的发现来实现它。您是如何找出它是如何工作的?我可以稍后向您询问一些额外的信息吗? - vlkpo
3
谢谢您提出这个好问题。我使用了 dex2jar(https://code.google.com/p/dex2jar/) 工具来转换从 ESET 杀毒软件 apk 提取的 classes.dex 文件。它生成普通的 jar 文件,可以用任何反编译器查看(我特别使用 http://java.decompiler.free.fr/ 的 JD,可能是最好的免费 Java 反编译器)。其实就是这样,之后我就拥有了源代码文件并且可以看到它的运作方式。我只是从 logcat 中注意到在我禁用 ESET 杀毒软件的设备管理时,LockActivity 就会被启动,然后将其作为起点。 - Andrei Mankevich
@AndreiMankevich 你能否帮我看一下 http://stackoverflow.com/questions/40282857/device-admin-confirm-before-deactivate 并提出你的想法? - Smeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接