Contents
- Introduction
- ZoomHack
- ESO botting core template for c#
- Request for help from people experienced in botting
Introduction
Ok so this is my first post on epvp, I've been spending a whole lot of time lately learning about memory scanning, assembly and whatnot. I used to bot UO but since there was EasyUO I didn't need to get into the real stuff. I'm also experienced programmer but not on very low level...
So let's start with sharing something I got so far, even if it's just a little:
For memory reading and writing I use a modified version of AionInterface with some types to store memory offsets and pointer paths, other than that the code is mine.
I attached source code and binaries for your convenience.
The addresses work for current version 399.
ZoomHack
For a casual user who just wants to use it:
Works for version 399 and most likely will crash any other version.
Download the binaries.rar attached and extract all files. When game is running run ZoomSolution.exe as adminstrator (right click -> run as administrator).
For someone who is interested in code:
Source code for ZoomSolution (program.cs) (requires reference to EESOcore.dll):
Code:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ZoomSolution { class Program { static void Main(string[] args) { EESO.EESOCore core = new EESO.EESOCore(); foreach (EESO.Client client in core.Clients) client.InfiniteZoom = true; } } }
Look into the EESOcore project, it has functionality to recognize running clients and attaching to offsets that are for current version.
Offsets in the template (for version 399):
Code:
int hpAddress = new MemPath("elementclient.exe+006B304C,28,288").GetTargetAddress(this); MemoryAddresses.Clear(); MemoryAddresses.Add("HP", new MemLocation(hpAddress)); MemoryAddresses.Add("Level", new MemLocation(new MemOffset(hpAddress, -0x008).TargetAddress)); MemoryAddresses.Add("Mana", new MemLocation(new MemOffset(hpAddress, 0x0004).TargetAddress)); MemoryAddresses.Add("Rage", new MemLocation(new MemOffset(hpAddress, 0x0008).TargetAddress)); MemoryAddresses.Add("Vigor", new MemLocation(new MemOffset(hpAddress, 0x000C).TargetAddress)); MemoryAddresses.Add("Essence", new MemLocation(new MemOffset(hpAddress, 0x0010).TargetAddress)); MemoryAddresses.Add("Exp", new MemLocation(new MemOffset(hpAddress, 0x0014).TargetAddress) { Cast = typeof(double), Size = 8 }); MemoryAddresses.Add("Attack", new MemLocation(new MemOffset(hpAddress, 0x0028).TargetAddress)); MemoryAddresses.Add("Defense", new MemLocation(new MemOffset(hpAddress, 0x002C).TargetAddress)); MemoryAddresses.Add("Health", new MemLocation(new MemOffset(hpAddress, 0x0030).TargetAddress)); MemoryAddresses.Add("Power", new MemLocation(new MemOffset(hpAddress, 0x0034).TargetAddress)); MemoryAddresses.Add("Points", new MemLocation(new MemOffset(hpAddress, 0x0038).TargetAddress)); MemoryAddresses.Add("Affinity", new MemLocation(new MemOffset(hpAddress, 0x003C).TargetAddress)); MemoryAddresses.Add("Ferus", new MemLocation(new MemOffset(hpAddress, 0x0040).TargetAddress)); MemoryAddresses.Add("Flora", new MemLocation(new MemOffset(hpAddress, 0x0044).TargetAddress)); MemoryAddresses.Add("Aquan", new MemLocation(new MemOffset(hpAddress, 0x0048).TargetAddress)); MemoryAddresses.Add("Pyros", new MemLocation(new MemOffset(hpAddress, 0x004C).TargetAddress)); MemoryAddresses.Add("Terra", new MemLocation(new MemOffset(hpAddress, 0x0050).TargetAddress)); MemoryAddresses.Add("MaxHealth", new MemLocation(new MemOffset(hpAddress, 0x0054).TargetAddress)); MemoryAddresses.Add("MaxMana", new MemLocation(new MemOffset(hpAddress, 0x0058).TargetAddress)); MemoryAddresses.Add("MaxRage", new MemLocation(new MemOffset(hpAddress, 0x005C).TargetAddress)); MemoryAddresses.Add("MaxVigor", new MemLocation(new MemOffset(hpAddress, 0x0060).TargetAddress)); MemoryAddresses.Add("MaxEssence", new MemLocation(new MemOffset(hpAddress, 0x0064).TargetAddress)); MemoryAddresses.Add("StrMin", new MemLocation(new MemOffset(hpAddress, 0x00C4).TargetAddress)); MemoryAddresses.Add("StrMax", new MemLocation(new MemOffset(hpAddress, 0x00C8).TargetAddress)); MemoryAddresses.Add("DEF", new MemLocation(new MemOffset(hpAddress, 0x00CC).TargetAddress)); MemoryAddresses.Add("CSR", new MemLocation(new MemOffset(hpAddress, 0x00D0).TargetAddress) { Cast = typeof(float) }); MemoryAddresses.Add("CSD", new MemLocation(new MemOffset(hpAddress, 0x00D4).TargetAddress) { Cast = typeof(float) }); MemoryAddresses.Add("IntMin", new MemLocation(new MemOffset(hpAddress, 0x00D8).TargetAddress)); MemoryAddresses.Add("IntMax", new MemLocation(new MemOffset(hpAddress, 0x00DC).TargetAddress)); MemoryAddresses.Add("Resist", new MemLocation(new MemOffset(hpAddress, 0x00E0).TargetAddress)); MemoryAddresses.Add("CCR", new MemLocation(new MemOffset(hpAddress, 0x00E4).TargetAddress) { Cast = typeof(float) }); MemoryAddresses.Add("CCD", new MemLocation(new MemOffset(hpAddress, 0x00E8).TargetAddress) { Cast = typeof(float) }); MemoryAddresses.Add("ACC", new MemLocation(new MemOffset(hpAddress, 0x00EC).TargetAddress)); MemoryAddresses.Add("RESL", new MemLocation(new MemOffset(hpAddress, 0x00F0).TargetAddress)); MemoryAddresses.Add("Gold", new MemLocation(new MemOffset(hpAddress, 0x0184).TargetAddress));
Examples of usage:
Iterating all properties of all clients and showing them in a listbox:
Code:
EESOCore core = new EESOCore(); listBox1.Items.Clear(); foreach (Client client in core.Clients) { listBox1.Items.Add("Client: " + client.Window.hWnd.ToString()); foreach (string property in client.Properties.Keys) { listBox1.Items.Add( String.Format("({0}){1}\t\t= " + ( client.Properties[property].Equals(typeof(float)) ? "{2:#0.0000}" : "{2}" ), client.Properties[property].Name, property, client.GetProperty(property, client.Properties[property])) ); } }
Code:
EESOCore core = new EESOCore(); int HP = core.Clients[0].HP;
(note how you have to have a client running to get that, since I don't have a static table in the core in case it would change for any reason)
Code:
EESOCore core = new EESOCore(); int ExpToLvl = core.Clients[0].ExpPerLevel(117);
Ok now to the last part. Why am I releasing unfinished stuff (that works tho)?
I've been scanning ESO memory and reading tutorials and articles about it for quite some time now and even though I've learned a lot doing so it's very hard to find entities from memory when you're not very experienced in that stuff.
If anyone would steer me in the right direction on finding arrays or structures for Items, mobiles etc. Any help would be greatly appreciated and I would gladly contribute back to the community as I get my stuff better.
Lastly: I'm not interested in exploiting and the zoom hack is there mostly to give this post some other value than just begging for help. The reason I am making this stuff is to keep statistics of my botting (with the ingame bot Possessor), but at the same time making a good library for custom bots and automation for whoever may need one (kinda like EasyUO for ESO).
Attachments:
Binaries.rar = Binaries for EESOCore and InteropHelper libraries and zoom hack executable.
Source.rar = Sauce.