I found myself in a weird situation: a long long time ago, I wrote a java application that I didn't touch nor ran for a few years. Today, I found it on a backup and wanted to run it again (its a graphical application for generating HTML pages). However, it failed in a particular feature. Not with an exception or stack trace, just functionally. Now, I have the source code at hand, so I look into the code and find the logical error. Below is a snippet of it:
if (myHandler != null) {
int i = startValue + maxRange;
for (int j = endValue; j > i; j--) {
... (do some logic)
}
}
It doesn't matter what the code is supposed to do, but from what I can
remember, I shouldn't be adding maxRange to the i variable (yet - as
I do that later in the code). But instead of setting up the java
development environment, emerging the IDE etc. I decided to just edit
the class file directly using dhex (a wonderful utility I recently
discovered) because doing things the hard way is sometimes fun as well.
So I ran javap -c MyClass to get some java bytecode information from
the method, which gives me:
8: ifnull 116
11: iload_2
12: iload_3
13: iadd
14: istore 5
16: iload_2
17: istore 6
19: iload 6
21: iload 5
23: if_icmpge 106
I know lines 11 and 12 is about pushing the 2nd and 3rd arguments of the
function (which are startValue and maxRange) to the stack to add
them (line 13). To remove the third argument, I can change this opcode
from 1d (iload_3) to 03 (iconst_0). This way, zero is added and
the code itself just continues as needed. And for some reason, that
seems to be the only mistake I made then because the application now
works flawlessly.
Hacking is fun.