Excellent source of info on UO client internals
Posted: Wed May 02, 2012 12:00 pm
Check out the UOAI project:
http://code.google.com/p/uoai/
Artaxerxes and I tossed some ideas back and forth and both started our projects around the same time. We ended up taking different routes. He went hardcore into client internals, I moved away from that and focused more on packets. He reversed the holy heck out of the client and his code is a wealth of information.
I just learned some interesting stuff about my code while looking at UOAI source tonight. I have a kind of brute force way of reversing the client and didn't really understand the underlying objects when I wrote my code years ago. For instance, I knew from debugging the client I needed to have ECX register point to a "magic" value in memory in order to send packets the same way the client does. I didn't know why at the time, I just figured out how to get that value and made sure my inlined ASM set ECX properly. From looking at UOAI source I now know it's because that "magic" value is a C++ class object and the function I'm calling is a member function using "thiscall" calling convention. ECX is a pointer to the parent object required with "thiscall".
http://code.google.com/p/uoai/
Artaxerxes and I tossed some ideas back and forth and both started our projects around the same time. We ended up taking different routes. He went hardcore into client internals, I moved away from that and focused more on packets. He reversed the holy heck out of the client and his code is a wealth of information.
I just learned some interesting stuff about my code while looking at UOAI source tonight. I have a kind of brute force way of reversing the client and didn't really understand the underlying objects when I wrote my code years ago. For instance, I knew from debugging the client I needed to have ECX register point to a "magic" value in memory in order to send packets the same way the client does. I didn't know why at the time, I just figured out how to get that value and made sure my inlined ASM set ECX properly. From looking at UOAI source I now know it's because that "magic" value is a C++ class object and the function I'm calling is a member function using "thiscall" calling convention. ECX is a pointer to the parent object required with "thiscall".