• Log InLog In
  • Register
Liquid`
Team Liquid Liquipedia
EDT 23:59
CEST 05:59
KST 12:59
  • Home
  • Forum
  • Calendar
  • Streams
  • Liquipedia
  • Features
  • Store
  • EPT
  • TL+
  • StarCraft 2
  • Brood War
  • Smash
  • Heroes
  • Counter-Strike
  • Overwatch
  • Liquibet
  • Fantasy StarCraft
  • TLPD
  • StarCraft 2
  • Brood War
  • Blogs
Forum Sidebar
Events/Features
News
Featured News
[ASL22] Ro8 Preview: Within Reach5[ASL22] Ro8 Preview: In A Tizzy11[ASL22] Ro16 Preview: Holy Diver5[ASL22] Ro16 Preview: Rough Waters10[ASL22] Ro24 Preview: Siren's Call8
Community News
StarCraft II 5.0.17 PTR Patch Notes (Sept 30, 2026)54Weekly Cups (Sept 21-27): herO and ByuN double2Weekly Cups (Sep 13-20): herO scores triple3BSL Season 2313Weekly Cups (Sep 7-12): SHIN, ByuN, MaxPax double down1
StarCraft 2
General
How do you feel about the mass reverts in the 5.0.17 PTR? StarCraft II 5.0.17 PTR Patch Notes (Sept 30, 2026) SC4ALL: II SC2 Complete Invited Player Lineup StarCraft open world shooter announced at BlizzCon Weekly Cups (Sept 21-27): herO and ByuN double
Tourneys
Sea Duckling Open (Global, Bronze-Diamond) Stellar Fest TWO the Moon (Dec 16-20) 2026 GSTL Grand Finals SC2 INu's Battles#21 [ 3-Days tournament ] ScienceCraft (October 24-25) - Live Event
Strategy
[H] ZvP Mid-Late Game: Stalkers Collossi HT
Custom Maps
[M] (2) Sweltering Sands [M] (2) Frigid Storage
External Content
The PondCast: SC2 News & Results Mutation # 545 And Drops and Rifts Mutation # 544 Double Trouble Mutation # 543 Enhanced Defenses
Brood War
General
Bot on ladder Fantasy returning? BW General Discussion ASL22 General Discussion a Announcement on the JEDI Ringing
Tourneys
[ASL22] Ro8 Day 4 [Megathread] Daily Proleagues [ASL22] Ro8 Day 3 [ASL22] Ro8 Day 2
Strategy
Cliff Jump Revisited (1 in a 1000 strategy) Replay Review Process - What do you do? Simple Questions, Simple Answers Odyssey Mineral Stack Saturation
Other Games
General Games
Nintendo Switch Thread General RTS Discussion Thread Warcraft III: The Frozen Throne Stormgate/Frost Giant Megathread Total Annihilation Zero
Dota 2
Dota 2 Champions League Season 3 Begins April 25! Official 'what is Dota anymore' discussion
League of Legends
[TL LoL EUW IHs] Teemo shall perish
Heroes of the Storm
Heroes of the Storm 2.0
Hearthstone
Deck construction bug
TL Mafia
TL Mafia Community Thread
Community
General
Things Aren’t Peaceful in Palestine Canadian Politics Mega-thread US Politics Mega-thread Russo-Ukrainian War Thread Artificial Intelligence Thread
Fan Clubs
Serral Fan Club
Media & Entertainment
Movie Discussion! [Manga] One Piece Diablo Animated Series on Netflix
Sports
Football (Soccer) Thread MLB/Baseball 2023
World Cup 2022
Tech Support
Computer Build, Upgrade & Buying Resource Thread
TL Community
Recent Gifted Posts
Blogs
[ASL22] Ro4 Day1 Ticket Giv…
bITt.mAN
Escaping Into Video Games: G…
TrAiDoS
38 yo Retired SWE loo…
PurE)Rabbit-SF
Can Bots Beat Pros?? Starcr…
namkraft
[meme] I finally understa…
LUCKY_NOOB
Regacy Esports:Our Goa…
regacyesports
Customize Sidebar...

Website Feedback

Closed Threads



Active: 7487 users

Dota 2 Bot API 2: Training for a trainer

Blogs > LetaBot
Post a Reply
LetaBot
Profile Blog Joined June 2014
Netherlands557 Posts
May 01 2016 23:39 GMT
#1
Creating a Dota 2 Bot API Part 2: Training for a trainer

Part 1: http://www.liquiddota.com/blogs/503835-dota-2-bot-api-the-glutinitial-step

After trying out the directX/OpenGL interception I found out that somehow the directX/OpenGL interception programs weren't able to grab the 3d textures from Dota 2. I got maybe one or two, but other than that there were only 2d textures showing up.
So now I have to go the reverse engineering route anyway. So I decided to drop the graphics intercepting route for now and focus first on getting to know the internals of Dota 2. If hooking into the memory and calling functions from there ( and changing the opcodes every update ) turns out to be easy (as in, not protected), then I might as well go that route.


After asking around in some forums I came across someone by the username PrayDog who already made a SDK generator. I still have to figure out why it doesn't work for me. Maybe I messed up the cmake or I don't have the right DLL injector ( if any of you got it working, pm me pls).


So in the meantime I checked to see if I could already do some basic reverse engineering. To make it simple for me (and you), I followed the tutorial from Fleep about building a trainer ( link ) and tried to apply it to Dota 2.

The idea was to create a trainer where you could play as Abaddon in Solo vs Bots single-player and have a HP cheat where your HP would always stay the same. This basically involves finding the relevant static memory address and the offsets that lead to the HP of Abadon.


This is basically what I wanted to achieve (in single player vs bots ofc):

+ Show Spoiler +
And since this video is only uploaded to my channel, I have achieved it





So how to find the memory address:

If you want to repeat these steps, make sure you start Steam in offline mode and disable your network connection completely



1. You start up cheat engine and hook it into dota2.exe
2. As your first scan, look for the current hp of Abaddon (not the maximum hp)
[image loading]

3. Receive some damage ( for example by attacking roshan)
4. Use bigger than/Smaller than to filter out the memory addresses whose value is not the same as abaddon's current hp (as shown on the dota 2 screen).

[image loading]

5. Keep on doing this until you are only left with the values that correspond with the HP of abaddon. Since the game is still running and abaddon is healing HP slowly, these values should grow as well. In the version of 1 May 2016 there should be 4 memory addresses after you are done.
6. Try to change the value of each of these memory variables. Some are only used to store the hp number that is displayed. If you change them, you will see that they will get reset the moment abaddon heals 1 hp. One of them will permanently change the hp of abaddon.


[image loading]

7. Double click on this address to add it to the address list below. Then right click the newly created row below and select "Find out what accesses this adress"

[image loading]

8. With the game still running, there will be several instructions that come up. To the left of those instructions ( first column) there will be the total amount of times that instruction has been called since the debugger was attached.
9. Basically you are looking for the instruction that has been called the same amount of time as abaddon gained hp when you started with the debugger. This basically is the instruction that heals abandon, and thus changes the HP memory address (instead of just reading it).
10. In the version of 1 May 2016 there are multiple options to chose from. Just choose any one of them. Both the offset and memory address it guesses are the same for all of them.
11. Write down the offset ( the hex value that appears after the red + sign ) and the pointer address given by cheat engine


[image loading]

12. Tick the hex box in cheat engine and start a new scan ( click new scan then click on first scan ).

[image loading]

13. This gives you all the memory addresses that hold the memory address you got in the previous step.
14. Add all the memory addresses to the list below

[image loading]

15. For each of the memory adresses, go through the same step as step 7 ( right click them, then select "Find out what accesses this adress" ). Make sure that abaddon is still damaged and thus healing himself.
16. Check to see if there is any memory address that has the same behavior as the memory address of step 9. So basically an instruction whose "count" variable is the same as the total amount of HP that abaddon has healed since the debugger has started.

[image loading]

17. Double click the instruction to get the offset ( 0 in my case)
18. Use the memory adress from 16 to perform a new scan with the hex checkbox still ticked. So don't use the one you get if you double click the instruction where you get a red text with the offset and an estimate of the pointer. You could maybe work with that as well, but it is not needed.
18. This new scan should give a green memory address. This is a static address which will never change, unlike the first memory address you found which contains the HP. If you restart Dota 2 you will see that the memory address you found at step 6 has now changed.

[image loading]

19. You can add the green memory adress to the list below and double click the address. This should give you server.dll+14E62E0 . This basically means that the memory location of this static address is based on the memory location of server.dll when it is loaded in Dota2.exe
20. Make sure that you write down the memory locations and offsets you found ( BC , 0 in my case).

[image loading]



Basically you can now use these (hex) values to edit the memory of dota 2. This will ofc only work if you are the server, because changing your HP as a client will cause a disconnect since your Dota 2 state will not be up to date with the HP value recorded on the server. However this same technique can be used to extract your own HP in an (offline) LAN game (where bots can play without bothering anyone playing online with VAC, they will only be able to play with other players willing to join their LAN lobby).

Since the goal is to make a bot API where the bot only has access to the same things a human player has, not being able to cheat is no concern to me.


With that said, you can ofc use these pointers/offsets in what is known as a trainer . For this I used a simple trainer framework created by a user called Fleep. You can find the link to the full tutorial of Fleep above. The direct link to the original framework can be found here .


That framework is based on Assault Cube. But since the HP of Abaddon is located based on the memory address of server.dll the framework needs to be extended with EnumProcessModules() to find all .dll files loaded by dota2.exe and their corresponding memory addresses. So for this I used the sample code from here and changed it such that it will only look for the memory address of server.dll , and add 0x14E62E0 to it to get the correct memory address.


You can see the source code of the hack hacked together on pastebin here .

If you want to try the hack yourself (works in single player vs bots only), you can download the .exe from below.
Just make sure that you only run it with steam in offline mode, and without your computer having any kind of internet connection whatsoever.

link to the .exe:
http://www.filedropper.com/testhack


Do note that this is only tested on the Windows 7 32 bit dota version from 1 May 2016. If Dota 2 has been updated in the meantime it might not work anymore. Any other specification difference from my PC might also cause differences in memory/opcodes.

I also used the launch options "-console -nosecure" which might make a difference ( probably not but I put it here just to be sure).

And as expected, you need to run the .exe as an admin (otherwise it won't have permission to write to the memory of dota2.exe).



All things considered you are better of recompiling it from source. I build it using Visual C++ 2012 with the option:

Character set: Use Unicode character set

IIRC that is the only option you need to change when you start with a default .exe template in Visual Studio. You can pm me if you want the full .sln


------------------------------------------------------------------------------------------------------------------------------

I found it quite interesting to know that it was possible to access this memory quite easily. And since you can be a server while playing an (offline) LAN ( offline as in, not connected to any valve service. Using hamachi or any other tunneling for LAN for online play without valve servers), it should be possible to get custom bots running on LAN servers. If it turns out that the client side is well protected, then it will be limited to bot vs human for the time being.

For now I will continue finding the offsets of the functions needed to actually perform commands in dota 2. IIRC not all of them have been found yet. If any of you know more about this do let me know. It would save me a lot of time.


p.s : yes I know that there are methods for finding the HP of every hero you can play as, not just abaddon. This blog post was just meant to show a simple example.
If you cannot win with 100 apm, win with 100 cpm.
nanaoei
Profile Blog Joined May 2010
3358 Posts
May 02 2016 17:03 GMT
#2
best of luck!
*@boesthius' FF7 nostalgia stream bomb* "we should work on a 'Final Progamer' fangame»whitera can be a protagonist---lastlie: "we save world and then defense it"
evanthebouncy!
Profile Blog Joined June 2006
United States12815 Posts
May 02 2016 17:48 GMT
#3
this is wayy too long to read. but best of luck!
Life is run, it is dance, it is fast, passionate and BAM!, you dance and sing and booze while you can for now is the time and time is mine. Smile and laugh when still can for now is the time and soon you die!
FFGenerations
Profile Blog Joined April 2011
7088 Posts
May 04 2016 19:29 GMT
#4
just to iterate, dont run any sort of 3rd party shit whilst having an internet connection because Valve will delete your steam account (afaik)
Cool BW Music Vid - youtube.com/watch?v=W54nlqJ-Nx8 ~~~~~ ᕤ OYSTERS ᕤ CLAMS ᕤ AND ᕤ CUCKOLDS ᕤ ~~~~~~ ༼ ᕤ◕◡◕ ༽ᕤ PUNCH HIM ༼ ᕤ◕◡◕ ༽ᕤ
ahswtini
Profile Blog Joined June 2008
Northern Ireland22213 Posts
May 05 2016 09:51 GMT
#5
they wont delete ur steam account lol

but u will get a game/vac ban for it
"As I've said, balance isn't about strategies or counters, it's about probability and statistics." - paralleluniverse
Please log in or register to reply.
Live Events Refresh
OSC
00:00
OSC Elite Rising Star #21
Liquipedia
[ Submit Event ]
Live Streams
Refresh
StarCraft 2
RuFF_SC2 177
ProTech121
Nina 35
StarCraft: Brood War
Rain 2249
Shuttle 1258
Dewaltoss 55
Bale 52
Noble 46
Snow 44
Dota 2
NeuroSwarm165
Counter-Strike
Coldzera 1051
Super Smash Bros
Mew2King300
Heroes of the Storm
Khaldor528
Other Games
summit1g9160
JimRising 710
C9.Mang0311
PiGStarcraft297
ArmadaUGS56
ViBE54
Organizations
Other Games
BasetradeTV246
Dota 2
PGL Dota 2 - Main Stream72
[ Show 15 non-featured ]
StarCraft 2
• davetesta21
• Response 7
• Letter146
• practicex 5
• AfreecaTV YouTube
• intothetv
• Kozan
• IndyKCrew
• Migwel
StarCraft: Brood War
• BSLYoutube
• STPLYoutube
• ZZZeroYoutube
League of Legends
• Lourlo942
• Stunt199
Other Games
• Scarra787
Upcoming Events
Stellar Fest
9h 2m
OSC
18h 2m
CranKy Ducklings
1d 6h
Online Event
1d 7h
FEL
1d 12h
AI Arena Tournament
1d 13h
BSL: Ladder Tournament
1d 15h
Sparkling Tuna Cup
2 days
INu's Battles
2 days
herO vs Classic
Percival vs Rogue
BSL Open Qualifier
2 days
[ Show More ]
BSL Open Qualifier
2 days
Replay Cast
2 days
Afreeca Starleague
3 days
Rush vs Light
WardiTV Weekly
3 days
Replay Cast
3 days
Afreeca Starleague
4 days
Soma vs Soulkey
INu's Battles
4 days
SHIN vs Cure
ByuN vs Zoun
PiGosaur Cup
4 days
The PondCast
6 days
INu's Battles
6 days
Liquipedia Results

Completed

Proleague 2026-09-30
Blizzard Classic Cup 2026
Calamity Invitational

Ongoing

ASL Season 22
Super Anchor Qualifying S3
CSL 2026 AUTUMN (S22)
Acropolis #5
Stake Ranked Episode 4
1win Private Club #1
Logitech G Play Connect 2026
SL StarSeries Fall 2026
FISSURE Playground #3
BLAST Open Fall 2026
Esports World Cup 2026
BLAST Bounty Summer 2026
BLAST Bounty Summer Qual

Upcoming

Acropolis #5 - GSB
Acropolis #5 - GSC
BSL Season 23
SC4ALL II: Brood War
BSL 23: Non-Korean Championship
HSC XXX
Stellar Fest 2: Lunar Cup
SC4ALL II: StarCraft II
Kung Fu Cup 2026 Grand Finals
RSL Offline Finals
Custodian Cup
Copium Cup
PGL Major Singapore 2026
Stake Ranked Episode 6
BLAST Rivals Fall 2026
IEM Beijing 2026
Stake Ranked Episode 5
PGL Masters Bucharest 2026
1win Private Club #2
Thunderpick World Champ. '26
ESL Pro League Season 24
TLPD

1. ByuN
2. TY
3. Dark
4. Solar
5. Stats
6. Nerchio
7. sOs
8. soO
9. INnoVation
10. Elazer
1. Rain
2. Flash
3. EffOrt
4. Last
5. Bisu
6. Soulkey
7. Mini
8. Sharp
Sidebar Settings...

Advertising | Privacy Policy | Terms Of Use | Contact Us

Original banner artwork: Jim Warren
The contents of this webpage are copyright © 2026 TLnet. All Rights Reserved.