there are only a handful of anti-cracking techniques for android, at least that i know of. this seems to be because of how android apps must behave. they must operate inside their own virtual machine and are not allowed to store permenent data. when they are uninstalled, they must remove all traces of themselves. this makes things like timed trials difficult to implement because a simple reinstall will reset timers.
if an app wants to prevent cracking, it only has a few options. it can check file properties of the apk such as file size, last modified date and signature. it could also check the installer package name to test if it was installed via market. a cracker or pirate would install via adb, not market. antilvl can already hook and subvert signature checks. file size, last modified and installer package hooking are in the works. :D
this is what a installer package check may look like in java:
but there's another way to perform any check in a more clever way that makes detection more difficult... by using java reflection. instead of calling the method directly, the app could use reflection to store the method in a variable and call it later indirectly. this makes searching for the direct method call difficult. it also allows the method name to be obfuscated since it is just a strong. let me show you in code what it may look like:
the next lesson in way of the android cracker will cover all anti-cracking techniques i know in detail, and antilvl will support these types of checks soon, but this is enough for anyone to figure it out. :D
for some more information on reflection:
Using Java Reflection
Java programming dynamics, Part 2: Introducing reflection
if an app wants to prevent cracking, it only has a few options. it can check file properties of the apk such as file size, last modified date and signature. it could also check the installer package name to test if it was installed via market. a cracker or pirate would install via adb, not market. antilvl can already hook and subvert signature checks. file size, last modified and installer package hooking are in the works. :D
this is what a installer package check may look like in java:
private boolean InstalledFromMarketEasy() { String pname = this.getPackageName(); PackageManager pm = this.getPackageManager(); String installPM = pm.getInstallerPackageName(pname); if ( installPM == null ) { // Definitely not installed from Android Market return false; } else if ( installPM.equals("com.google.android.feedback") ) { // Installed from the Android Market return true; } return false; }
but there's another way to perform any check in a more clever way that makes detection more difficult... by using java reflection. instead of calling the method directly, the app could use reflection to store the method in a variable and call it later indirectly. this makes searching for the direct method call difficult. it also allows the method name to be obfuscated since it is just a strong. let me show you in code what it may look like:
const-class v1, Landroid/content/pm/PackageManager; # do not assume this will not always be a plain text # it could be put together in a much more complicated way such as building character by character using ascii codes # you'll have to hook reflection methods to test the name or figure it out manually const-string v2, "getInstallerPackageName" # make array of size 1 const/4 v3, 0x1 new-array v3, v3, [Ljava/lang/Class; const/4 v4, 0x0 const-class v5, Ljava/lang/String; # store String class in array v3, at index v4 (0) aput-object v5, v3, v4 # get method of name v2 ("getInstallerPackageName") and move to v0 # http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getMethod(java.lang.String, java.lang.Class...) invoke-virtual {v1, v2, v3}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method; move-result-object v0 # do something with v0, like store in class variable # .... # and then sometime later, somewhere else in code # get the package manager and store in v1 invoke-virtual {p0}, Lcom/clever/app/Main;->getPackageManager()Landroid/content/pm/PackageManager; move-result-object v1 const/4 v2, 0x1 new-array v2, v2, [Ljava/lang/Object; const/4 v3, 0x0 invoke-virtual {p0}, Lcom/clever/app/Main;->getPackageName()Ljava/lang/String; move-result-object v4 # put package name in array v2 at index v3 (0) aput-object v4, v2, v3 # actually call "getInstallerPackageName" with the array we built as parameters # which contains this package name # http://download.oracle.com/javase/1.5.0/docs/api/java/lang/reflect/Method.html#invoke%28java.lang.Object,(java.lang.Object...) invoke-virtual {v0, v1, v2}, Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; move-result-object v0 check-cast v0, Ljava/lang/String; # clever to not use any type of full string, just "goog" # remember the full string is expected to be "com.google.android.feedback" const-string v1, "goog" invoke-virtual {v0, v1}, Ljava/lang/String;->indexOf(Ljava/lang/String;)I move-result v0 # check to see if v0 has the correct value. if not... error :D
the next lesson in way of the android cracker will cover all anti-cracking techniques i know in detail, and antilvl will support these types of checks soon, but this is enough for anyone to figure it out. :D
for some more information on reflection:
Using Java Reflection
Java programming dynamics, Part 2: Introducing reflection
Hi,
ReplyDeleteFor me, pm.getInstallerPackageName(pname) always returns null... And I don't understand why you check if installPM.equals("com.google.android.feedback") to know if the app is installed from the Android Market. Indeed, what we want to know is if the name of the apk file has been changed, not if the package name has been changed (has no reason to change). I would appreciate if you could do some clarification and send an email to me once you have updated this article. Thanks.
Regis, i will answer here for all. this method is, of course, a partial solution, at best. some phones always show null, and the market name is different depending on what market was used.
ReplyDeletethe apk is given a name automatically by the system based on the package name, so checking to see if it has been renamed is not possible. it's also not possible to check at install time.
you could always do size/crc/md5 checks of classes.dex, which i plan to make a post about.
Wonderful article .worth reading .Thank you for sharing.
ReplyDeleteDownloaded files not working on android
Your article is detailed, thanks to it I solved the problem I am entangled.
ReplyDeleteI will regularly follow your writers and visit this site daily.
Great Article..Thanks for the sharing..
ReplyDeleteBigo live is a GooD APK.Connect friends.
Install the application here.....
Bigo Live App
**SELLING SSN+DOB FULLZ**
ReplyDeleteCONTACT
Telegram > @leadsupplier
ICQ > 752822040
Email > leads.sellers1212@gmail.com
>>1$ each without DL/ID number
>>2$ each with DL
>>5$ each for premium (also included relative info)
*Will reduce price if buying in bulk
*Hope for a long term business
FORMAT OF LEADS/FULLZ/PROS
->FULL NAME
->SSN
->DATE OF BIRTH
->DRIVING LICENSE NUMBER WITH EXPIRY DATE
->COMPLETE ADDRESS
->PHONE NUMBER, EMAIL, I.P ADDRESS
->EMPLOYMENT DETAILS
->REALTIONSHIP DETAILS
->MORTGAGE INFO
->BANK ACCOUNT DETAILS
>Fresh Leads for tax returns & w-2 form filling
>Payment mode BTC, ETH, LTC, PayPal, USDT & PERFECT MONEY
''OTHER GADGETS PROVIDING''
>SSN+DOB Fullz
>CC with CVV
>Photo ID's
>Dead Fullz
>Spamming Tutorials
>Carding Tutorials
>Hacking Tutorials
>SMTP Linux Root
>DUMPS with pins track 1 and 2
>Sock Tools
>Server I.P's
>HQ Emails with passwords
Email > leads.sellers1212@gmail.com
Telegram > @leadsupplier
ICQ > 752822040
THANK YOU
Very crreative post
ReplyDelete