// Ġ ĠCopyright Ġ( c ) Ġ 2 0 2 1 , ĠCommon we alth Ġof ĠA ustralia . Ġv ds . support @ df at . gov . au Ċ // Ċ // Ġ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ġyou Ġmay Ġnot Ċ // Ġ Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . ĠYou Ġmay Ġobtain Ġa Ġcopy Ċ // Ġ Ġof Ġthe ĠLicense Ġat : Ċ // Ċ // ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ // Ċ // Ġ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ // Ġ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT Ċ // Ġ ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . ĠSee Ġthe Ċ // Ġ ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ġlimitations Ċ // Ġ Ġunder Ġthe ĠLicense . Ċ Ċ package Ġau . gov . df at . lib . v dsn cc heck er . security Ċ Ċ import Ġandroid . app . Activity Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . Application Info Ċ import Ġjava . io . File Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Debug Ċ import Ġau . gov . df at . lib . v dsn cc heck er . R Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . Exception Ċ import Ġjava . lang . Number FormatException Ċ import Ġjava . util .* Ċ import Ġjava . util . zip . Zip Entry Ċ import Ġjava . util . zip . Zip File Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . HashMap ĊĊ Ċ private Ġconst Ġval Ġsu : String Ġ= Ġ" su " Ċ private Ġconst Ġval Ġbusy Box : String Ġ= Ġ" busybox " Ċ private Ġconst Ġval Ġmax Services : Int Ġ= Ġ 3 0 0 ĊĊ Ċ /** Ċ Ġ* Ċ Ġ* Ġclass Ġfor Ġmanaging Ġsecurity Ġfunctions , Ġsuch Ġas ĠRoot Ġdetection Ċ Ġ* Ċ Ġ*/ Ċ open Ġclass ĠSecurity Manager ( private Ġval Ġcontext : ĠContext ? Ġ= Ġnull ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġinit { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġload Ġcpp Ġlibrary ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . load Library (" v dsn cc heck er ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġrun Ġexternal Ġchecks Ġ( Ġcpp Ġ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġint ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrun External Tests (): ĠHashMap < String , ĠInt >{ ĊĊĠĠĠĠĠĠĠ Ġval Ġanti Debug Ġ= Ġ" anti Debug " ĊĠĠĠĠĠĠĠ Ġval Ġpath Check Ġ= Ġ" path Check " ĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġresults Ġto Ġfailure ĊĠĠĠĠĠĠĠ Ġvar Ġresults Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( anti Debug , Ġ- 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( path Check , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanti Debug () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults [ path Check ] Ġ= Ġpath Check () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults [ anti Debug ] Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresults ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch (_ : ĠException ) ĊĠĠĠĠĠĠĠ Ġ{} ĊĠĠĠĠĠĠĠ Ġ// Ġreturn Ġfailure Ġresults Ġif Ġthis Ġis Ġreached ĊĠĠĠĠĠĠĠ Ġreturn Ġresults ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġrun Ġall Ġnon - external Ġdebug Ġchecks ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠHashMap Ġof Ġresults , Ġnamed Ġafter Ġthe Ġmethods Ġthat Ġare Ġcalled ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrun All Checks (): ĠHashMap < String , ĠAny >{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġresult Ġcontainer ĊĠĠĠĠĠĠĠ Ġvar Ġresults Ġ= Ġhash Map Of < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġresults [" running Processes "] Ġ= Ġcheck Running Processes () ĊĠĠĠĠĠĠĠ Ġresults [" check Root "] Ġ= Ġcheck Root () ĊĠĠĠĠĠĠĠ Ġresults [" is Test Key Build "] Ġ= Ġis Test Key Build () ĊĠĠĠĠĠĠĠ Ġresults [" is Debugger Connected "] Ġ= Ġis Debugger Connected () ĊĊĠĠĠĠĠĠĠ Ġif ( context Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults [" check Installed Apps "] Ġ= Ġcheck Installed Apps (). any () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults [" isDebug gable "] Ġ= Ġis Debug gable () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrc String Ġ= Ġcontext . getString ( R . string . dex _ crc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! crc String . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrc Long Ġ= Ġcrc String . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults [" crc Check "] Ġ= Ġcrc Is Modified ( crc Long ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch (_ : ĠNumber FormatException ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnot Ġvalid ĠCRC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch (_ : ĠException ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresults ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġdetect Ġslow Ġdown Ġdue Ġto Ġdebugger Ġbeing Ġconnected ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdetect _ thread Cpu Time Nan os (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠDebug . thread Cpu Time Nan os () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 9 9 9 9 9 9 ) Ġcontinue ĊĠĠĠĠĠĠĠ Ġval Ġstop Ġ= ĠDebug . thread Cpu Time Nan os () ĊĠĠĠĠĠĠĠ Ġreturn Ġstop Ġ- Ġstart Ġ>= Ġ 1 0 0 0 0 0 0 0 ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġsuper Ġuser Ġnames Ġto Ġlook Ġout Ġfor ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġval Ġsuper Users : ArrayList < String > Ġ= Ġarray ListOf (" sup ers u ", Ġ" superuser ") ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġdirectories Ġto Ġcheck Ġfor ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġval Ġlocations : ArrayList < String > Ġ= ĊĠĠĠĠĠĠĠ Ġarray ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ sbin /", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ system / bin /", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ system / bin / fails afe /", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ system / x bin /", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ system / sd / x bin /", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ data / local /", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ data / local / x bin /", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ data / local / bin /" ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġwords Ġto Ġlook Ġout Ġfor Ġin Ġne far ious Ġpackages ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġval Ġpackage Words : ArrayList < String > Ġ= ĊĠĠĠĠĠĠĠ Ġarray ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" chain fire ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" nos hu fo u ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ko ush ik dut ta ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" z ach sp ong ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" temp root remove jb ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ram d roid ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" app qu ar ant ine ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" top john wu ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" mag isk ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" third party ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" busybox " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġcheck Ġrunning Ġprocesses Ġfor Ġanything Ġrun Ġby Ġsuper Ġusers ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġboolean Ġrepresenting Ġif Ġsu Ġis Ġrunning Ġanything ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck Running Processes (): Boolean { ĊĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġcontext ?. getSystem Service ( Context . ACTIVITY _ SERVICE ) Ġas ĠActivity Manager ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ// Ġcannot Ġcheck , Ġno Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġcurrently Ġrunning Ġapplication Ġprocesses ĊĠĠĠĠĠĠĠ Ġ@ SuppressWarnings (" deprecation ") ĊĠĠĠĠĠĠĠ Ġval Ġlist : ĠList < Activity Manager . Running Service Info > Ġ= Ġmanager . get Running Services ( max Services ) ĊĠĠĠĠĠĠĠ Ġif Ġ( list . count () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Name : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġlist . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Name Ġ= Ġlist [ i ]. process ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper Users . contains ( temp Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġcheck Ġif Ġroot Ġsu Ġdirectory Ġexists ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġboolean Ġrepresenting Ġif Ġa Ġ' su ' Ġlabel led Ġdirectory Ġexists ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck Root (): ĠBoolean { ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠSystem . getenv (" PATH ") ĊĠĠĠĠĠĠĠ Ġif ( dir Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( path Dir Ġin Ġdir . split (": "). to Typed Array ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( File ( path Dir , Ġsu ). exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġcheck Ġfor Ġtest - keys Ġflag ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġboolean Ġrepresenting Ġif Ġbuild Ġtags Ġcontain Ġtest - keys ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Test Key Build (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstr Ġ= ĠBuild . TAGS ĊĠĠĠĠĠĠĠ Ġreturn Ġstr Ġ!= Ġnull Ġ&& Ġstr . contains (" test - keys ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġcheck Ġpackages Ġfor Ġany Ġknown Ġev il Ġknown Ġnames ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠArrayList Ġof Ġfound Ġapps Ġinstalled Ġthat Ġmatch Ġany Ġof Ġthe Ġlisted Ġwords Ġto Ġcheck Ġfor ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Installed Apps (): ĠArrayList < String >{ ĊĠĠĠĠĠĠĠ Ġvar Ġfound List : ArrayList < String > Ġ= Ġarray ListOf () ĊĠĠĠĠĠĠĠ Ġvar Ġpackage Manager Ġ= Ġcontext ?. package Manager ĊĠĠĠĠĠĠĠ Ġif ( package Manager Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcannot Ġuse , Ġno Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġarray ListOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġpackage Manager . get Installed Packages ( 0 ) ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġlist . indices ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinfo Ġ= Ġlist [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( info . application Info . flags Ġand ĠApplication Info . FLAG _ SYSTEM Ġ== Ġ 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġinfo . application Info . load Label ( package Manager ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Words . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( name . contains ( it )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound List . add ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfound List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġchecks Ġapplication Ġflags Ġif Ġdebugging Ġis Ġallowed ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġboolean Ġrepresenting Ġif Ġcan Ġdebug ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Debug gable (): ĠBoolean { ĊĠĠĠĠĠĠĠ Ġif ( context Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ(( context . application Context . application Info . flags Ġand ĠApplication Info . FLAG _ DEBUG G ABLE ) Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġcheck Ġif ĠJava Ġdebugger Ġis Ġconnected ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġboolean Ġrepresenting Ġif Ġdebugger Ġis Ġconnected ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Debugger Connected (): ĠBoolean { ĊĠĠĠĠĠĠĠ Ġreturn ĠDebug . is Debugger Connected () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġcheck Ġcrc Ġstring Ġbased Ġon Ġthe Ġcrc Ġof Ġthe Ġclasses . dex Ġfile ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġde xC rc Ġ- Ġthe Ġcrc Ġof Ġthe Ġclasses . dex Ġfile ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġboolean Ġrepresenting Ġwhether Ġthe Ġclasses . dex Ġis Ġmodified Ġor Ġnot ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcrc Is Modified ( dex Crc : ĠLong ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif ( context Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ; ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġmodified Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ// Ġrequired Ġdex Ġcrc Ġvalue Ġstored Ġas Ġa Ġtext Ġstring . ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġcould Ġbe Ġany Ġinvisible Ġlayout Ġelement ĊĠĠĠĠĠĠĠ Ġval Ġz f Ġ= ĠZip File ( context . package Code Path ) ĊĠĠĠĠĠĠĠ Ġval Ġze : ĠZip Entry Ġ= Ġz f . getEntry (" classes . dex ") ĊĠĠĠĠĠĠĠ Ġmodified Ġ= Ġze . crc Ġ!== Ġde xC rc ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmodified ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġkill Ġany Ġanti Ġdebug Ġmonitor Ġthread Ġthat Ġcurrently Ġexists ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ!! Ġshould Ġbe Ġcalled Ġwhen Ġan Ġactivity Ġpause s / dest ro ys Ġ!! ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġkill Existing Anti Debug (){ ĊĠĠĠĠĠĠĠ Ġkill Anti Debug () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġbelow Ġare Ġreferences Ġto Ġcpp Ġfunctions ĊĊĠĠĠ Ġ@ Jvm Name (" ad ") ĊĠĠĠ Ġprivate Ġexternal Ġfun Ġanti Debug ( log Out : ĠBoolean Ġ= Ġis Debug gable ()) ĊĊĠĠĠ Ġ@ Jvm Name (" b ") ĊĠĠĠ Ġprivate Ġexternal Ġfun Ġpath Check (): ĠInt ĊĊĠĠĠ Ġ@ Jvm Name (" kill anti ") ĊĠĠĠ Ġprivate Ġexternal Ġfun Ġkill Anti Debug () ĊĊĊ Ċ }