Making better software by hacking others.

This is a case for reverse-engineering. An excuse to peek under the covers of other peoples software and dig into the logic or sometimes lack there of to improve how you make software. 

Life, like software, is a game of incomplete information. Poker has taught me to appreciate that, that one can really never know the state of all of the variables, so it's best to make your decisions with the data that you have. But what if you could have more data? Be more informed? Be better equipped to make decisions?

But how?

Cheat? No, I'm not advising breaking into someones github and cloning their projects. Stealing their source code and making copy-pasta. That is wholly unethical. 

But in poker there is the concept of "The Angle" 

 

Angle (verb): An action that isn’t against the rules, but still incorporates unfair tactics. A maneuver, usually on the border between legality and illegality (but usually clearly unethical), to take unfair advantage of another player.
— Poker News

In poker it's tricking a human into doing something that gives you an unfair advantage, that is a bullshit move. I've fallen for the traps laid out by unethical poker players and it feels really poopy. Again, I'm not arguing with doing something that compromises the ethics of a human, but I'll be damned if I don't love tricking computers.  And that is what I am advocating for.

How does one "shoot an angle" in software? Well there are a couple ways, but the easiest is to attempt to peek at what others are doing, trick the computer into doing stuff it's not meant to, or placing a trap of logic to ensnare a bit of functionality.

Reverse engineers are great at it, and we love playing tricks on our devices. So first you must be comfortable with the concept that you're doing something the original developer didn't mean for you to do. If that bugs you, then this isn't the article for you, but, I must reiterate, software is a game of information, those with the most are most likely to succeed. Know that you are inherently limiting yourself. 

I've been rooting and jailbreaking mobile devices for as long as that has been a possibility, I've made a name for myself on that fact, it's awesome, it's advanced my career, permitted me to speak at great conferences, figure out secrets about devices that aren't even shipped yet, and allowed me to further develop my understanding of this so called "computer science". 

But that is my path, and I can understand the umbrage taken at people who upset that hierarchy. But I argue that if I buy something, it's mine to do with it as i please, to take it apart, solder it, hack it, break it, fix it, or make it into something else.

So, I'm not going to go into the full explanations on how to hack, that is too long a post to even begin to start, but I am going to ask you to try these thought experiments. They are based on the assumption that you have FULL control of your property, without restriction (meaning you've at least jailbroken, rooted, or have admin access).

  • Does this thing talk to the outside world somehow?
  • Do I know what this thing does when I press [insert action here]?
  • What happens if I halt a process mid-way though? 
  • Can I see how this thing talks to the outside?
  • Can I create unexpected behavior? 

A fun combination of the these methods can lead to interesting results. The learnings that come from these experiments will make you a better developer, even if you are just looking to thwart someone like me.