A large part happened in 2013 and 2014, and I don’t remember how much time that took. I first explored a more general solution for memory reading, going for pointers in general and drawing from the information of the Windows memory management to read the structures. The breakthrough came only after switching to a more specialized approach based on the structures given by CPython. I probably spent more than 100 hours on the memory reading in those years.
Back then, identifying pointers was more difficult because the EVE Online client only used 32-bit addresses. For 64-bit game clients, we have it easier because it is much less likely to have a false positive.
In December and January, I adapted the memory reading for the 64-bit EVE Online client. It looks like I spent about 55 hours on that adaption. However, that included also improvements in the overall design of the interface to account for what I learned in the last five years.
About the tools: The first step is to get the samples from the game client process: bots/guide/how-to-collect-samples-for-64-bit-memory-reading-development.md at main · Viir/bots · GitHub
That part applies as long as you want to develop memory reading, and that tool works with game clients as long as they are using 64-bit addresses.
Since the samples combine screenshots and memory contents, we can use them as input for training the algorithms to extract the interesting parts in production.
Other tools depend on the specific game.
Depends on the game. The easiest way to do interface reading sometimes does not involve memory reading at all. Whether or not to use memory reading also depends a bit on your overall strategy or what range of clients for that game you want to support.
The memory management in the EVE Online client works in a way that makes it easier to read from compared to other games. Consider, for example, how seldom we see locations of memory blocks for live objects change. Compare that to compacting heaps. In general, more optimization in memory management leads to more complexity when extracting relevant information.
The bot for Elvenar is an example where image processing worked well and required less effort than memory reading.
Another example: In Tribal Wars 2, we use an interface to the Javascript engine to read from the game and also to send inputs. We send javascript snippets to execute in the context of the page, and via return values, we can get information out. This approach means we never see the complexity of how the information is mapped into the flat memory somewhere in a heap.
For games in general, the tutorial is this: Step one: Choose a game you want to start with. Step two: Get a tutorial for that specific game.