Results 1 to 7 of 7

Thread: Tibia Address Delphi 10.53

  1. #1
    Junior Member
    Join Date
    Aug 2014

    Question Tibia Address Delphi 10.53

    Hello to all, first I'm sorry for the typos, my ingles is by google translator
    * I have a doubt how to update the Address in Delphi, tried to update several more ways I can not always give some error.
    some examples are: selfSoul = $419648 this would be the address in version selfsoul 10:53...
    9:53 version would: selfSoul = $3BA0D0;
    him on the site in version Blackd 9:53's how: adrMySoul=&H7BA0D0...
    and 10:53 version is like: adrMySoul=&H819648
    So, from what I could understand is: in the current version (10:53) he would trade 8 by 4, so instead of getting &H819648 -> $419648

    someone could help me update the address or point me some good stuff so I can study and learn how to do this?
    sorry for the mistakes, I'm new to programming for bots.

    Here is the link address in the 9:51 version, 9.83, and some in the current version .. 10:53
    if someone can help update, be grateful -> Address Tibia Bot Delphi

  2. #2
    Senior Member Lolrapa's Avatar
    Join Date
    Mar 2014
    The memory addresses are relative to the position of the beginning of Tibia in the RAM (calles BaseAddress). Normaly this value is 0x400000. So this address has to be subtracted to the absolute position in order to read it.
    (I'm actually not quite sure about if that's the cause of the substraction, excuse me if I'm wrong.)

    Ex. &H819648 - 0x400000 = &H419648 = $419648
    &H, 0x, $ just indicate to the compiler that is a hexadecimal number.

    When I make the WinApi call to read I use the realtive position.

    I just realize that Tibia has been updated so I haven't updated the adresses myself, but I leave you here a list of some addresses for Tibia 10.52. It would be great I'f you can check them and tell me which ones work and which ones don't.

    <const code="addrMCInject" value="0x145621"/> <!--D7 3D B7 -->
    		<const code="addrXRay1" value="0x50672C"/> <!-- 07000000????????02000000-->
    		<const code="addrXRay2" value="0x506734"/>
    		<const code="addrFunRevealCName1" value="0x5224FA"/> <!-- search (84 C0) 75 (?0A?) to EB17-->
    		<const code="addrFunRevealCName2" value="0"/>
    		<const code="addrFunRevealCName3" value="0"/>
    		<const code="addrFunRevealCName4" value="0"/>
    		<const code="addrSelfPosX" value="0"/>
    		<const code="addrSelfPosY" value="0"/>
    		<const code="addrSelfPosZ" value="0"/>
    		<const code="addrBattleMin" value="0"/><!-- Tibia now assumes this to be 0 -->
    		<const code="addrCurrentTileToGo" value="0x812548"/><!--counts up to addrTileToGo-->
    		<const code="addrSelfFlags" value="0x81254C"/> <!-- cat1 -->
    		<const code="addrPathToGo" value="0x812554"/>
    		<const code="addrFollowedCreature" value="0x812580"/>
    		<const code="addrXor" value="0x812588"/>
    		<const code="addrManaMax" value="0x81258C"/>
    		<const code="addrExp" value="0x812598"/>
    		<const code="addrBattleMax" value="0x8125A0"/>
    		<const code="addrLvl" value="0x8125A4"/>
    		<const code="addrSoulPoints" value="0x8125A8"/>
    		<const code="addrMlvl" value="0x8125AC"/>
    		<const code="addrMlvlPercLeft" value="0x8125D4"/>
    		<const code="addrAttackedCreature" value="0x8125D8"/>
    		<const code="addrMana" value="0x8125DC"/>
    		<const code="addrTilesToGo" value="0x8125E0"/>
    		<const code="addrSkillFistPercLeft" value="0x8125E4"/>
    		<const code="addrStamina" value="0x812610"/>
    		<const code="addrCurrentWindow" value="0x812BB8"/> <!-- cat2 -->
    		<const code="addrModeFollow" value="0x819A34"/>
    		<const code="addrModePVP" value="0x819B44"/>
    		<const code="addrModeAttackPlayers" value="0x81BFF9"/> <!-- cat3 -->
    		<const code="addrModeAttackType" value="0x81BFFC"/> <!-- cat3 -->
    		<const code="addrConnectionState" value="0x81CA38"/> <!-- cat4 -->
    		<const code="addrWhiteMessage" value="0x85E680"/>
    		<const code="addrTradeCountSelf" value="0x861770"/>
    		<const code="addrTradeFirstItemSelf" value="0x861774"/>
    		<const code="addrTradeCountPartner" value="0x862420"/>
    		<const code="addrTradeFirstItemPartner" value="0x862424"/> <!-- cat2 -->
    		<const code="addrMiniMapStart" value="0x8630B0"/> <!-- begins at x,y map tile cat2 -->
    		<const code="addrVIP" value="0x9A43F0"/> <!-- cat0 -->
    		<const code="addrHP" value="0x9A7000"/>
    		<const code="addrGoZ" value="0x9A7004"/>
    		<const code="addrSkillFist" value="0x9A7008"/>
    		<const code="addrSkillFish" value="0x9A7020"/>
    		<const code="addrCap" value="0x9A7024"/>
    		<const code="addrGoY" value="0x9A7028"/>
    		<const code="addrHPMax" value="0x9A702C"/>
    		<const code="addrGoX" value="0x9A7030"/>
    		<const code="addrSelfId" value="0x9A7034"/>
    		<const code="addrFps" value="0x9EAB3C"/> <!-- pointer-like value preceeding changing bytes. Search for 1000/(setFPS) and go back 0x58. 00 00 00 00 00 00 24 40=100,00 00 00 00 00 00 34 40 = 50--> <!-- cat4 -->
    		<const code="addrVocation" value="0x9E0470"/> <!-- pointer-like value preceeding changing bytes. Search for 1000/(setFPS) and go back 0x58. 00 00 00 00 00 00 24 40=100,00 00 00 00 00 00 34 40 = 50--> <!-- cat4 -->
    		<const code="addrPacketCount" value="0x9A77C0"/> <!-- cat0 -->
    		<const code="addrFirstCreature" value="0x9F8B00"/> <!-- cat1 -->
    		<const code="addrSlotArrow" value="0xA36FA0"/> <!-- cat2 -->
    		<const code="addrMapStart" value="0xA370F0"/> <!-- is a pointer to visible map -->
    		<const code="addrFirstContainer" value="0xA3C974"/> <!-- cat2 pointer to cont number -0xC-->
    		<const code="addrCurrentTm" value="0xA3CE8C"/> <!-- cat2 -->
    		<!-- structure lengths -->
    		<const code="lengthContainer" value="492"/>
    		<const code="lengthItem" value="32"/>
    		<const code="lengthCreature" value="196"/>
    		<const code="lengthMapTile" value="368"/>
    		<const code="lengthVIP" value="96"/><!--no longer used-->
    		<const code="lengthMiniMap" value="131240"/>
    		<const code="lengthMiniMapLabel" value="112"/>
    		<const code="maxContainers" value="16"/>
    		<const code="maxCreatures" value="1300"/>
    		<const code="maxMapTiles" value="2016"/>
    Last edited by Lolrapa; 08-27-2014 at 02:33 PM.

  3. #3
    Junior Member
    Join Date
    Aug 2014
    thanks for the help, gave to understand a little about the Address ...
    in this case, this address list in visual basic -> Address 10.53 , passing them to Delphi would look like?
    example: adrMulticlient = &H5484C5 - 0x400000 => $1484C5 ??
    and if in case the first number is a letter? example: adrNChar = &HA01900, as would be?

    Thank you, sorry for the mistakes, my English is beginner.

  4. #4
    Senior Member Lolrapa's Avatar
    Join Date
    Mar 2014
    Subtracting 0x400000 is not about converting from Vb/C++.... to Delphi is about getting the relative address (the one you will use to make the WinApi call)
    The list of addresses you linked is a list of relative adresses. Otherwise they would look like " adrNameStart=&HA01900 + BaseAddres"
    So if you want to get any of those addresses in Delphi you just have to change "&H" for "$".
    That's of course if you are using the WinApi ReadProcessMemory function, I guess if so the way will be the same.
    If you want to do math operations with HEX numbers, windows calculator has a "programmer" mode that allows you to do that kind of things

  5. #5
    Senior Member
    Join Date
    Jan 2008
    Cambridge, England
    Look at it like this:

    Windows creates a process:


    Tibia.exe (======) is loaded into memory and begins execution, ASLR determines where in memory it is loaded...


    Before ASLR, the gap between the start of the process and Tibia.exe entry point was always 0x400000. When ASLR was implemented, this value was randomised. Since then, it will vary every time.

    There are two ways to work around ASLR, one of which is to tell your PC not to use it at all. The problem I have with this is that it's effectively altering your entire machine, so any code you write you need to also write code to make it work on other machines (write code to disable ASLR for all other users).

    The other way is my preferred method, which is to enumerate process modules and get the first element from the enumeration where the name of the element contains Tibia.exe. This doesn't require any hackery, and is nice and clean.

    This code enumerates process modules, dumping them all to console (pop it into a C++ command line project and hit run.

    	 Josh Griffith 2013
    	This file is part of GenericInjector.
        TibiaInjector is free software: you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation, either version 3 of the License, or
        (at your option) any later version.
        TibiaInjector is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        GNU General Public License for more details.
        You should have received a copy of the GNU General Public License
        along with TibiaInjector.  If not, see <>.
    #include "stdafx.h"
    #include <Windows.h>
    #include <Psapi.h>
    #include <iostream>
    #include <fstream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[])
    	wofstream myFile;"modules.txt");
    	myFile << L"Josh's module finder" << endl;
    	HWND hwnd = FindWindow(L"TibiaClient", NULL);
    	cout << "Handle: " << hwnd << endl;
    	myFile << L"Handle: " << hwnd << endl;
    	DWORD cbNeeded;
    	DWORD processID;
    	GetWindowThreadProcessId(hwnd, &processID);
    	cout << "Process ID: " << processID << endl;
    	myFile << L"Process ID: " << processID << endl;
    	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, processID);
    	cout << "Process Handle: " << handle << endl;
    	myFile << L"Process Handle: " << handle << endl;
    	HMODULE hMods[1024];
    	if (EnumProcessModules(handle, hMods, sizeof(hMods), &cbNeeded))
    		cout << "Enumerated: " << "Success!" << endl;
    		for (int i = 0; i < (cbNeeded / sizeof(hwnd)); i++)
    			cout << "Round " << i << ": ";
    			myFile << L"Round " << i << L": ";
    			TCHAR szModName[MAX_PATH];
    			if (GetModuleFileNameEx(handle, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
    				cout << "Module Name: ";
    				wcout << szModName; // Wide string char thing
    				cout << ". Entry Number: " << hMods[i] ; // hMods may be wide string, too, IDK, I didn't use it yet.
    				myFile << L"Module Name: " << szModName << L". Entry Number: " << hMods[i];
    			cout << ". " << endl;
    			myFile << L". " << endl;
    	cout << "End" << endl;
    	return 0;
    Available with syntax highlighting on Github:

  6. #6
    Junior Member
    Join Date
    Aug 2014
    Thank you both, I could understand about the Address, but still, I am unable to update the Address of a source that made ​​improvements.
    Source is one of the Darkstar TugBot ... good improvements made ​​to it, but can not upgrade to the current version of Tibia, always occurs when compiling errors ...
    Could someone help me?

  7. #7
    Junior Member
    Join Date
    Mar 2016
    bora joga zezenia pessoal

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts