新技术论坛
搜索
查看: 727|回复: 0
打印 上一主题 下一主题

[技术交流] Android木马揭秘之用户定位技术的实现

[复制链接]
  • TA的每日心情
    开心
    2016-12-9 18:18
  • 签到天数: 85 天

    连续签到: 1 天

    [LV.6]常住居民II

    扫一扫,手机访问本帖
    楼主
    跳转到指定楼层
    发表于 2016-7-12 06:55:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
      这几年安卓系统的普及速度可谓迅猛,一时间各式各样的设备都承载着安卓系统,手机、平板、机顶盒等都忠实地成为了安卓系统的用户。由于安卓系统在移动设备上的使用率最高,而移动设备上存储的数据往往涉及到个人隐私,如手机通讯录、短信内容、拍摄照片、阅读书目、保存文档等,有时更会涉及到经济利益,这诱惑着一些利益集团开始制作基于安卓系统的远程控制程序,即安卓系统木马。

      首个安卓系统木马应属2010年出现的"Trojan-SMS.AndroidOS.FakePlayer.a",这是一个以扣取用户手机话费为目的的盈利性安卓系统木马。随着需要的发展,单纯的盈利性木马已经不是重点,用户的隐私数据才是核心,尤其是具有用户行为监视性的木马最受关注。所谓"用户行为监视性的木马"就是指该类安卓木马能够监视用户的所在、所说、所做。"所在"即用户所处位置在哪里;"所说"即通话内容,聊天内容;"所做"即在操作什么程序,在干什么活动。这一类的木马由于涉及到用户核心利益,往往经济价值较大,多用于私人侦探、商业窃密等领域,平时很难见到,更不要说了解其核心代码、实现机制。为此,本文将逐步向读者揭秘这些高级安卓木马的核心实现技术,帮助大家更好地了解这些木马实现技术,从而做好对个人隐私的保护,防范该类木马的入侵。
      本文旨在讨论技术,凡利用本文技术进行违法活动的作者与杂志概不负责。
      这里首先要向大家揭秘的是高级安卓木马是如何实现对用户定位的,即如何知道用户的"所在"。如果你利用百度搜索安卓定位原理,会发现百度给出的解释不外乎是利用GPS或者手机基站定位,甚至结合Wi-Fi信号。原理不错,但这只是原理,要想具体实现定位可是有一定难度的。以手机基站定位为例,现在传统的实现方式是利用AndroidSDK中的API(TelephonyManager)获得MCC、MNC、LAC、CID等信息,然后通过Google的API获得所在位置的经纬度,最后再通过GoogleMap的API获得实际的地理位置。这其中,MCC即MobileCountryCode,移动国家代码(中国的为460);MNC,MobileNetworkCode,移动网络号码(中国移动为00,中国联通为01);LAC,LocationAreaCode,位置区域码;CID,CellIdentity,基站编号,是个16位的数据(范围是0到65535)。由于谷歌存储了MCC、MNC、LAC、CID等信息,一旦我们能够获取当前移动设备所在基站的这些数据,就可以通过向谷歌的"http://www.google.com/loc/json"网址发送查询数据获取基站所在经纬度。
      得到经纬度后,我们将其转换为实际地址,这需要向谷歌的"http://maps.google.cn/maps/geo?key=abcdefgq="发送经纬度数据,最终获得移动设备所在实际地址。这样的实现代码在网上很多,你会发现它们都不好使了,为什么呢?因为"http://www.google.com/loc/json"这个网址现在已经不能访问了。这个可悲的消息使得我们意识到必须采用一种相对稳妥的方法来实现移动设备定位。在对某个安卓木马程序做逆向分析时,发现一种新的基于手机基站定位实现技术。当然在这之前,细心的读者会发现为什么我们一直在详细讲解基于手机基站的定位实现,而不采用最为常用的GPS。因为手机这样的移动设备一旦进入到房屋内等封闭场所,GPS信号就衰减为0,不足以实现定位,而手机信号多半都是存在的,所以基于手机基站的定位方式更为稳妥,这就是为什么很多高级安卓木马会采用该方式实现定位的原因。
      言归正传,我们发现的这个安卓木马采用了基于百度提供的定位SDK。根据百度官方的解释:百度Android定位SDK支持Android1.5以及以上设备,提供定位功能,通过GPS、网络定位(WIFI、基站)混合定位模式,返回当前所处的位置信息;反地理编码功能:解析当前所处的位置坐标,获得详细的地址描述信息。如此丰富的技术支持,难怪该安卓木马会采用这个SDK。
      百度Android定位SDK的使用非常简单,首先在百度的官网下载最新的库文件,将liblocSDK.so文件拷贝到libs/armeabi目录下,将locSDK.jar文件拷贝到工程根目录下,并在工程属性-JavaBuildPath-Libraries中选择AddJARs,选定locSDK.jar,确定后返回,就可以在程序中使用百度Android定位SDK了。在代码实现时,首先需要初始化LocationClient类,其代码如下:
    1. publicLocationClientmLocationClient=null;
    2. publicBDLocationListenermyListener=newMyLocationListener();
    3. publicvoidonCreate(){
    4. mLocationClient=newLocationClient(this);
    5. //声明LocationClient类
    6. //注册监听函数
    7. mLocationClient.registerLocationListener(myListener);
    8. }
    复制代码

    接着实现BDLocationListener接口。BDLocationListener接口有一个方法,作用是接收异步返回的定位结果,参数是BDLocation类型参数。其代码如下:

    1. publicclassMyLocationListennerimplementsBDLocationListener{
    2. @Override
    3. publicvoidonReceiveLocation(BDLocationlocation){
    4. if(location==null)
    5. return;
    6. StringBuffersb=newStringBuffer(256);
    7. sb.append("time:");
    8. sb.append(location.getTime());
    9. sb.append("\nerrorcode:");
    10. sb.append(location.getLocType());
    11. sb.append("\nlatitude:");
    12. sb.append(location.getLatitude());
    13. sb.append("\nlontitude:");
    14. sb.append(location.getLongitude());
    15. sb.append("\nradius:");
    16. sb.append(location.getRadius());
    17. if(location.getLocType()==BDLocation.TypeGpsLocation){
    18. sb.append("\nspeed:");
    19. sb.append(location.getSpeed());
    20. sb.append("\nsatellite:");
    21. sb.append(location.getSatelliteNumber());
    22. }elseif(location.getLocType()==BDLocation.TypeNetWorkLocation){
    23. sb.append("\naddr:");
    24. sb.append(location.getAddrStr());
    25. }
    26. logMsg(sb.toString());
    27. }
    28. }
    复制代码

    接着设置参数。设置定位参数包括定位模式(单次定位,定时定位),返回坐标类型,是否打开GPS等。实现代码如下:

    1. LocationClientOptionoption=newLocationClientOption();
    2. option.setOpenGps(true);
    3. option.setAddrType("detail");
    4. option.setCoorType("gcj02");
    5. option.setScanSpan(5000);
    6. mLocClient.setLocOption(option);
    复制代码

    最后,发起定位请求。请求过程是异步的,定位结果在上面的监听函数中获取,代码如下:

    1. if(mLocClient!=null&&mLocClient.isStarted())
    2. mLocClient.requestLocation();
    3. else
    4. Log.d("LocSDK_2.0_Demo1","locClientisnullornotstarted");
    复制代码

    实际测试效果如图1所示。从图中可以看出,演示程序准确定位到了我此刻手机所在的位置,定位精度在百米内。木马程序一旦使用了这样的技术,完全可以实现对用户所在的监视,你此刻是不是有一种毛骨悚然的感觉呢?

    图1


    定位代码实现后,就可以利用移动网络将用户数据时时上传至控制端网站,由控制端用户查看。结合以往数据,就可以勾画出一个人一段时间内的行踪,对被控制者来说,此刻的手机或者其它移动设备就成为了出卖自己的第一元凶。定位代码的成功实现,只是高级安卓木马程序的一部分功能,随后的工作还有很多,我会陆续将这些核心技术向读者一一揭秘。





    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    手机版|Archiver|开发者俱乐部 ( ICP/ISP证:辽B-2-4-20110106号 IDC证:辽B-1-2-20070003号 )

    GMT+8, 2025-1-4 00:13 , Processed in 0.119571 second(s), 21 queries .

    X+ Open Developer Network (xodn.com)

    © 2009-2017 沈阳讯网网络科技有限公司

    快速回复 返回顶部 返回列表