Object Manager traversal (WoW classic) menu

User Tag List

Page 2 of 3 FirstFirst 123 LastLast
Results 16 to 30 of 35
  1. #16
    Razzue's Avatar Contributor Avid Ailurophile

    CoreCoins Purchaser Authenticator enabled
    Reputation
    379
    Join Date
    Jun 2017
    Posts
    588
    Thanks G/R
    186/268
    Trade Feedback
    2 (100%)
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Reghero View Post
    So I have the new object manager offset at:

    Code:
    private const int ObjManager = 0x2D297C8;
            private const int firstObjectOffset = 0x18;                                          
            private const int nextObjectOffset = 0x70;
    I can only get a value at 0x68:

    Code:
    this.objManagerAddress = basePointer.Read<IntPtr>(ObjManager);
    this.localGuid = this.process[objManagerAddress].Read<ulong>(0x68);
    
    My guid: 3024378824124
    CurMgr: 0x2C030E56BD0
    0x58 gets me an odd value:

    Code:
    this.objManagerAddress = basePointer.Read<IntPtr>(ObjManager);
    this.localGuid = this.process[objManagerAddress].Read<ulong>(0x58);
    
    My guid: 56
    CurMgr: 0x2C030E56BD0
    Are you just adding GUID offsets right to Basemodule + ObjectManager pointer?.. cause... Yeah
    This is what i tried, and seemed to work so far, though the location values are... unexpected:
    Code:
            public static int ObjManager = 0x2D297C8;
    
            public static IntPtr PlayerBase()
            {
                var ObjManager = V.Read<IntPtr>(V.ObjectManager);
                if (ObjManager == IntPtr.Zero) return IntPtr.Zero;
    
                var CurrentObj_Base = V.Read<IntPtr>(ObjManager + 0x1B8);
                var NextObject_Base = V.Read<IntPtr>(CurrentObj_Base + 0x70);
    
                var _PlayerGUID = V.V<int>(V.PlayerGUID);
                if (NextObject_Base == IntPtr.Zero) return IntPtr.Zero;
    
                while (NextObject_Base.ToInt64() % 2 == 0 && NextObject_Base != IntPtr.Zero)
                {
                    var WowObj = V.Read<WowObject>(NextObject_Base);
                    // if (WowObj.GUID.high == _PlayerGUID) return NextObject_Base;
                    if (WowObj.Type == 5) return NextObject_Base;
                    NextObject_Base = V.Read<IntPtr>(NextObject_Base + 0x70);
                }
    
                return IntPtr.Zero;
            }
            }
    Code:
                        while (InGame)
                        {
                            var Player = new Local_Player(V.PlayerBase());
                            if (Player != null && LastHealth != Player.Health)
                            {
                                LastHealth = Player.Health;
                                Console.WriteLine($"Health: {Player.Health} | Max Health: {Player.MaxHealth} | Level: {Player.Level}");
                                Console.WriteLine($"TypeID: {Player.Type} : Guid: 0x{Player.GUID.high.ToString("X")}");
                            }
                            Console.WriteLine($"X: {Player.LocX} | Y: {Player.LocY} | Z: {Player.LocZ}");
                            Thread.Sleep(15);
                        }
    
         public class Local_Player
        {
            public static IntPtr Base;
    
            public Local_Player(IntPtr BaseAddress)
            {
                Base = BaseAddress;
            }
    
    
            public int Level = V.ReadChain<int>(Base, new[] { 0x10, 0x134 });
            public int Health = V.ReadChain<int>(Base, new[] { 0x10, 0xDC });
            public int MaxHealth = V.ReadChain<int>(Base, new[] { 0x10, 0xFC });
    
            public byte Type = V.ReadChain<byte>(Base, new[] { 0x20 });
            public _guid GUID = V.ReadChain<_guid>(Base, new[] { 0x58 });
            public float LocX = V.ReadChain<float>(Base ,new []{ 0x1600});
            public float LocY = V.ReadChain<float>(Base, new[] { 0x1604 });
            public float LocZ = V.ReadChain<float>(Base, new[] { 0x1608 });
        }
    Output:
    Capture.PNG
    Last edited by Razzue; 06-25-2021 at 04:20 PM.

    Object Manager traversal (WoW classic)
  2. Thanks Reghero (1 members gave Thanks to Razzue for this useful post)
  3. #17
    Dupheadss's Avatar Contributor CoreCoins Purchaser
    Reputation
    98
    Join Date
    Aug 2015
    Posts
    147
    Thanks G/R
    38/61
    Trade Feedback
    2 (100%)
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by charles420 View Post
    ya i find everything in ida worst case i compare old versions i have labeled i have a script that dumps most offsets for me besides a few patterns broke i take that back i have a mod version of reclass i use to find struts like playername cach etc i was working on a list of all my offsets with a list of how to find each one in ida since alot of people spam me asking
    Looking forward to seeing this !

    Also, while I have you here. Do you know of any safe way to interact with the client externally, ideally without having the client in-focus.

    Toying with the idea of just using KDmapper and the Interception Driver but would rather do that as a last resort.

  4. Thanks Razzue (1 members gave Thanks to Dupheadss for this useful post)
  5. #18
    charles420's Avatar Contributor
    Reputation
    315
    Join Date
    Jun 2009
    Posts
    329
    Thanks G/R
    25/119
    Trade Feedback
    0 (0%)
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)
    personlly i tried interception driver then came to fact they haven't started using this to detect bots yet but theres a few ways to bypass this without the use of a driver thats not saying blizz wont start using this method to find bots but at this moment and time they havent i have a few accounts i only bot on that only use fake keypresses still fine
    Last edited by charles420; 06-26-2021 at 12:33 PM.

  6. Thanks Razzue (1 members gave Thanks to charles420 for this useful post)
  7. #19
    Razzue's Avatar Contributor Avid Ailurophile

    CoreCoins Purchaser Authenticator enabled
    Reputation
    379
    Join Date
    Jun 2017
    Posts
    588
    Thanks G/R
    186/268
    Trade Feedback
    2 (100%)
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)
    So after playing around a bit.. X/Y ARENT in x1600/x1604?

    Where i am in game: Object Manager traversal (WoW classic)-ingame-png

    Cheat engine struct dissector: showoff3.PNG

    Coord of area as per wow.tools Capture2.PNG

    Or maybe im doing something horribly wrong? though other things seem to still be fine.. idk O.o

  8. Thanks Reghero (1 members gave Thanks to Razzue for this useful post)
  9. #20
    Reghero's Avatar Member
    Reputation
    11
    Join Date
    Jun 2017
    Posts
    35
    Thanks G/R
    29/7
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Razzue View Post
    So after playing around a bit.. X/Y ARENT in x1600/x1604?

    Where i am in game: Object Manager traversal (WoW classic)-ingame-png

    Cheat engine struct dissector: showoff3.PNG

    Coord of area as per wow.tools Capture2.PNG

    Or maybe im doing something horribly wrong? though other things seem to still be fine.. idk O.o
    Exactly the issue I'm having, Y appears to change when I rotate the character.

    For anyone interesting in reading the object manager, or at least getting to the point I'm at (and it sounds like Razzue is at too). I've thrown together a little WPF example that uses Rx etc to display some info in a table, nothing fancy.

    GitHub - jjbrunton/WoWTest: Simple test WPF application that will list objects available in the object manager as well as local player information.

  10. #21
    ChrisIsMe's Avatar Contributor
    Reputation
    164
    Join Date
    Apr 2017
    Posts
    210
    Thanks G/R
    67/100
    Trade Feedback
    0 (0%)
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)
    Vector3 position; // 0x650 - 0x658
    int unk;
    float rotation;


    That’s retail. Tbc:

    player+0x198]+0x20 I think

    Tbc has all the special descriptor offsets and 198 is something like PlayerInfo. You shouldn’t need offsets in the struct that far out, that’s a retail thing.
    Last edited by ChrisIsMe; 06-27-2021 at 10:00 AM.

  11. Thanks Reghero, Razzue (2 members gave Thanks to ChrisIsMe for this useful post)
  12. #22
    Reghero's Avatar Member
    Reputation
    11
    Join Date
    Jun 2017
    Posts
    35
    Thanks G/R
    29/7
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by ChrisIsMe View Post
    Vector3 position; // 0x650 - 0x658
    int unk;
    float rotation;
    Is this:

    X = curObj + 0x650
    Y = curObj + 0x654
    Z = curObj + 0x658

    ?

    If so, that doesn't look right.

    Also, would you be able to point me in the direction of any info as to how you got the position offsets?

  13. #23
    Razzue's Avatar Contributor Avid Ailurophile

    CoreCoins Purchaser Authenticator enabled
    Reputation
    379
    Join Date
    Jun 2017
    Posts
    588
    Thanks G/R
    186/268
    Trade Feedback
    2 (100%)
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Reghero View Post
    Is this:

    X = curObj + 0x650
    Y = curObj + 0x654
    Z = curObj + 0x658

    ?

    If so, that doesn't look right.

    Also, would you be able to point me in the direction of any info as to how you got the position offsets?
    Get local player base address
    Add to pointers manually
    Ctrl+d =>Copy address=> Ctrl+d=> paste address => create new struct and .. explore xD (using modified cheat engine)

    This is what i've found after ~5 minutes of poking around :
    Code:
    Player + 0x15F8 = X
    Player + 0x15FC = Y
    Player + 0x1600 = Z
    Player + 0x1604 = Rotation
    Player + 0x10 + 0x1FC = Strength
    Player + 0x10 + 0x200 = Agility
    Player + 0x10 + 0x204 = Stamina
    Player + 0x10 + 0x208 = Intellect
    Player + 0x10 + 0x20C = Spirit
    Player + 0x10 + 0x238 = Armor
    Last edited by Razzue; 06-27-2021 at 09:52 AM.

  14. #24
    ChrisIsMe's Avatar Contributor
    Reputation
    164
    Join Date
    Apr 2017
    Posts
    210
    Thanks G/R
    67/100
    Trade Feedback
    0 (0%)
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Razzue View Post
    Get local player base address
    Add to pointers manually
    Ctrl+d =>Copy address=> Ctrl+d=> paste address => create new struct and .. explore xD (using modified cheat engine)

    This is what i've found after ~5 minutes of poking around :
    Code:
    Player + 0x15F8 = X
    Player + 0x15FC = Y
    Player + 0x1600 = Z
    Player + 0x1604 = Rotation
    Player + 0x10 + 0x1FC = Strength
    Player + 0x10 + 0x200 = Agility
    Player + 0x10 + 0x204 = Stamina
    Player + 0x10 + 0x208 = Intellect
    Player + 0x10 + 0x20C = Spirit
    Player + 0x10 + 0x238 = Armor
    Or reverse CGUnit_C::GetRawPosition // CGUnit_C::GetPosition VTable methods...
    Or Script_UnitPosition()

    Code:
    struct CGPlayerInformation {
        char _pad1[0x20];
        Vector3 position;
    } __attribute__((packed));
    
    struct CGPlayer {
        char _padObj[0x198];
        CGUnitInformation* info; // 0x198
    } __attribute__((packed));
    
    for object in objects do
    
    CGPlayer* player = (CGPlayer*)object;
    
    end
    Here's my structs for TBC dumbed down.
    Last edited by ChrisIsMe; 06-27-2021 at 09:56 AM.

  15. Thanks Razzue, Reghero (2 members gave Thanks to ChrisIsMe for this useful post)
  16. #25
    ChrisIsMe's Avatar Contributor
    Reputation
    164
    Join Date
    Apr 2017
    Posts
    210
    Thanks G/R
    67/100
    Trade Feedback
    0 (0%)
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Reghero View Post
    Is this:

    X = curObj + 0x650
    Y = curObj + 0x654
    Z = curObj + 0x658

    ?

    If so, that doesn't look right.

    Also, would you be able to point me in the direction of any info as to how you got the position offsets?
    I updated my reply, I default to Retail WoW.

  17. Thanks Reghero (1 members gave Thanks to ChrisIsMe for this useful post)
  18. #26
    Reghero's Avatar Member
    Reputation
    11
    Join Date
    Jun 2017
    Posts
    35
    Thanks G/R
    29/7
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Success, thanks for all the contributions!

    Imgur: The magic of the Internet

    Onto the next few challenges:- Unit name and CTM

  19. #27
    scimmy's Avatar Active Member
    Reputation
    52
    Join Date
    Jul 2020
    Posts
    54
    Thanks G/R
    1/33
    Trade Feedback
    0 (0%)
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Reghero View Post
    Success, thanks for all the contributions!

    Imgur: The magic of the Internet

    Onto the next few challenges:- Unit name and CTM
    I'd reverse engineer vtable index 15 for object names. As for CTM, it seems like you're external. Not sure how you plan on calling that function unless you do some funny codecave stuff.

  20. Thanks Reghero (1 members gave Thanks to scimmy for this useful post)
  21. #28
    Reghero's Avatar Member
    Reputation
    11
    Join Date
    Jun 2017
    Posts
    35
    Thanks G/R
    29/7
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by scimmy View Post
    I'd reverse engineer vtable index 15 for object names. As for CTM, it seems like you're external. Not sure how you plan on calling that function unless you do some funny codecave stuff.
    Cheers. I've been reading my way back from 2009 to present and the more I read, the more it sounds like it's worthwhile to get something injected. Although over the years, it does look like it's possible to write the destination coords to the CTM struct and write face (used to be 0x04), is that not the case anymore?

    Currently reading https://drewkestell.us/Article/6/Chapter/1 in between work meetings

    One thing (and not to take this thread too off topic) that I was confused about initially with the in process injection: you are still reliant on pointers to the required functions, correct? So in the blog above, he makes use of EnumerateVisibleObjects (presumably that's just a given name, something different internal), there's not much info as to reversing the locations of these functions. Looking into IDA, while I can see references to strings like CastSpell etc... there's no easy way to jump to the function from what I can (clearly missing something).

  22. #29
    ChrisIsMe's Avatar Contributor
    Reputation
    164
    Join Date
    Apr 2017
    Posts
    210
    Thanks G/R
    67/100
    Trade Feedback
    0 (0%)
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Reghero View Post
    Cheers. I've been reading my way back from 2009 to present and the more I read, the more it sounds like it's worthwhile to get something injected. Although over the years, it does look like it's possible to write the destination coords to the CTM struct and write face (used to be 0x04), is that not the case anymore?

    Currently reading https://drewkestell.us/Article/6/Chapter/1 in between work meetings

    One thing (and not to take this thread too off topic) that I was confused about initially with the in process injection: you are still reliant on pointers to the required functions, correct? So in the blog above, he makes use of EnumerateVisibleObjects (presumably that's just a given name, something different internal), there's not much info as to reversing the locations of these functions. Looking into IDA, while I can see references to strings like CastSpell etc... there's no easy way to jump to the function from what I can (clearly missing something).
    CTM Structs are now xor encrypted, it flips between 5 or 6 encryption methods every time they patch the game. I would just use keyboard inputs or something instead to be honest, it's quite a hassle externally now.

    But, it's all still possible.

    This thread is becoming a feast though, have fun...
    Last edited by ChrisIsMe; 06-28-2021 at 08:24 AM.

  23. Thanks Reghero (1 members gave Thanks to ChrisIsMe for this useful post)
  24. #30
    ejt's Avatar Contributor
    Reputation
    209
    Join Date
    Mar 2008
    Posts
    166
    Thanks G/R
    3/111
    Trade Feedback
    0 (0%)
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)
    CGObject_C + 0x10 is a pointer to the object's descriptors (as listed here ([Classic TBC] 2.5.1.38988 object descriptors))

    CGUnit_C + 0x198 is a pointer to CMovement structure, CGUnit_C + 0x1598 is the start of CMovement structure

    Code:
    // size = 0x238
    struct CMovement : CPassenger
    {
    	//CPassenger passenger;	// 0x000
    	uintptr_t unk_048;		// 0x048
    	uintptr_t unk_050;		// 0x050
    	MovementFlags Flags;	// 0x058
    	uint32_t unk_05C;		// 0x058
    	float x;				// 0x060
    	float y;				// 0x064
    	float z;				// 0x068
    	float facing;			// 0x06C
    	// etc...
    };
    just to clarify some offsets posted earlier

  25. Thanks Reghero, Razzue (2 members gave Thanks to ejt for this useful post)
Page 2 of 3 FirstFirst 123 LastLast

Similar Threads

  1. [Source] WPF Wow Object manager
    By !@^^@! in forum WoW Memory Editing
    Replies: 11
    Last Post: 01-26-2010, 04:13 PM
  2. [WoW][3.2.0] Better Object Managment
    By Apoc in forum WoW Memory Editing
    Replies: 43
    Last Post: 01-01-2010, 07:23 AM
  3. WoW(classic) OST in BC
    By faisal_o in forum World of Warcraft General
    Replies: 5
    Last Post: 10-13-2007, 10:36 AM
  4. WoW Object Manager ?
    By discorly in forum WoW ME Questions and Requests
    Replies: 4
    Last Post: 07-28-2007, 06:34 PM
All times are GMT -5. The time now is 11:17 AM. Powered by vBulletin® Version 4.2.3
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. User Alert System provided by Advanced User Tagging (Pro) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.
Digital Point modules: Sphinx-based search