Some of you may already know this, but for a couple years I ran a website called ShadowTeq.com. Through this website, I sold a program, called EverHarvest, that was used to automate the arduous task of harvesting raw materials for crafting in the game EverQuest 2. EverHarvest had a decent-sized userbase. At the height of its popularity, I had almost 500 active subscribers using the software.
I used some pretty aggressive mechanisms to achieve this automation. Almost every data point that the software required for this automation was gathered via reading their values directly from the game’s memory. Where this wasn’t possible, I used machine code injection to force the EQ2 process to reveal the information I needed. Other means were also employed – log file parsing, screen-scraping pixel locations for certain colors, etc. It was fairly sophisticated, and did what it was supposed to do very well, when it worked.
One of the consequences of using memory hacking techniques for this purpose is that, whenever Sony changed their game, all the known memory locations would change as well. This happened rather infrequently, and took between a couple hours to several days to find the new memory locations. Occasionally I had to rewrite the assembly code my process injected, when the target functions changed. This wasn’t always a difficult process, but I frequently dropped the ball, and put off updating the software after a patch. Sometimes this was for practical purposes – quite often, when Sony would release one patch, they’d release another within a day, and then another – usually quick bug fixes for a previous patch. The result, however, is that I’d frequently have to completely restart my work when this would happen, and this pattern was frustrating.
Other times, I was simply lazy, or busy, or forgetful. To combat this, I wrote a memory scanner, pointer finder, and code injection helper – tools that made performing these updates extremely simple and not time consuming. My workload went from several hours to days, to maybe 30 minutes of letting the code run, with some manual steps at the end that took a few minutes. Alas, this work was done too late to be terribly useful, as several months ago Sony implemented anti-cheat detection code that resulted in my account being banned from the game. I spent months, on and off, trying to figure out how to get around the game’s protection. I never did figure this out, and eventually threw in the towel. EverHarvest was officially dead.
The response to this news from my users was largely unremarkable. Most of them had left during the downtime, and the ones who remained did so, I think, largely out of a desire to see things return to normal. Sadly, that will never happen, as I posted on the ShadowTeq home page (shortly after removing all the content it once held). The problem is simple: I don’t have the skill to defeat the protection. Sony won, at least against small-time hackers like myself. I hear there are other programs out there that have had much greater success.
Recently, I’ve been having talks with one of my customers. During the period of instability and downtime, he and I briefly considered a sale of the ShadowTeq brand, but nothing much came of that idea since the software had tanked and the users were leaving. There was no value in it anymore, especially now that I can’t keep it working even if I wanted to. However, talking with him has sort of reignited my interest in the project, and we’ve been considering ways to make the software function without using any memory hacking or code injection techniques.
This is where I am now. No code has been written, no work has been done other than talking about a potential future version that would require no post-patch updating. We’ve already come up with some ideas, and I’m getting to the point where I have some proofs of concept to build.
No good story is without conflict, and here’s where it comes in: I’ve done this before. I’ve made these programs before, built an online business around them, succeeded, then failed miserably, and ruined my reputation in the process. There’s no way to make true amends to these people who expected a working program and got, well, a sometimes working program. Why am I even considering trying to start doing this again? How can I possibly hope to regain those peoples’ confidence? I don’t know. And I don’t know if I want to try or not.
I may not have a choice, however – game automation is a talent of mine (I built successful bots for UO, Vanguard, EQ1, and EQ2), and soon I’m going to need to lean on my talents very hard in order to keep ends meeting. I guess I have some thinking to do.