Reverse Engineering

I've loved reverse engineering since I was a kid. Taking toys and electronics apart, seeing how they work, putting them back together [hopefully] in working order. When it comes to computers, it's the same mentality as with everything else:

Reverse Engineering (reversing) is the process of deconstructing the target, probing the target, connecting various aspects of knowledge all with some relation to the target, and using this knowledge to piece together the functionality of the target's components in order to obtain a full understanding of the target (or at least enough understanding in order to achieve the goal). This applies to everything; it's part of the scientific process.

Rather than focus on the limbic system of a moose, I'd like to turn toward software and what it takes to reverse it. One issue with reversing software is that there are many different platforms. Even just within Windows you could encounter x86 (plus Intel 64, AMD64, and other 64-bit architectures) assembly, .NET, Java, Python, Perl, Ruby, and SQL, plus web languages such as HTML, PHP, Javascript, ASP, Flash, and many more. Individual software programs can seem like platforms in and of themselves; custom, proprietary file formats can be as complex to learn and decipher as a new language. I didn't even mention Networking, and encryption technology slaps layers on top of existing platforms. The point is that the list goes on and will continue to go on as new platforms are created.

My intent is to compile information useful to software reversing and reversing in general. I do have a passion for hardware and electronics, and hope I can learn to experiment with hardware hacking down the road, but since most complex hardware today requires software manipulation I see software as a proper precursor.

I see Intel architecture as a good focus because of its prevalence in technology, but I would like experience with other platforms, such as ARM, Blackberry, VMs like Java and .NET, and anything else I can get my e-hands on.