Reverse Engineering for Beginners

(avery) #1

CHAPTER 54. JAVA CHAPTER 54. JAVA


iload_0loads the first function argument (a),iload_2—second (b). Here is the stack after the execution of both instruc-
tions:


+---+
TOS ->| b |
+---+
| a |
+---+


iaddadds the two values and leaves the result atTOS:


+--------+
TOS ->| result |
+--------+


Let’s extend this example to thelongdata type:


public static long lsum(long a, long b)
{
return a+b;
}

...we got:


public static long lsum(long, long);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=4, locals=4, args_size=2
0: lload_0
1: lload_2
2: ladd
3: lreturn

The secondlloadinstruction takes the second argument from the 2nd slot. That’s because a 64-bitlongvalue occupies
exactly two 32-bit slots.


Slightly more complex example:


public class calc
{
public static int mult_add(int a, int b, int c)
{
return a*b+c;
}
}


public static int mult_add(int, int, int);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=3
0: iload_0
1: iload_1
2: imul
3: iload_2
4: iadd
5: ireturn

The first step is multiplication. The product is left at theTOS:


+---------+
TOS ->| product |
+---------+


iload_2loads the third argument (c) in the stack:


+---------+
TOS ->| c |
+---------+
| product |
+---------+


Now theiaddinstruction can add the two values.

Free download pdf