亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種針對Android系統(tǒng)App行為的監(jiān)控方法

文檔序號:10489276閱讀:1860來源:國知局
一種針對Android系統(tǒng)App行為的監(jiān)控方法【專利摘要】本發(fā)明公布了一種針對Android系統(tǒng)App行為的監(jiān)控方法,首先編寫內核模塊,通過編寫自己的Android內核模塊,進行交叉編譯;然后將模塊加載到Android系統(tǒng)中,通過對特定的函數(shù)(如讀取通訊錄等相關信息的函數(shù))進行攔截,獲得到相應的系統(tǒng)調用信息,包括如是哪個進程讀取的等信息;再將相應記錄信息返回給應用層,形成相應的監(jiān)控日志文件,實現(xiàn)對整個Android系統(tǒng)的系統(tǒng)調用的攔截與監(jiān)控。本發(fā)明無論對應用層還是Native層產生的系統(tǒng)調用均能進行監(jiān)控,相比現(xiàn)有的針對應用層的一些監(jiān)控方法,能夠保護得更加徹底,對手機的安全防護性也更強;使用戶對安裝的軟件的行為了如指掌,能夠及時發(fā)現(xiàn)軟件的惡意行為?!緦@f明】一種針對Android系統(tǒng)App行為的監(jiān)控方法
技術領域
[0001]本發(fā)明涉及Android系統(tǒng)Application(App)軟件安全技術,尤其涉及一種基于Andr〇id系統(tǒng)的App敏感行為監(jiān)控的方法?!?br>背景技術
】[0002]智能手機相對于傳統(tǒng)普通手機擁有更豐富的功能和更強的數(shù)據(jù)處理能力,而近年來發(fā)展迅速的Android系統(tǒng)具有開源、可移植性強等優(yōu)點,越來越多的手機采用Android系統(tǒng)作為手機操作系統(tǒng)。隨著Android智能手機的普及,Android智能手機暴露出來的安全性問題越來越多。因此,如何保護Android智能手機的安全,是一個非常重要的課題。[0003]Android手機市場上有大量可供下載的app,有一些應用是安全的;也有一些app可能被植入了病毒、木馬,一旦用戶下載并安裝了相應的app,可能會造成很多問題,如重要隱私的泄露,手機流量被盜用,手機被監(jiān)聽等等,這些都會對用戶造成重大的損失。不管是什么木馬病毒,它們要想對系統(tǒng)進行信息竊取,對系統(tǒng)進行監(jiān)控等都必須通過系統(tǒng)調用來實現(xiàn)相關的功能。因此,針對上述問題,可通過對相應的系統(tǒng)調用進行攔截來解決。目前,市場上的一些安全軟件大都是在應用層對系統(tǒng)調用進行監(jiān)控,例如,開源的Xposed框架被很多安全軟件采用,這種方法只能攔截到應用層的系統(tǒng)調用。而如果木馬植入在Native層,在這種情況下,現(xiàn)有這些安全軟件無法通過對相應的系統(tǒng)調用來攔截到木馬行為?!?br/>發(fā)明內容】[0004]為了克服上述現(xiàn)有技術的不足,本發(fā)明提供一種基于Android系統(tǒng)Application(App)敏感行為監(jiān)控的方法,通過安全內核實現(xiàn)方法在Android內核層添加模塊,實現(xiàn)對整個Android系統(tǒng)的系統(tǒng)調用的攔截與監(jiān)控,從而使用戶對安裝的軟件的行為了如指掌,能夠及時發(fā)現(xiàn)軟件的惡意行為。[0005]對于Android系統(tǒng),無論是在應用層還是在Native層對系統(tǒng)進行調用,都會進行內核層的系統(tǒng)調用,因此,可以通過在內核層對系統(tǒng)調用進行監(jiān)控和攔截,以達到安全保護的目的。由于本發(fā)明提供的方法對Native層產生的系統(tǒng)調用也能進行監(jiān)控,這種基于內核層的軟件調用監(jiān)控比現(xiàn)有的針對應用層的一些監(jiān)控框架如Xposed等,能夠保護得更加徹底,對手機的安全防護性也更強。[0006]本發(fā)明提供的技術方案是:[0007]一種針對Android系統(tǒng)App行為的監(jiān)控方法,通過安全內核實現(xiàn)方法在Android內核層添加模塊,實現(xiàn)對整個Android系統(tǒng)的系統(tǒng)調用的攔截與監(jiān)控;包括如下步驟:[0008]SI.編寫內核模塊;所述編寫的內核模塊用于實現(xiàn)如下操作:[0009]a)獲取系統(tǒng)調用表;[0010]b)編寫自定義函數(shù);[0011]c)用所述自定義函數(shù)的地址替換所述系統(tǒng)調用表里面的系統(tǒng)調用函數(shù);[0012]d)通過所述自定義函數(shù)獲取相關進程信息;[0013]e)編寫Netlinksocket通信模塊,用于將所述相關進程信息傳遞給應用層;[0014]S2.在步驟Sl編寫的內核模塊中,通過hook方法實現(xiàn)對系統(tǒng)調用函數(shù)的替換;[0015]S3.將步驟Sl編寫的內核模塊加載到內核中去,實現(xiàn)對替換調用函數(shù)的攔截,攔截得到調用函數(shù);[0016]S4.設定監(jiān)控目標,包括設定敏感數(shù)據(jù)和操作,判斷攔截得到的調用函數(shù)是否對所述設定的敏感數(shù)據(jù)進行了設定操作;當發(fā)生有所述設定時,記錄調用函數(shù)操作的進程信息,再執(zhí)行步驟S5;當沒有發(fā)生所述設定操作時,結束操作;[0017]S5.通過內核模塊編寫的NetlinkSocket通信功能,將所述記錄的調用函數(shù)操作的進程信息傳遞給上層接收程序,形成日志文件。[0018]針對上述針對Android系統(tǒng)App行為的監(jiān)控方法,進一步地,步驟Sl的e)中,所述通信模塊米用LinuxAPIhook、Inlinehook和Netlinksocket通信中的一種。在本發(fā)明實施例中,所述通信模塊采用Netlinksocket通信。[0019]針對上述針對Android系統(tǒng)App行為的監(jiān)控方法,進一步地,步驟S2所述hook方法具體包括:首先編寫自定義函數(shù);再通過將自定義函數(shù)的地址替換系統(tǒng)調用函數(shù)的地址,實現(xiàn)對系統(tǒng)調用函數(shù)的替換;所述系統(tǒng)調用函數(shù)的地址通過步驟Sl獲取的系統(tǒng)調用表得到。[0020]所述hook方法具體通過使用Linuxhookapi和inlinehook對系統(tǒng)調用進行處理,實現(xiàn)對系統(tǒng)調用函數(shù)的替換。[0021]所述系統(tǒng)調用表地址的獲取具體是通過代碼來模仿swi中斷,在中斷過程中將系統(tǒng)調用表的地址放入tbl寄存器中,由此獲得所述系統(tǒng)調用表地址。所述自定義函數(shù)的參數(shù)列表必須和相應的系統(tǒng)調用函數(shù)的參數(shù)列表一致,并且在自定義函數(shù)的尾部要繼續(xù)調用所述相應的系統(tǒng)函數(shù),從而使得所述自定義函數(shù)能夠正確返回。[0022]針對上述針對Android系統(tǒng)App行為的監(jiān)控方法,進一步地,步驟S4所述調用函數(shù)操作的進程信息還包括:通過獲取所述進程的上下文而獲得的其他信息。[0023]與現(xiàn)有技術相比,本發(fā)明的有益效果是:[0024]本發(fā)明提供一種基于Android系統(tǒng)App敏感行為監(jiān)控的安全內核實現(xiàn)方法,通過在Android內核層添加模塊的方法,實現(xiàn)對整個Android系統(tǒng)的系統(tǒng)調用的攔截與監(jiān)控,從而使用戶對安裝的軟件的行為了如指掌,能夠及時發(fā)現(xiàn)軟件的惡意行為。[0025]本發(fā)明通過編寫自己的Android內核模塊,進行交叉編譯,然后將模塊加載到Android系統(tǒng)中,通過對特定的函數(shù)(如讀取通訊錄等相關信息的函數(shù))進行攔截,獲得到相應的系統(tǒng)調用信息。系統(tǒng)調用信息包括:讀取的進程(是哪個進程讀取的)等。然后將相應記錄信息返回給應用層,形成相應的日志文件。本發(fā)明提供的安全內核實現(xiàn)方法無論對應用層還是Native層產生的系統(tǒng)調用均能進行監(jiān)控,這種基于內核層的軟件調用監(jiān)控比現(xiàn)有的針對應用層的一些監(jiān)控框架如Xposed等方法,能夠保護得更加徹底,對手機的安全防護性也更強?!靖綀D說明】[0026]圖1是本發(fā)明實施例中基于Andr0id系統(tǒng)App敏感行為監(jiān)控的安全內核實現(xiàn)方法的流程框圖?!揪唧w實施方式】[0027]下面結合附圖,通過實施例進一步描述本發(fā)明,但不以任何方式限制本發(fā)明的范圍。[0028]本發(fā)明提供一種基于Android系統(tǒng)App敏感行為監(jiān)控的安全內核實現(xiàn)方法,通過在Android內核層添加模塊的方法,實現(xiàn)對整個Android系統(tǒng)的系統(tǒng)調用的攔截與監(jiān)控。具體地,通過編寫自己的Android內核模塊,進行交叉編譯,然后將模塊加載到Android系統(tǒng)中,通過對特定的函數(shù)(如讀取通訊錄等相關信息的函數(shù))進行攔截,獲得到相應的系統(tǒng)調用信息。系統(tǒng)調用信息包括:讀取的進程(是哪個進程讀取的)等。再將相應記錄信息返回給應用層,形成相應的監(jiān)控日志文件。本發(fā)明包括如下步驟:[0029]Sl.編寫內核模塊,獲取系統(tǒng)調用表地址;[0030]在編寫的內核模塊中實現(xiàn)獲取系統(tǒng)調用表地址;[0031]通過編寫的內核模塊,可進一步執(zhí)行并實現(xiàn)以下幾方面操作:[0032]f)獲取系統(tǒng)調用表;[0033]g)編寫自定義函數(shù);[0034]h)用自定義函數(shù)地址替換系統(tǒng)調用表里面的系統(tǒng)調用函數(shù);[0035]i)在自定義的函數(shù)里面獲取相關的進程信息;[0036]j)把進程信息通過自己編寫的通信模塊(采用Netlinksocket通信)傳遞給應用層;[0037]k)應用層接收相應的信息并生成日志文件。[0038]S2.在內核模塊里面通過hook技術實現(xiàn)對系統(tǒng)調用函數(shù)的替換;[0039]首先編寫自定義函數(shù);再通過將自定義函數(shù)的地址替換系統(tǒng)調用函數(shù)的地址,實現(xiàn)對系統(tǒng)調用函數(shù)的替換。[0040]其中,系統(tǒng)調用函數(shù)的地址通過步驟Sl獲取的系統(tǒng)調用表得到。[0041]S3.將步驟Sl編寫的內核模塊加載到內核中去,實現(xiàn)對替換調用函數(shù)的攔截;[0042]S4.判斷攔截下來的調用函數(shù)是否對我們設定的敏感數(shù)據(jù)進行了讀取,如有讀取則進行步驟S5,若無讀取則結束操作;[0043]S5.內核模塊通過自己編寫的通信模塊(本發(fā)明實施例采用NetlinkSocket通信),將記錄下來的調用函數(shù)操作信息傳遞給上層接收程序(應用層),并且形成相關的日志文件。[0044]上述方法的步驟S2中,內核模塊通過使用Linuxhookapi和inlinehook對相關的系統(tǒng)調用進行處理,實現(xiàn)對系統(tǒng)調用函數(shù)的替換;[0045]本發(fā)明提供的方法中米用LinuxAPIhook、Inlinehook和Netlinksocket通信技術,其中:[0046]LinuxAPIhook技術原理是Linux中的每個基本函數(shù)地址都存在于系統(tǒng)調用表中某一位置。因此,本發(fā)明通過找到系統(tǒng)調用表的首地址,然后根據(jù)Linux內核代碼替換掉對應項的函數(shù)地址,使原來的系統(tǒng)調用的函數(shù)指針指向自己編寫的函數(shù)。這樣,表面上看是在調用系統(tǒng)函數(shù),實際上是在執(zhí)行自己編寫的函數(shù)。通過在自己編寫的函數(shù)體內對系統(tǒng)調用的相關信息進行記錄,例如:進程信息以及進行的相關操作等。[0047]Inlinehook技術:與LinuxAPIhook相比,Inlinehook的原理是通過在目標函數(shù)頭部插入代碼來使其跳轉到自己設置的一個函數(shù)里,產生hook。但hook完后需要進行堆棧的恢復。對堆棧的恢復較復雜,例如,Android系統(tǒng)下的Inlinehook和Linux系統(tǒng)下的Inlinehook因為系統(tǒng)架構的不同而不同,Linux系統(tǒng)下的Inlinehook里面用到匯編指令,而Android系統(tǒng)下用到arm指令D[0048]NetIinksocket通信:NetIink是一種特殊的socket,它是Linux系統(tǒng)所特有的,類似于BSD中的AF_R0UTE,但又遠比它的功能強大,目前在最新的Linux內核(2.6.14)中使用netlink進行應用與內核通信的應用很多,Netlink是一種在內核與用戶應用間進行雙向數(shù)據(jù)傳輸?shù)姆浅:玫姆绞?,用戶態(tài)應用使用標準的socketAPI就可以使用netlink提供的強大功能,內核態(tài)需要使用專門的內核API來使用Netlink。[0049]下面通過實施例進一步來描述本發(fā)明提供方法的實施步驟:[0050]第一步,我們要獲取系統(tǒng)調用表地址,系統(tǒng)調用表里面存放著系統(tǒng)函數(shù)的調用地址,通過系統(tǒng)調用表的地址,可以獲取到系統(tǒng)函數(shù)的地址。系統(tǒng)調用表地址的獲取具體是通過代碼來模仿swi中斷,在中斷過程中系統(tǒng)會將系統(tǒng)調用表的地址放入tbl寄存器中,可通過執(zhí)行如下代碼得到獲取系統(tǒng)調用表地址:[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]第二步,我們要替換系統(tǒng)調用,本實施例對syS_〇pen函數(shù)進行分析,當應用層發(fā)生了讀文件的操作時,其在底層都會調用sys_open這個系統(tǒng)函數(shù)。本方法中,通過自己編寫函數(shù)來替換該系統(tǒng)函數(shù)。本實施例通過以下自定義函數(shù)〇ur_sys_open替換sys_open系統(tǒng)函數(shù)。自定義的函數(shù)的參數(shù)列表必須和系統(tǒng)自帶函數(shù)的參數(shù)列表一致,并且在函數(shù)尾部我們要繼續(xù)調用原系統(tǒng)函數(shù)(syS_〇pen函數(shù))保證自定義函數(shù)(〇Ur_sys_〇pen函數(shù))能夠正確返回。本實施例中,我們的自定義函數(shù)〇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]再通過下面語句進行函數(shù)替換:[0058]original_call_open=sys_call_table[-NR_open];[0059]sys_call_table[-NR_open]=our_sys_open;[0060]第三步,實現(xiàn)對替換調用函數(shù)的攔截;[0061]接下來,上述進行函數(shù)替換的語句首先把原來的函數(shù)地址進行保存,然后用自己寫的函數(shù)地址替換掉原來函數(shù)的地址。這樣,當讀文件系統(tǒng)調用發(fā)生時,系統(tǒng)就會自動調用我們的函數(shù)。[0062]第四步,判斷攔截下來的調用函數(shù)是否對我們設定的敏感數(shù)據(jù)進行了讀取,如有讀取則繼續(xù)執(zhí)行,若無讀取則結束操作;[0063]在函數(shù)體內,我們可以對該調用者的相關信息進行獲取,例如,在上面的函數(shù)體里面,我們就可以判斷這個讀函數(shù)是針對哪些文件的,是不是我們監(jiān)控的那些信息。在上述函數(shù)體中,我們可以看到是判斷其有沒有讀取手機上面的短信,若有則將其進程號記錄下來。[0064]第五步,通過自己編寫的NetlinkSocket通信,將記錄下來的調用函數(shù)操作信息傳遞給上層接收程序(應用層),并且形成相關的日志文件。[0065]實際上,我們可以通過獲取進程上下文來獲取更多信息,如通過get_CUrrent()->comm可以獲取到當前應用程序的名字,然后通過NetlinkSocket通信傳給上層,形成日志文件。[0066]現(xiàn)有的一些框架例如Xposed框架也能夠對一些信息進行攔截,但它們只能攔截應用層的一些調用,現(xiàn)在有一些木馬是直接植入在Native層的,那些框架是無法攔截到的。所以本發(fā)明方法采用這種基于內核的攔截,能夠更加徹底地保護系統(tǒng),對手機的安全防護性也更強。[0067]需要注意的是,公布實施例的目的在于幫助進一步理解本發(fā)明,但是本領域的技術人員可以理解:在不脫離本發(fā)明及所附權利要求的精神和范圍內,各種替換和修改都是可能的。因此,本發(fā)明不應局限于實施例所公開的內容,本發(fā)明要求保護的范圍以權利要求書界定的范圍為準。【主權項】1.一種針對Android系統(tǒng)App行為的監(jiān)控方法,通過安全內核實現(xiàn)方法在Android內核層添加模塊,實現(xiàn)對整個Android系統(tǒng)的系統(tǒng)調用的攔截與監(jiān)控;包括如下步驟:51.編寫內核模塊;所述編寫的內核模塊用于實現(xiàn)如下操作:a)獲取系統(tǒng)調用表;b)編寫自定義函數(shù);c)用所述自定義函數(shù)的地址替換所述系統(tǒng)調用表里面的系統(tǒng)調用函數(shù);d)通過所述自定義函數(shù)獲取相關進程信息;e)編寫Netlinksocket通信模塊,用于將所述相關進程信息傳遞給應用層;52.在步驟S1編寫的內核模塊中,通過hook方法實現(xiàn)對系統(tǒng)調用函數(shù)的替換;53.將步驟S1編寫的內核模塊加載到內核中去,實現(xiàn)對替換調用函數(shù)的攔截,攔截得到調用函數(shù);54.設定監(jiān)控目標,包括設定敏感數(shù)據(jù)和操作,判斷攔截得到的調用函數(shù)是否對所述設定的敏感數(shù)據(jù)進行了設定操作;當發(fā)生有所述設定時,記錄調用函數(shù)操作的進程信息,再執(zhí)行步驟S5;當沒有發(fā)生所述設定操作時,結束操作;S5.通過內核模塊編寫的NetlinkSocket通信功能,將所述記錄的調用函數(shù)操作的進程信息傳遞給上層接收程序,形成日志文件。2.如權利要求1所述針對Android系統(tǒng)App行為的監(jiān)控方法,其特征是,步驟S1的e)中,所述通信模塊采用Netlinksocket通信。3.如權利要求1所述針對Android系統(tǒng)App行為的監(jiān)控方法,其特征是,步驟S2所述hook方法具體包括:首先編寫自定義函數(shù);再通過將自定義函數(shù)的地址替換系統(tǒng)調用函數(shù)的地址,實現(xiàn)對系統(tǒng)調用函數(shù)的替換;所述系統(tǒng)調用函數(shù)的地址通過步驟S1獲取的系統(tǒng)調用表得到。4.如權利要求3所述針對Android系統(tǒng)App行為的監(jiān)控方法,其特征是,步驟S2所述hook方法具體通過使用Linuxhookapi和inlinehook對系統(tǒng)調用進行處理,實現(xiàn)對系統(tǒng)調用函數(shù)的替換。5.如權利要求3所述針對Android系統(tǒng)App行為的監(jiān)控方法,其特征是,步驟S2所述系統(tǒng)調用表地址的獲取具體是通過代碼來模仿swi中斷,在中斷過程中將系統(tǒng)調用表的地址放入寄存器中,由此獲得所述系統(tǒng)調用表地址。6.如權利要求3所述針對Android系統(tǒng)App行為的監(jiān)控方法,其特征是,所述自定義函數(shù)的參數(shù)列表必須和相應的系統(tǒng)調用函數(shù)的參數(shù)列表一致,并且在自定義函數(shù)的尾部要繼續(xù)調用所述相應的系統(tǒng)函數(shù),從而使得所述自定義函數(shù)能夠正確返回。7.如權利要求1所述針對Android系統(tǒng)App行為的監(jiān)控方法,其特征是,步驟S4所述調用函數(shù)操作的進程信息還包括:通過獲取所述進程的上下文而獲得的其他信息?!疚臋n編號】G06F21/56GK105844157SQ201610248733【公開日】2016年8月10日【申請日】2016年4月20日【發(fā)明人】文偉平【申請人】北京鼎源科技有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1