Android木馬如何實現用戶定位技術?
這幾年安卓系統的普及速度可謂迅猛,一時間各式各樣的設備都承載著安卓系統,手機、平板、機頂盒等都忠實地成為了安卓系統的用戶。由於安卓系統在移動設備上的使用率最高,而移動設備上存儲的數據往往涉及到個人隱私,如手機通訊錄、簡訊內容、拍攝照片、閱讀書目、保存文檔等,有時更會涉及到經濟利益,這誘惑著一些利益集團開始製作基於安卓系統的遠程控制程序,即安卓系統木馬。
首個安卓系統木馬應屬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=abcdefg&q=」發送經緯度數據,最終獲得移動設備所在實際地址。這樣的實現代碼在網上很多,你會發現它們都不好使了,為什麼呢?因為「http://www.weixianmanbu.com/」這個網址現在已經不能訪問了。這個可悲的消息使得我們意識到必須採用一種相對穩妥的方法來實現移動設備定位。在對某個安卓木馬程序做逆向分析時,發現一種新的基於手機基站定位實現技術。當然在這之前,細心的讀者會發現為什麼我們一直在詳細講解基於手機基站的定位實現,而不採用最為常用的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類,其代碼如下:
publicLocationClientmLocationClient=null; publicBDLocationListenermyListener=newMyLocationListener(); publicvoidonCreate(){ mLocationClient=newLocationClient(this) //聲明LocationClient類 //註冊監聽函數 mLocationClient.registerLocationListener(myListener); }n
接著實現BDLocationListener介面。BDLocationListener介面有一個方法,作用是接收非同步返回的定位結果,參數是BDLocation類型參數。其代碼如下:
publicclassMyLocationListennerimplementsBDLocationListener{@OverridepublicvoidonReceiveLocation(BDLocationlocation){if(location==null)return; StringBuffersb=newStringBuffer(256);sb.append("time:");sb.append(location.getTime());sb.append("nerrorcode:");sb.append(location.getLocType());sb.append("nlatitude:");sb.append(location.getLatitude());sb.append("nlontitude:");sb.append(location.getLongitude());sb.append("nradius:");sb.append(location.getRadius()); if(location.getLocType()==BDLocation.TypeGpsLocation){ sb.append("nspeed:");sb.append(location.getSpeed());sb.append("nsatellite:");sb.append(location.getSatelliteNumber());}elseif(location.getLocType()==BDLocation.TypeNetWorkLocation){ sb.append("naddr:");sb.append(location.getAddrStr());}logMsg(sb.toString()); }}n
接著設置參數。設置定位參數包括定位模式(單次定位,定時定位),返回坐標類型,是否打開GPS等。實現代碼如下:
LocationClientOptionoption=newLocationClientOption();option.setOpenGps(true);option.setAddrType("detail");option.setCoorType("gcj02");option.setScanSpan(5000);mLocClient.setLocOption(option);n
最後,發起定位請求。請求過程是非同步的,定位結果在上面的監聽函數中獲取,代碼如下:
if(mLocClient!=null&&mLocClient.isStarted())mLocClient.requestLocation();elseLog.d("LocSDK_2.0_Demo1","locClientisnullornotstarted");n
實際測試效果如圖1所示。從圖中可以看出,演示程序準確定位到了我此刻手機所在的位置,定位精度在百米內。木馬程序一旦使用了這樣的技術,完全可以實現對用戶所在的監視,你此刻是不是有一種毛骨悚然的感覺呢?
定位代碼實現後,就可以利用移動網路將用戶數據時時上傳至控制端網站,由控制端用戶查看。結合以往數據,就可以勾畫出一個人一段時間內的行蹤,對被控制者來說,此刻的手機或者其它移動設備就成為了出賣自己的第一元兇。定位代碼的成功實現,只是高級安卓木馬程序的一部分功能,隨後的工作還有很多,將會陸續將這些核心技術向讀者一一揭秘。
原博客地址:危險漫步博客
*本文原創作者:GDLpa,轉載須註明來自FreeBuf黑客與極客(http://FreeBuf.COM)
推薦閱讀:
※Android深入學習需要看一些jvm書籍或者資料呢?
※如何在 Android 上使用思源黑體作為系統字體?
※Windows 10 Mobile 開發人員模式和安卓系統的 USB調試等開發者功能有何異同?
※Android 開發你需要了解的 Gradle 配置