android安全漏洞(二) 程序锁

初步了解android如何锁键 阅读详情

 

导读:本文介绍如何实现对应用加锁的功能,无须root权限

 

某些人有时候会有这样一种需求,小A下载了个软件,只是软件中的美女过于诱惑与暴露,所以他不想让别人知道这是个什么软件,起码不想让别人打开浏览。而这款软件又没有锁,任何人都可以打开,肿么办呢?如果打开它的时候需要输入密码,那该多好阿!于是,程序锁这种应用就产生了

 

程序锁不是最近才有的,很久之前android就有这种apk了

这一期我们来苛刻如何实现程序加锁功能

 

首先,我们先明确一下我们要做的程序具有什么功能

1可以选择需要加锁的程序

2可以设置密码

3可以关闭程序锁

 

这里作为演示,我们就尽量简化代码

我们先说最关键的部分

最关键的地方在于:当用户打开一个应用的时候,怎么弹出密码页面?

这里没有什么太好的办法,需要扫描task中的topActivity

首先,我们先获得运行的task

Java代码   收藏代码
  1. mActivityManager = (ActivityManager) context.getSystemService("activity");  
  2. //mActivityManager.getRunningTasks(1);//List<RunningTaskInfo>  

getRunningTasks方法返回一个List,我们来看看这个List是什么

getRunningTasks 写道
Return a list of the tasks that are currently running, with the most recent being first and older ones after in order.
…… 

返回的List是有序的,第一个是最近的,所以我们取出第一个即可,然后得到此task中的最上层的Activity

Java代码   收藏代码
  1. ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity;  

topActivity居然是ComponentName类型,下面的事情就好办了,获得包名和类名

Java代码   收藏代码

    ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity;  
    String packageName = topActivity.getPackageName();  
    String className = topActivity.getClassName();  
    Log.v(TAG, "packageName" + packageName);  
    Log.v(TAG, "className" + className);  
      
    if (testPackageName.equals(packageName)  
            && testClassName.equals(className)) {  
        Intent intent = new Intent();  
        intent.setClassName("com.example.locktest", "com.example.locktest.PasswordActivity");  
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        mContext.startActivity(intent);  
    }  

 

由于我没有选择程序这一步,所以我就固定一个应用做测试,这里选择的是htc的note应用

Java代码   收藏代码
  1. String testPackageName = "com.htc.notes";  
  2. String testClassName = "com.htc.notes.collection.NotesGridViewActivity";  

 

下面我们该想,这段代码何时执行了

打开一个应用程序,系统不会发送广播,我们无法直接监听,所以这里我们采取定时扫描的策略

这里只是一个简单的实现,之后我们再讨论优化

我们采取每秒中检查一次task的方式,这里使用Timer吧,用Handler也一样可以实现

Java代码   收藏代码

    private Timer mTimer;  
    private void startTimer() {  
        if (mTimer == null) {  
            mTimer = new Timer();  
            LockTask lockTask = new LockTask(this);  
            mTimer.schedule(lockTask, 0L, 1000L);  
        }  
    }  

到这里,其实我们的关键代码就已经完成了

 

 

下面贴出完整带代码,注意:我们只关注弹出锁界面这部分,其他部分自行实现(比如文章末尾提到的)

Task,负责检查task,并在适当的时候弹出密码页面

 

Java代码   收藏代码
    public class LockTask extends TimerTask {  
        public static final String TAG = "LockTask";  
        private Context mContext;  
        String testPackageName = "com.htc.notes";  
        String testClassName = "com.htc.notes.collection.NotesGridViewActivity";  
      
        private ActivityManager mActivityManager;  
      
        public LockTask(Context context) {  
            mContext = context;  
            mActivityManager = (ActivityManager) context.getSystemService("activity");  
        }  
      
        @Override  
        public void run() {  
            ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity;  
            String packageName = topActivity.getPackageName();  
            String className = topActivity.getClassName();  
            Log.v(TAG, "packageName" + packageName);  
            Log.v(TAG, "className" + className);  
      
            if (testPackageName.equals(packageName)  
                    && testClassName.equals(className)) {  
                Intent intent = new Intent();  
                intent.setClassName("com.example.locktest", "com.example.locktest.PasswordActivity");  
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
                mContext.startActivity(intent);  
            }  
        }  
    }  

 


LockService,负责执行定时任务,取消任务等

Java代码   收藏代码

    public class LockService extends Service {  
        private Timer mTimer;  
        public static final int FOREGROUND_ID = 0;  
      
        private void startTimer() {  
            if (mTimer == null) {  
                mTimer = new Timer();  
                LockTask lockTask = new LockTask(this);  
                mTimer.schedule(lockTask, 0L, 1000L);  
            }  
        }  
      
        public IBinder onBind(Intent intent) {  
            return null;  
        }  
      
        public void onCreate() {  
            super.onCreate();  
            startForeground(FOREGROUND_ID, new Notification());  
        }  
      
        public int onStartCommand(Intent intent, int flags, int startId) {  
            startTimer();  
            return super.onStartCommand(intent, flags, startId);  
        }  
      
        public void onDestroy() {  
            stopForeground(true);  
            mTimer.cancel();  
            mTimer.purge();  
            mTimer = null;  
            super.onDestroy();  
        }  
    }  

 

MainActivity,测试用,作为应用入口,启动service(产品中,我们可以在receiver中启动service)。

Java代码   收藏代码

    public class MainActivity extends Activity {  
      
        public void onCreate(Bundle savedInstanceState){  
            super.onCreate(savedInstanceState);  
            startService(new Intent(this, LockService.class));  
        }  
    }  

 

PasswordActivity,密码页面,很粗糙,没有核对密码逻辑,自行实现

记得重写onBackPressed函数,不然按返回键的时候……你懂的

Java代码   收藏代码

    public class PasswordActivity extends Activity {  
      
        private static final String TAG = "PasswordActivity";  
        Button okButton;  
        EditText passwordEditText;  
        private boolean mFinish = false;  
          
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.password);  
            passwordEditText = (EditText) findViewById(R.id.password);  
             okButton = (Button) findViewById(R.id.ok);  
             okButton.setOnClickListener(new View.OnClickListener() {  
                public void onClick(View v) {  
                    String password = passwordEditText.getText().toString();  
                    Log.v(TAG, "password" + password);  
                    mFinish = true;  
                    finish();  
                }  
            });  
        }  
      
        public void onBackPressed(){}  
          
        public void onPause(){  
            super.onPause();  
            if(!mFinish){  
                finish();  
            }  
        }  
    }  

 

xml这里就不贴了,记得添加权限

Xml代码   收藏代码
  1. <uses-permission android:name="android.permission.GET_TASKS"/>  

 

 

 

关于程序的其他部分,这里只做简要说明

选择应用对其进行加锁部分

1列出系统中所有程序(你也可以自由发挥,比如过滤掉原始应用)

2选择,然后存入数据库(当然,最好也有取消功能,记得从数据库中删除数据)

程序锁总开关

可以使用sharedPreference,设置一个boolean开关

 

 

现在,当我想要打开htc的note应用的时候,就会弹出密码页面当我解锁,按home会回到桌面,长按home,点击note,还是会弹出密码框

因为是每秒检查一次,所以可能会有一点点延迟,你可以设置为500毫秒,但是越频繁,占用资源就越多

 

上面的代码我取得topActivity后检查了其包名行和类名,所以只有当打开指定的页面的时候,才会弹出密码锁

比如我对Gallery应用加密了,但是用户正在编辑短信,这时候它想发彩信,于是他通过短信进入到了Gallery……

对于某些用户的某些需求来说,这是不能容忍的,这时,我们只需简单修改下判断逻辑即可:只检查包名,包名一致就弹出密码锁,这样就完美了

 

程序锁我就分析到这里

最后一句

当使用程序锁的时候,你长按home,发现程序锁也出现在“最近的任务”中,肿么办……给此activity设置android:excludeFromRecents="true"即可



安卓开发-应用锁功能的实现 提供了 应用锁功能 的两种实现方式~ 阅读详情

相关推荐

Android9.0 程序锁实现

整体思路:当启动一个程序时获取栈顶activity,与加密数据库配对,若是加密程序,调用startactivity启动一个输入密码的界面,密码正确,进入应用。可以看出实现改功能需要脱离activity,那就想到了开启一个后台服务,而Android8.0之后只能用startforegroudserver开启,并在服务开启5秒内调用startforegroud方法,不然要报ANR。理想是美好的,模拟器...

qq_41009768的博客 1051

android app 后台运行,安卓APP锁定后台运行的方法

因为安卓系统后台程序限制,软件在长时间挂后台运行时会被系统杀掉,可以将程序加入清理白名单中,并在手机系统设置中的“电池->后台高耗电中允许软件后台高耗电”具体方法如下:1.将应用加入到清理白名单中方法:(1)vivo手机设置方法:打开任务切换界面----点击app右上角的锁图标使其变为锁定状态,或者将当前app向下拖动即可(2)oppo手机设置方法:打开任务切换界面----点击app右上角图...

weixin_35665584的博客 2万+

安卓开发-基于Activity拦截的应用锁实现与优化

本文深入探讨了在安卓系统层面实现应用锁功能的两种核心方案。通过拦截Activity启动流程,基于包名识别与Intent传递,实现对指定应用的访问控制。重点分析了在ActivityStarter中直接修改源码与利用IActivityController接口监控这两种方法的实现细节、优缺点及关键优化策略,包括避免死循环、处理隐式Intent和提升验证界面体验,为开发者构建系统级安全功能提供实践指导。

weixin_29218963的博客 455

android安全问题(二) 程序锁

导读:本文介绍如何实现对应用加锁的功能,无须root权限 某些人有时候会有这样一种需求,小A下载了个软件,只是软件中的美女过于诱惑与暴露,所以他不想让别人知道这是个什么软件,起码不想让别人打开浏览。而这款软件又没有锁,任何人都可以打开,肿么办呢?如果打开它的时候需要输入密码,那该多好阿!于是,程序锁这种应用就产生了 程序锁不是最近才有的,很久之前android就

su1216的专栏 1万+

Android 应用启动时实现密码锁

当用户点击提交按钮时,我们获取用户输入的密码,并与正确密码进行比较。综上所述,我们通过创建密码锁布局和相应的 Activity 类,并将其设置为启动界面,实现了在 Android 应用启动时设置密码锁的功能。在 Android 应用开发中,有时候我们希望在应用启动时添加密码锁功能,以增加应用的安全性。在该类中,我们将检查用户输入的密码是否正确,并根据结果执行相应的操作。首先,我们需要创建一个密码锁布局,用于输入密码。通过以上设置,当应用启动时,首先会显示密码锁界面,用户需要输入正确的密码才能进入主界面。

持续更新 589

Android 12.0 启动app时设置密码锁

在12.0的系统产品开发中,对于限制某些app的启动的功能中,在项目中的需求是在点击app启动的时候,根据包名设置密码锁,当输入正确的密码的时候来启动这个app,否则 就不能启动这个app,达到限制使用app的目的,这就需要在app启动的时候,检测app的包名,然后在app启动的时候弹出输入密码的窗口,让用户输入密码,当输入正确的密码 后,才可以使用app,这就需要先熟悉app的启动流程,然后来实现这个功能

安卓兼职framework和app工程师的博客 1276

Android 屏幕固定功能

android 屏幕固定功能实现依靠的是 LockTaskController.java 中变量 mLockTaskModeTasks,Android R上这个文件移到 frameworks/base/services/core/java/com/android/server/wm/ 目录,之前是在 com/android/server/am/ ,除了路径其他基本一致。方法名都没变。修改这个路径同步添加了一个新的类ActivityTaskManagerService.java ,也在 wm 目录下,调用..

tq501501的博客 2717

DLL导出函数名隐藏实战:三种方法保护代码安全

在Windows软件开发中,动态链接库(DLL)的导出函数名是模块间通信的关键标识,也是逆向工程的重要突破口。理解PE文件格式中的导出表结构是掌握DLL工作原理的基础,它记录了函数地址、名称和序号的映射关系。通过隐藏或混淆这些导出名称,可以有效增加代码分析的难度,提升软件的知识产权保护和安全性。这一技术在软件保护、游戏反作弊和安全组件中具有重要价值。本文聚焦DLL导出函数名隐藏,结合Dependencies工具分析,详细解析仅序号导出、导出转发器和运行时动态修改三种实用方案,为开发者提供从原理到实践的完整指

weixin_29315091的博客 308

Android 应用锁/程序锁(APPLock)的实现

当用户点击了返回,由于我们的LockService中的WindowManager并没有改变实际的启动Activity的生命周期,所以返回键还是作用在实际Activity上了,所以实际Activity消失,此时根据后台的循环判断,最上次的Activity栈已经不是要被Lock的,根据刚才保存的状态,同样将密码界面消失掉。如果密码界面正在显示的时候,用户点击返回,会怎么样?当用户启动了要Lock的应用,LockService就会察觉到,此时显示密码界面,让用户输入密码,密码正确后,密码界面消失。

飞翔的熊blabla 4134

IMU数据处理避坑指南:从理论到实践的加速度计重力消除方案

本文详细解析了IMU数据处理中的重力消除技术,从理论基础到实践应用,涵盖了加速度计和陀螺仪的核心问题。通过ROS2实战案例,介绍了静态标定与动态校准的技术对比,以及多传感器融合的进阶策略,帮助开发者避免常见陷阱,提升IMU数据处理的精度和效率。

purple的博客 741

EM4095低频RFID曼彻斯特解码实战:从原理图到MCU代码实现

本文详细介绍了EM4095低频RFID读卡器的设计与实现,从芯片工作原理、天线设计到曼彻斯特解码算法。重点讲解了基于STM32的MCU代码实现,包括定时器捕获、数字滤波和错误处理,为开发125kHz RFID系统提供实用指南。

oil88的博客 715

Android如何屏蔽home键和recent键

最近在做一个项目的时候,进入一个 Activity后需要暂时屏蔽掉home键和recent键(back键可以在onKeyDown里面处理),网上找了半天,都是针对旧版本android的方法,android5.0以后就不能生效了。 看了半天的SDK和资料,发现有一种方法可以暂时屏蔽掉home键和recent键,如果有办法获取到高级的系统权限,还可以正在的屏蔽掉。废话不多说,直接上代码:

zhenbohuang的博客 1万+

纯方位观测下的三维定位,IV-PLKF(Inverse Velocity-Weighted Pseudo-Linear Kalman Filter)

在现代定位系统中,纯方位观测因其无需测距设备的优势,在无线通信、无人机导航和室内定位等领域备受关注。本文深入探讨基于算法的三维定位方法,并提供完整的MATLAB仿真例程。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 672

Android9.0 Activity启动流程分析(一)

一、am命令 我们将利用am命令启动一个Activity,来分析Activity的启动流程。 am start -W -n com.android.settings/com.android.settings.Settings -W:表示等待目标activity启动的返回结果 -n :后接component name用于指定启动的Activity 在shell中输入如上命令之后会得到如下返回结果...

Cai Yu的博客 6848

DeepSeek R1-32B医疗大模型的完整微调实战分析(全码版)

【代码】DeepSeek R1-32B医疗大模型的完整微调实战指南(全码版)

AllenLV的博客 5102

算法 | 植物根茎生长优化算法(PRGO)原理、公式及应用,matlab代码(2025最强优化算法)

【代码】算法 | 植物根茎生长优化算法(PRGO)原理、公式及应用,matlab代码(2025最强优化算法)

尘世冰封的专栏 1017

Android开发——程序锁的实现(可用于开发钓鱼登录界面)

1.程序锁原理 实时检测栈顶Activity的包名,如果和我们预置的包名相符(可用SQLite数据库对要进行匹配的包名进行信息存储),则新开一个Activity栈,将拦截画面置于用户面前。只有在用户输入密码,并且验证成功后,才“放行”。代码实现比较简单,获取到topActivity的包名即可进行程序锁的逻辑判断。...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 1万+

Word2vec核心模型精讲:CBOW与Skip-gram

Word2vec是Google提出的词向量模型,通过CBOW和Skip-gram两种神经网络架构将词汇映射到低维向量空间。CBOW通过上下文预测中心词,训练速度快但高频词表现更好;Skip-gram则相反,通过中心词预测上下文,适合处理生僻词。为解决softmax计算效率问题,Word2vec引入基于哈夫曼树的Hierarchical Softmax优化技术,将复杂度从O(V)降至O(logV)。文章详细解析了两种模型的原理差异,并演示了哈夫曼树的构造过程及其在词向量训练中的关键作用,这种结合词频的优

Trisyp的博客 530

【android开发】手机应用管理器的实现之实现软件加锁(四)

之前几篇文章我们介绍了如何去获取手机应用程序列表,已经实现对应用程序的一些操作:运行、卸载、分享。这个三个功能相对是比较简单,对于如何实现对一个应用程序加锁,这个相对复杂一点。在一些情况下,我们想对一个软件加锁,来保护我们的隐私或者增加安全,比如支付宝、银行软件,这些软件加锁都是有必要。前一段时间一直忙于项目,没对博客进行跟进,今天我们将介绍一下如何实现软件加锁。大家先看看实现的效果图(我们以加锁UC为例):

Ac_Rambler的博客专栏 5173

出现 has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present on the 解决方法

Access to XMLHttpRequest at 'http://127.0.0.1:5000/api/data' from origin 'http://10.197.0.79:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

码农研究僧的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

应用锁(AppLocker)原理及代码实现

最近工作上要用到应用锁(AppLocker),早上装了个试玩了一下,下午花了2个小时捣鼓出来一个demo (基于android 6.0),简单分享一下。   免责声明:这篇文章纯粹是个人YY,未参考或反编译任何商业app。   所谓应用锁,说白了就是在监测到目标app启动时额外起一个锁屏界面把它盖住。这种方式的缺点是显而易见的,无法100%保证盖住,有时候会先闪出一个app启动界面,然后才

飞久 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

android10.0(Q) AOSP 增加应用锁功能

应用锁的功能可以说是很普遍了,大致就是在 startActivity 对应代码处进行拦截就行。最开始在网上找了点资料,没有能合适直接用的,就自己搞了下,这里简单做个笔记。那就给大伙先来个效果图先康康。

yan_chenglong的博客 646

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android 禁用 home bank recent 屏蔽问题

返回键屏蔽非常简单: @Override public boolean onKeyDown(int keyCode,KeyEvent event){ if(keyCode==KeyEvent.KEYCODE_BACK) return true; return super.onKeyDown(keyCode, event); } home和...

qq_36355271的博客 883

android app锁定后台运行的方法

因为安卓系统后台程序限制,软件在长时间挂后台运行时会被系统杀掉,可以将程序加入清理白名单中,并在手机系统设置中的“电池->后台高耗电中允许软件后台高耗电”具体方法如下: 1.将应用加入到清理白名单中方法: (1)vivo手机设置方法:打开任务切换界面----点击app右上角的锁图标使其变为锁定状态,或者将当前app向下拖动即可 (2)oppo手机设置方法:打开任务切换界面----点击app右上角图标后会出现“锁定”按钮,点击锁定即可,或者将当前app向下拖动即可 (3)小米手机设置方法:打开任务切换界

u012922981的专栏 1万+

Android锁

在 Android 应用的开发过程中,随着业务需求的复杂度不断提升,多线程并发场景层出不穷。为了保证数据一致性与线程安全,锁(Lock)成为了不可或缺的工具。本篇博客将深入剖析 Android 中常用的锁机制、使用场景与最佳实践,并配以精炼的示例代码与示意图,帮助你快速掌握锁的精髓。

jiet_h的博客 1580

Android:程序锁功能的简单实现

如我们所知,现在有很多牛逼的安全软件都带有程序锁的功能。当然,名字可能不一样,有的叫隐私保护,有的叫软件锁。等等。但是这种名字其实都是表达一种意思,就是可以给你手机里面的app加以保护。只有你给你的App设置了程序锁,这样每次在你进入这个App的时候就要先输入密码,然后才能进入。 程序锁功能并不是什么高大上的技术,也不是很难的技术点。于是,受到灰驹的启发,我就写了一个简单的,UI比较丑陋的程序锁的小

Cat的专栏 1万+
上一篇: android安全漏洞(四) 抢先开机启动 - 结果篇
下一篇: android安全漏洞(一) 静音拍照与被拍
Bincker
博客等级 码龄20年 35粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值