一種針對Android系統App行為的監控方法【專利摘要】本發明公布了一種針對Android系統App行為的監控方法,首先編寫內核模塊,通過編寫自己的Android內核模塊,進行交叉編譯;然后將模塊加載到Android系統中,通過對特定的函數(如讀取通訊錄等相關信息的函數)進行攔截,獲得到相應的系統調用信息,包括如是哪個進程讀取的等信息;再將相應記錄信息返回給應用層,形成相應的監控日志文件,實現對整個Android系統的系統調用的攔截與監控。本發明無論對應用層還是Native層產生的系統調用均能進行監控,相比現有的針對應用層的一些監控方法,能夠保護得更加徹底,對手機的安全防護性也更強;使用戶對安裝的軟件的行為了如指掌,能夠及時發現軟件的惡意行為。【專利說明】一種針對Android系統App行為的監控方法
技術領域:
[0001]本發明涉及Android系統Application(App)軟件安全技術,尤其涉及一種基于Andr〇id系統的App敏感行為監控的方法。【
背景技術:
】[0002]智能手機相對于傳統普通手機擁有更豐富的功能和更強的數據處理能力,而近年來發展迅速的Android系統具有開源、可移植性強等優點,越來越多的手機采用Android系統作為手機操作系統。隨著Android智能手機的普及,Android智能手機暴露出來的安全性問題越來越多。因此,如何保護Android智能手機的安全,是一個非常重要的課題。[0003]Android手機市場上有大量可供下載的app,有一些應用是安全的;也有一些app可能被植入了病毒、木馬,一旦用戶下載并安裝了相應的app,可能會造成很多問題,如重要隱私的泄露,手機流量被盜用,手機被監聽等等,這些都會對用戶造成重大的損失。不管是什么木馬病毒,它們要想對系統進行信息竊取,對系統進行監控等都必須通過系統調用來實現相關的功能。因此,針對上述問題,可通過對相應的系統調用進行攔截來解決。目前,市場上的一些安全軟件大都是在應用層對系統調用進行監控,例如,開源的Xposed框架被很多安全軟件采用,這種方法只能攔截到應用層的系統調用。而如果木馬植入在Native層,在這種情況下,現有這些安全軟件無法通過對相應的系統調用來攔截到木馬行為。【
發明內容】[0004]為了克服上述現有技術的不足,本發明提供一種基于Android系統Application(App)敏感行為監控的方法,通過安全內核實現方法在Android內核層添加模塊,實現對整個Android系統的系統調用的攔截與監控,從而使用戶對安裝的軟件的行為了如指掌,能夠及時發現軟件的惡意行為。[0005]對于Android系統,無論是在應用層還是在Native層對系統進行調用,都會進行內核層的系統調用,因此,可以通過在內核層對系統調用進行監控和攔截,以達到安全保護的目的。由于本發明提供的方法對Native層產生的系統調用也能進行監控,這種基于內核層的軟件調用監控比現有的針對應用層的一些監控框架如Xposed等,能夠保護得更加徹底,對手機的安全防護性也更強。[0006]本發明提供的技術方案是:[0007]一種針對Android系統App行為的監控方法,通過安全內核實現方法在Android內核層添加模塊,實現對整個Android系統的系統調用的攔截與監控;包括如下步驟:[0008]SI.編寫內核模塊;所述編寫的內核模塊用于實現如下操作:[0009]a)獲取系統調用表;[0010]b)編寫自定義函數;[0011]c)用所述自定義函數的地址替換所述系統調用表里面的系統調用函數;[0012]d)通過所述自定義函數獲取相關進程信息;[0013]e)編寫Netlinksocket通信模塊,用于將所述相關進程信息傳遞給應用層;[0014]S2.在步驟Sl編寫的內核模塊中,通過hook方法實現對系統調用函數的替換;[0015]S3.將步驟Sl編寫的內核模塊加載到內核中去,實現對替換調用函數的攔截,攔截得到調用函數;[0016]S4.設定監控目標,包括設定敏感數據和操作,判斷攔截得到的調用函數是否對所述設定的敏感數據進行了設定操作;當發生有所述設定時,記錄調用函數操作的進程信息,再執行步驟S5;當沒有發生所述設定操作時,結束操作;[0017]S5.通過內核模塊編寫的NetlinkSocket通信功能,將所述記錄的調用函數操作的進程信息傳遞給上層接收程序,形成日志文件。[0018]針對上述針對Android系統App行為的監控方法,進一步地,步驟Sl的e)中,所述通信模塊米用LinuxAPIhook、Inlinehook和Netlinksocket通信中的一種。在本發明實施例中,所述通信模塊采用Netlinksocket通信。[0019]針對上述針對Android系統App行為的監控方法,進一步地,步驟S2所述hook方法具體包括:首先編寫自定義函數;再通過將自定義函數的地址替換系統調用函數的地址,實現對系統調用函數的替換;所述系統調用函數的地址通過步驟Sl獲取的系統調用表得到。[0020]所述hook方法具體通過使用Linuxhookapi和inlinehook對系統調用進行處理,實現對系統調用函數的替換。[0021]所述系統調用表地址的獲取具體是通過代碼來模仿swi中斷,在中斷過程中將系統調用表的地址放入tbl寄存器中,由此獲得所述系統調用表地址。所述自定義函數的參數列表必須和相應的系統調用函數的參數列表一致,并且在自定義函數的尾部要繼續調用所述相應的系統函數,從而使得所述自定義函數能夠正確返回。[0022]針對上述針對Android系統App行為的監控方法,進一步地,步驟S4所述調用函數操作的進程信息還包括:通過獲取所述進程的上下文而獲得的其他信息。[0023]與現有技術相比,本發明的有益效果是:[0024]本發明提供一種基于Android系統App敏感行為監控的安全內核實現方法,通過在Android內核層添加模塊的方法,實現對整個Android系統的系統調用的攔截與監控,從而使用戶對安裝的軟件的行為了如指掌,能夠及時發現軟件的惡意行為。[0025]本發明通過編寫自己的Android內核模塊,進行交叉編譯,然后將模塊加載到Android系統中,通過對特定的函數(如讀取通訊錄等相關信息的函數)進行攔截,獲得到相應的系統調用信息。系統調用信息包括:讀取的進程(是哪個進程讀取的)等。然后將相應記錄信息返回給應用層,形成相應的日志文件。本發明提供的安全內核實現方法無論對應用層還是Native層產生的系統調用均能進行監控,這種基于內核層的軟件調用監控比現有的針對應用層的一些監控框架如Xposed等方法,能夠保護得更加徹底,對手機的安全防護性也更強。【附圖說明】[0026]圖1是本發明實施例中基于Andr0id系統App敏感行為監控的安全內核實現方法的流程框圖。【具體實施方式】[0027]下面結合附圖,通過實施例進一步描述本發明,但不以任何方式限制本發明的范圍。[0028]本發明提供一種基于Android系統App敏感行為監控的安全內核實現方法,通過在Android內核層添加模塊的方法,實現對整個Android系統的系統調用的攔截與監控。具體地,通過編寫自己的Android內核模塊,進行交叉編譯,然后將模塊加載到Android系統中,通過對特定的函數(如讀取通訊錄等相關信息的函數)進行攔截,獲得到相應的系統調用信息。系統調用信息包括:讀取的進程(是哪個進程讀取的)等。再將相應記錄信息返回給應用層,形成相應的監控日志文件。本發明包括如下步驟:[0029]Sl.編寫內核模塊,獲取系統調用表地址;[0030]在編寫的內核模塊中實現獲取系統調用表地址;[0031]通過編寫的內核模塊,可進一步執行并實現以下幾方面操作:[0032]f)獲取系統調用表;[0033]g)編寫自定義函數;[0034]h)用自定義函數地址替換系統調用表里面的系統調用函數;[0035]i)在自定義的函數里面獲取相關的進程信息;[0036]j)把進程信息通過自己編寫的通信模塊(采用Netlinksocket通信)傳遞給應用層;[0037]k)應用層接收相應的信息并生成日志文件。[0038]S2.在內核模塊里面通過hook技術實現對系統調用函數的替換;[0039]首先編寫自定義函數;再通過將自定義函數的地址替換系統調用函數的地址,實現對系統調用函數的替換。[0040]其中,系統調用函數的地址通過步驟Sl獲取的系統調用表得到。[0041]S3.將步驟Sl編寫的內核模塊加載到內核中去,實現對替換調用函數的攔截;[0042]S4.判斷攔截下來的調用函數是否對我們設定的敏感數據進行了讀取,如有讀取則進行步驟S5,若無讀取則結束操作;[0043]S5.內核模塊通過自己編寫的通信模塊(本發明實施例采用NetlinkSocket通信),將記錄下來的調用函數操作信息傳遞給上層接收程序(應用層),并且形成相關的日志文件。[0044]上述方法的步驟S2中,內核模塊通過使用Linuxhookapi和inlinehook對相關的系統調用進行處理,實現對系統調用函數的替換;[0045]本發明提供的方法中米用LinuxAPIhook、Inlinehook和Netlinksocket通信技術,其中:[0046]LinuxAPIhook技術原理是Linux中的每個基本函數地址都存在于系統調用表中某一位置。因此,本發明通過找到系統調用表的首地址,然后根據Linux內核代碼替換掉對應項的函數地址,使原來的系統調用的函數指針指向自己編寫的函數。這樣,表面上看是在調用系統函數,實際上是在執行自己編寫的函數。通過在自己編寫的函數體內對系統調用的相關信息進行記錄,例如:進程信息以及進行的相關操作等。[0047]Inlinehook技術:與LinuxAPIhook相比,Inlinehook的原理是通過在目標函數頭部插入代碼來使其跳轉到自己設置的一個函數里,產生hook。但hook完后需要進行堆棧的恢復。對堆棧的恢復較復雜,例如,Android系統下的Inlinehook和Linux系統下的Inlinehook因為系統架構的不同而不同,Linux系統下的Inlinehook里面用到匯編指令,而Android系統下用到arm指令D[0048]NetIinksocket通信:NetIink是一種特殊的socket,它是Linux系統所特有的,類似于BSD中的AF_R0UTE,但又遠比它的功能強大,目前在最新的Linux內核(2.6.14)中使用netlink進行應用與內核通信的應用很多,Netlink是一種在內核與用戶應用間進行雙向數據傳輸的非常好的方式,用戶態應用使用標準的socketAPI就可以使用netlink提供的強大功能,內核態需要使用專門的內核API來使用Netlink。[0049]下面通過實施例進一步來描述本發明提供方法的實施步驟:[0050]第一步,我們要獲取系統調用表地址,系統調用表里面存放著系統函數的調用地址,通過系統調用表的地址,可以獲取到系統函數的地址。系統調用表地址的獲取具體是通過代碼來模仿swi中斷,在中斷過程中系統會將系統調用表的地址放入tbl寄存器中,可通過執行如下代碼得到獲取系統調用表地址:[0051]unsignedlong*iliid_sys_cail_tablc()//Addressoftheso&varcinterrupt(swi)handlerinMghvector:ARMsystemslikeAndroidconstvoid*s\\j_addr-OxFFFFOOOS;unsignedlong*sys_call_table_NULL;unsignediong^pir=NULL;unsignedlongveGt〇r_swiqftset=Q;unsignediongvcciorswiinsiruclion^0:unsignedlong^vcctorsvviaddi^pir-NULL;//GettheIoadpcinstructionfromtheswimcmcp>(&vcclor_swi_instruclion,swi_addr,sizc〇r(vcclor_swi_inslruclion));!'ReadihcoilselfromilieswiydrcsswFilmclhchandlerpi)inlLTlivesvccior_svvi_oHscl=vcclorswijnstruclion&(unsignedlong)0x00000nT;//Getthepoiiitertotheswihandler(bflfsetisfromtheloaditlstructiGnlocation+2words^ducnoARMquirks)veclorswiaddrpU'=(unsignedlong*>((unsigiKdlong)suiaddr卜vector_swi_oirset+8);[0052]^Startingatthebeginningofthehandle^searchforthesys_call_tableaddressload*ThiscodeisUieresult.oi'Uie/ai.cIVarm/kenid/cnU.y-common.Sfile,skirtingalthelineENTRY(vccior_swi).You'llseethatthereisalwaysaζ〇Γ〇_φaftersavingregisterstatebeforeanyiunctionbegins.li!sagoodMlightl·Lb^ιsc'tosearchfortomakesureyou'veenteredthestack-frame-properbeforelookiiigforthesyscalltablepointerload^instruciionvcclor_swi_addr_j)tr;boolIbundFirstLighthousc-lalsc;unsignedlongsys_call_lab!c_〇n'scl=0;./^Don'lsearchpasttheendofihccodeblock.Thisisadumbbound,Ishouldbescai*chingtillIhittheequivalentofaretinARMybutIdidn'tfeellikefiguringitoutsinceARMdoesn'thay^arciinslruciionwhile((unsignedlong)ptr<iniLmrn,end_c()dc&&^yscalltable=NULL·){//Findtiiczcro_[pinvOcalion(whichtranskiicsm!oLiIo;idofzcri)ip.loRH)ii、((*pir&(unsigned丨ong)Oxn'fiT)n、0__0xc3a00000)(fGundFirstLighthouse=true;}USearchibrtheloadingofthesysealiLahlc(inentry-common.S.givenasf,ndttHLsys_call_table(,,//wliiehtranslatestoanaddandaldr.TheaddLoadsthesys_call_tablepoiBter)iffibundFirslLighthousc&&(("pir&(unsignedlong)0xfirR)000)==0xc28R)000)){//Gettheoffsetfromtheaddthatwillcontaintheactualpointersys_caIl_iablc_0nsct=^pir&(unsignedlong)0x000()0nT;//(inibdamnpointer;mdgcLonwiihit!syscalliablc^(unsignedfeng)ptr+8+sys_eall_table_0f&et;break;}ptr+十;[0053]}returnsyscalllablc;}[0054]第二步,我們要替換系統調用,本實施例對syS_〇pen函數進行分析,當應用層發生了讀文件的操作時,其在底層都會調用sys_open這個系統函數。本方法中,通過自己編寫函數來替換該系統函數。本實施例通過以下自定義函數〇ur_sys_open替換sys_open系統函數。自定義的函數的參數列表必須和系統自帶函數的參數列表一致,并且在函數尾部我們要繼續調用原系統函數(syS_〇pen函數)保證自定義函數(〇Ur_sys_〇pen函數)能夠正確返回。本實施例中,我們的自定義函數〇ur_sys_open如下:[0055]asmlinkagemt〇ur_sys_open(constchar*file,mtflags,intmode)//smsisthepathoi'thcrnmssms.dbchar;j!sms="/data/dala/cotn,android.providcrs.tclephony/daiabascs/mmssms.db";//judgewhetherlhcsmsdatabasesisreadIf(strcmp:(fiie,sms)==0||strstr(file,sms)!=NULL){printk(ORNJNFO,'sy$_open=,M,s\n^(!lc);prinlk(KERN_lNFO"smssms\n"J'ilo):prinlk("snisprocessid/pidiscurrcnl->lgid);if(pid>=0){//sendthepidofproccsstotheapplicationlayerscndnlmsg(intioslr(currcnl->tgid));}returnoriginal_0all_open(file;flags?mode);_[0056]}[0057]再通過下面語句進行函數替換:[0058]original_call_open=sys_call_table[-NR_open];[0059]sys_call_table[-NR_open]=our_sys_open;[0060]第三步,實現對替換調用函數的攔截;[0061]接下來,上述進行函數替換的語句首先把原來的函數地址進行保存,然后用自己寫的函數地址替換掉原來函數的地址。這樣,當讀文件系統調用發生時,系統就會自動調用我們的函數。[0062]第四步,判斷攔截下來的調用函數是否對我們設定的敏感數據進行了讀取,如有讀取則繼續執行,若無讀取則結束操作;[0063]在函數體內,我們可以對該調用者的相關信息進行獲取,例如,在上面的函數體里面,我們就可以判斷這個讀函數是針對哪些文件的,是不是我們監控的那些信息。在上述函數體中,我們可以看到是判斷其有沒有讀取手機上面的短信,若有則將其進程號記錄下來。[0064]第五步,通過自己編寫的NetlinkSocket通信,將記錄下來的調用函數操作信息傳遞給上層接收程序(應用層),并且形成相關的日志文件。[0065]實際上,我們可以通過獲取進程上下文來獲取更多信息,如通過get_CUrrent()->comm可以獲取到當前應用程序的名字,然后通過NetlinkSocket通信傳給上層,形成日志文件。[0066]現有的一些框架例如Xposed框架也能夠對一些信息進行攔截,但它們只能攔截應用層的一些調用,現在有一些木馬是直接植入在Native層的,那些框架是無法攔截到的。所以本發明方法采用這種基于內核的攔截,能夠更加徹底地保護系統,對手機的安全防護性也更強。[0067]需要注意的是,公布實施例的目的在于幫助進一步理解本發明,但是本領域的技術人員可以理解:在不脫離本發明及所附權利要求的精神和范圍內,各種替換和修改都是可能的。因此,本發明不應局限于實施例所公開的內容,本發明要求保護的范圍以權利要求書界定的范圍為準。【主權項】1.一種針對Android系統App行為的監控方法,通過安全內核實現方法在Android內核層添加模塊,實現對整個Android系統的系統調用的攔截與監控;包括如下步驟:51.編寫內核模塊;所述編寫的內核模塊用于實現如下操作:a)獲取系統調用表;b)編寫自定義函數;c)用所述自定義函數的地址替換所述系統調用表里面的系統調用函數;d)通過所述自定義函數獲取相關進程信息;e)編寫Netlinksocket通信模塊,用于將所述相關進程信息傳遞給應用層;52.在步驟S1編寫的內核模塊中,通過hook方法實現對系統調用函數的替換;53.將步驟S1編寫的內核模塊加載到內核中去,實現對替換調用函數的攔截,攔截得到調用函數;54.設定監控目標,包括設定敏感數據和操作,判斷攔截得到的調用函數是否對所述設定的敏感數據進行了設定操作;當發生有所述設定時,記錄調用函數操作的進程信息,再執行步驟S5;當沒有發生所述設定操作時,結束操作;S5.通過內核模塊編寫的NetlinkSocket通信功能,將所述記錄的調用函數操作的進程信息傳遞給上層接收程序,形成日志文件。2.如權利要求1所述針對Android系統App行為的監控方法,其特征是,步驟S1的e)中,所述通信模塊采用Netlinksocket通信。3.如權利要求1所述針對Android系統App行為的監控方法,其特征是,步驟S2所述hook方法具體包括:首先編寫自定義函數;再通過將自定義函數的地址替換系統調用函數的地址,實現對系統調用函數的替換;所述系統調用函數的地址通過步驟S1獲取的系統調用表得到。4.如權利要求3所述針對Android系統App行為的監控方法,其特征是,步驟S2所述hook方法具體通過使用Linuxhookapi和inlinehook對系統調用進行處理,實現對系統調用函數的替換。5.如權利要求3所述針對Android系統App行為的監控方法,其特征是,步驟S2所述系統調用表地址的獲取具體是通過代碼來模仿swi中斷,在中斷過程中將系統調用表的地址放入寄存器中,由此獲得所述系統調用表地址。6.如權利要求3所述針對Android系統App行為的監控方法,其特征是,所述自定義函數的參數列表必須和相應的系統調用函數的參數列表一致,并且在自定義函數的尾部要繼續調用所述相應的系統函數,從而使得所述自定義函數能夠正確返回。7.如權利要求1所述針對Android系統App行為的監控方法,其特征是,步驟S4所述調用函數操作的進程信息還包括:通過獲取所述進程的上下文而獲得的其他信息。【文檔編號】G06F21/56GK105844157SQ201610248733【公開日】2016年8月10日【申請日】2016年4月20日【發明人】文偉平【申請人】北京鼎源科技有限公司