1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Dalvik & Smali Tutorial

Discussion in 'Tutorials' started by Duelist, Jul 30, 2016.

  1. Duelist

    Duelist Multi accounter

    Jul 17, 2016
    Likes Received:
    Guide to understanding smali & Dalvik opcodes by lohan+ (creator of AntiLVL)

    Source:android cracking: example.smali

    # class name, also determines file path when dumped
    .class public Lcom/packageName/example;
    # inherits from Object (could be activity, view, etc.)
    # note class structure is L<class path="">;
    .super Ljava/lang/Object;
    # original java file name
    .source "example.java"
    # these are class instance variables
    .field private someString:Ljava/lang/String;
    # finals are not actually used directly, because references
    # to them are replaced by the value itself
    # primitive cheat sheet:
    # V - void, B - byte, S - short, C - char, I - int
    # J - long (uses two registers), F - float, D - double
    .field public final someInt:I # the :I means integer
    .field public final someBool:Z # the :Z means boolean
    # Do you see how to make arrays?
    .field public final someCharArray:[C
    .field private someStringArray:[Ljava/lang/String;
    # this is the <init> of the constructor
    # it calls the <init> of it's super, which in this case
    # is Ljava/lang/Object; as you can see at the top
    # the parameter list reads: ZLjava/lang/String;I
    # Z - boolean
    # Ljava/lang/String; - java String object
    # (semi-colon after non-primitive data types)
    # I - integer
    # (no semi-colon)
    # also notice this constructor returns V, which means void
    .method public constructor <init>(ZLjava/lang/String;I)V
    # declare how many variable spaces we will need
    # we can have: v0, v1, v2, v3, v4 and v5 as variables.
    # smali/baksmali by default uses .registers
    # but you can change this by using --use-locals
    # apktool uses --use-locals and --sequential-labels
    .locals 6
    # these are not always present and are usuaully taken
    # out by optimization/obfuscation but they tell us
    # the names of Z, Ljava/lang/String; and I before
    # when it was in Java
    .parameter "someBool"
    .parameter "someInt"
    .parameter "exampleString"
    # the .prologue and .line directives can be mostly ignored
    # sometimes line numbers are useful for debugging errors
    .line 10
    # p0 means parameter 0
    # p0, in this case, is like "this" from a java class.
    # we are calling the constructor of our mother class.
    # what would p1 be?
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
    # store string in v0
    const-string v0, "i will not fear. fear is the mind-killer."
    # store 0xF hex value in v0 (or 15 in base 10)
    # this destroys previous value string in v0
    # variables do not have types they are just registers
    # for storing any type of value.
    # hexadecimal is base 15 is used in all machine languages
    # you normally use base 10
    # read up on it:
    # Hexadecimal - Wikipedia, the free encyclopedia
    const/4 v0, 0xf
    # create instance of StringBuilder in v1
    new-instance v1, Ljava/lang/StringBuilder;
    # initialize StringBuilder with v2
    # notice it returns V, or void
    const-string v2, "the spice must flow"
    invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
    # append p1, which is our first paramater and is boolean
    # therefore we use append(Z)
    # notice how append returns a StringBuilder
    invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;
    # use move-result-object to store previous result in v1
    move-result-object v1
    # non-objects use move-result or move-result-wide
    # append v2 to our StringBuilder
    # notice how this append takes a string and not Z
    const-string v2, "some random string"
    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    move-result-object v1
    # call toString() on our StringBuilder
    # if you use Java you know that most objects have toString()
    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
    move-result-object v1
    # send our new string to the log.
    # this can be used to debug and can be picked up with ddms, logcat
    # or log collector. as an exercise look up what the d() function does
    # in the android developer documentation.
    const-string v0, "Tag"
    invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
    move-result v0
    # get the current time in milliseconds
    # J denotes a float or wide return value
    invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
    move-result-wide v2
    # note!! since it is a wide value, it takes up v2 AND v3
    # so we must use v4 next
    # try to reuse variables if possible.
    const-wide/16 v4, 0x300 # this takes up v4 and v5
    div-long/2addr v2, v4 # divide v2 by v4
    long-to-int v2, v2 # convert v2 to an integer
    # since i wrote this in my head, there was no Java
    # compiler to add the .line's in the right places
    # but normally they would relate to actual Java lines
    # these are often removed with proguard optimization
    .line 12
    # store p1 as an instance variable (someBool) for this class
    # in java this may look like this.someBool = p1;
    iput-boolean p1, p0, Lcom/packageName/example;->someBool:Z
    .line 14
    # do the same for p3 and someInt
    iput p3, p0, Lcom/packageName/example;->someInt:I
    # get the value from p0.someInt
    iget v0, p0, Lcom/packageName/example;->someInt:I
    # now we will invoke a static method.
    # {} means empty parameters then the full package name followed by ->
    # then the method and it's return value. everything must be there.
    invoke-static {}, Lcom/packageName/example;->someMethod()Ljava/lang/String;
    # for different types of invoke-*, try this:
    # http://www.netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html
    # invoke-virtual and direct take the class instance as a first parameter.
    .line 16
    return-void # meditate on the void.
    .end method
    # try and figure this one out
    .method public static someMethod()Ljava/lang/String;
    # could i have used fewer variables?
    .locals 4
    new-instance v0, Ljava/lang/Long;
    invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
    move-result-wide v1
    invoke-direct {v0, v1, v2}, Ljava/lang/Long;-><init>(J)V
    invoke-static {v0}, Ljava/lang/String;->valueOf(Ljava/lang/Object;)Ljava/lang/String;
    move-result-object v1
    # notice use of return-object and not just return
    return-object v1
    .end method
    #1 Duelist, Jul 30, 2016
    Last edited: Jul 30, 2016
  2. Malfurion

    Malfurion The friendliest person you'll meet. Sometimes.

    Jan 27, 2016
    Likes Received:
    Please go into more detail, some users may not understand what this is.
  3. Duelist

    Duelist Multi accounter

    Jul 17, 2016
    Likes Received:
    Fixed bro , i got this much only .... It will be very useful our modder's give detail explanation
  • About Us

    Android Republic - Android Game Hacks - Offering only the most advanced and exclusive android hacks, protections like Xigncode are easily bypassed by our team.

    Exclusive Android hacks, android protections cracked, only the best available games, here you will find only the best games such as Kritika, Summoners War, Raven, Dragon Striker, Avabel, Evil Bane, 7knights and seven knights, Darkness Reborn, Soul Seeker all fully hacked and waiting for you! easy xigncode and dxshield bypass too!, way better than alpha gamers or alphagamers no need for booster or root, simple the best android cheat apk available.