[C++] Descriptors dumper & Find descriptor offsets menu

Shout-Out

User Tag List

Page 4 of 4 FirstFirst 1234
Results 46 to 57 of 57
  1. #46
    scimmy's Avatar Active Member
    Reputation
    70
    Join Date
    Jul 2020
    Posts
    57
    Thanks G/R
    2/36
    Trade Feedback
    0 (0%)
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Reghero View Post
    I'm trying to fix the descriptor dump for classic with this. So far I've got it correctly looping the functions using the pattern:

    40 53 48 83 EC ? E8 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ?

    Mapping to MirrorInitializeStaticDescriptors

    But I'm having issues getting it to actually retrieve the correct number of descriptors for each function. For example:



    enum CGContainerData
    {
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerData_ = CGItemDataEnd + 0, // size 0 flags: MIRROR_NONE
    CGContainerDataEnd = CGItemDataEnd + 0
    };

    When IDA shows it as two.
    You don't really know the total count of the descriptors for each object type. Just keep iterating until you reach the last known descriptor.

    GitHub - notscimmy/wow_descriptor_dumper

    [C++] Descriptors dumper & Find descriptor offsets
  2. Thanks Reghero (1 members gave Thanks to scimmy for this useful post)
  3. #47
    oiramario's Avatar Established Member
    Reputation
    85
    Join Date
    Mar 2021
    Posts
    133
    Thanks G/R
    36/51
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    2.5.4.42873, the descriptor disappeared...

  4. #48
    Razzue's Avatar Elite User Avid Ailurophile

    CoreCoins Purchaser Authenticator enabled
    Reputation
    398
    Join Date
    Jun 2017
    Posts
    608
    Thanks G/R
    193/283
    Trade Feedback
    2 (100%)
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by oiramario View Post
    2.5.4.42873, the descriptor disappeared...
    Yup, tbc classic object manager and unit/item/object layouts now match retails!

    You can start finding most relevant info(stats etc) at UnitBase + 0xD000 and onwards. Though there's also lost of fields a lot lower than that. Have fun

  5. Thanks sendeos23 (1 members gave Thanks to Razzue for this useful post)
  6. #49
    yezack's Avatar Member
    Reputation
    13
    Join Date
    Oct 2021
    Posts
    38
    Thanks G/R
    1/7
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Razzue View Post
    Yup, tbc classic object manager and unit/item/object layouts now match retails!

    You can start finding most relevant info(stats etc) at UnitBase + 0xD000 and onwards. Though there's also lost of fields a lot lower than that. Have fun
    Razzue sama, some offsets get by your Wow-Dumper‘s seems not correct in TBC 4.5.4.42873。
    I got this from the Dumper:
    Code:
            public class Object_Manager
            {
                
                public const int Zone_ID = 0x300905F;
                
                public const int Names = 0x2A15D10;
                
                public const int Base = 0x2B98900;
                
                public const int Cooldown = 0x2B346B0;
            }
    But,it not works. maybe the "Base" Pattern is changed?
    Pattern = "48 8B 1D ?? ?? ?? ?? 48 85 DB 74 ?? 80 3D ?? ?? ?? ?? ?? 74 ?? 48 8D 0D ?? ?? ?? ??"
    Or maybe the object manager Descriptor stuct changed?

  7. #50
    Razzue's Avatar Elite User Avid Ailurophile

    CoreCoins Purchaser Authenticator enabled
    Reputation
    398
    Join Date
    Jun 2017
    Posts
    608
    Thanks G/R
    193/283
    Trade Feedback
    2 (100%)
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by yezack View Post
    Razzue sama, some offsets get by your Wow-Dumper‘s seems not correct in TBC 4.5.4.42873。
    I got this from the Dumper:
    Code:
            public class Object_Manager
            {
                
                public const int Zone_ID = 0x300905F;
                
                public const int Names = 0x2A15D10;
                
                public const int Base = 0x2B98900;
                
                public const int Cooldown = 0x2B346B0;
            }
    But,it not works. maybe the "Base" Pattern is changed?
    Pattern = "48 8B 1D ?? ?? ?? ?? 48 85 DB 74 ?? 80 3D ?? ?? ?? ?? ?? 74 ?? 48 8D 0D ?? ?? ?? ??"
    Or maybe the object manager Descriptor stuct changed?
    Offsets are fine, the way the object manager is accessed has changed.


    [Game + Offset] +0x8] => Active object array
    for(var I = 0; I < (int)[Game+Offset]; I++)

    var entry => Array + I * 0x8;
    Entry GUID => Entry + 0x8
    Object pointer => Entry + 0x18

    Manager type => Object Pointer + 0x10

    Should be enough to get you started.

    Keep in mind some pointers in Entry+0x0 will NOT be empty, those are also manager entries.

    Will post some code when I get home.

    There are NO more descriptor fields as they used to be.
    Last edited by Razzue; 03-24-2022 at 04:39 AM.

  8. #51
    yezack's Avatar Member
    Reputation
    13
    Join Date
    Oct 2021
    Posts
    38
    Thanks G/R
    1/7
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Razzue View Post
    Offsets are fine, the way the object manager is accessed has changed.


    [Game + Offset] +0x8] => Active object array
    for(var I = 0; I < (int)[Game+Offset]; I++)

    var entry => Array + I * 0x8;
    Entry GUID => Entry + 0x8
    Object pointer => Entry + 0x18

    Manager type => Object Pointer + 0x10

    Should be enough to get you started.

    Keep in mind some pointers in Entry+0x0 will NOT be empty, those are also manager entries.

    Will post some code when I get home.

    There are NO more descriptor fields as they used to be.
    thans i got it, [Game+Offset] is object.count, [[Game + Offset] +0x8] is object.list

  9. #52
    Razzue's Avatar Elite User Avid Ailurophile

    CoreCoins Purchaser Authenticator enabled
    Reputation
    398
    Join Date
    Jun 2017
    Posts
    608
    Thanks G/R
    193/283
    Trade Feedback
    2 (100%)
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)
    Game + offset => Max count**
    Game + offset + 0x10 or something close is active object count

  10. #53
    yezack's Avatar Member
    Reputation
    13
    Join Date
    Oct 2021
    Posts
    38
    Thanks G/R
    1/7
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Razzue View Post
    Game + offset => Max count**
    Game + offset + 0x10 or something close is active object count
    i make some code , i guess Object pointer is point of object struct(i named it cur_obj).
    then i read these:
    [cur_obj+ WOW_OFFSETS.Object.Guid, 16],
    [cur_obj+ WOW_OFFSETS.Object.Descriptor, 8]
    but they seems incorrect.
    it seems offset of object struct also changed(i guess)

  11. #54
    Razzue's Avatar Elite User Avid Ailurophile

    CoreCoins Purchaser Authenticator enabled
    Reputation
    398
    Join Date
    Jun 2017
    Posts
    608
    Thanks G/R
    193/283
    Trade Feedback
    2 (100%)
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)
    For the paste monkeys

    Code:
    public const int Array = 0x8;
    public const int ObjGuid = 0x8;
    public const int EntGuid = 0x18;
    public const int ObjType = 0x10;
    
    internal static bool TryUpdate()
    {
        try
        {
            lock (CacheLock)
            {
                var count = Reader.Read<uint>(Reader.Read<IntPtr>(Client.Base + Offsets.ObjectManager.Base));
                var array = Reader.Read<IntPtr>(Reader.Read<IntPtr>(Client.Base + Offsets.ObjectManager.Base) + Offsets.ObjectManager.Array);
                if (count == 0 || IntPtr.Zero == array)
                    throw new MemoryException("Could not get object manager array.");
                
    
                if (null == Entries) Entries = new Dictionary<GUID, CacheEntry>();
                var entrycount = Entries.Count;
    
                for (var i = 0; i < count; i++)
                {
                    var ptr = Reader.Read<IntPtr>(array + (i * 0x8));
                    if (ptr == IntPtr.Zero) continue;
    
                    while (ptr != IntPtr.Zero)
                    {
                        var entry = Reader.Read<IntPtr>(ptr + 0x18);
                        var guid = Reader.Read<GUID>(ptr + Offsets.ObjectManager.ObjGuid);
    
                        if (!guid.IsEmpty())
                        {
                            if (Entries.ContainsKey(guid))
                                Entries[guid].Updated = true;
                            else Entries.Add(guid, new CacheEntry { Base = entry, Updated = true });
                        }
    
                        ptr = Reader.Read<IntPtr>(ptr + 0x0);
                    }
                }
    
                var keys = Entries.Keys.ToList();
                foreach (var key in keys)
                {
                    if (Entries[key].Updated)
                        Entries[key].Updated = false;
                    else Entries.Remove(key);
                }
    
                return null != Entries && Entries.Count > 0;
            }
        }
        catch (MemoryException) { return false; }
    }
    
    ObjectName       => [[Entry + 0x148] + 0xE0]
    UnitName         => [[Entry + 0x3A0] + 0xF8] // Npc only
    UnitPosition     => [[Entry + 0xF0] + 0x20] // Entry + 0x148 works just as well
    UnitHealth       => [Entry + 0xD4E8]
    UnitHealthMax    => [Entry + 0xD4E8]
    UnitPower1to7    => [Entry + 0xD7B8] to [Entry + 0xD7D0]
    UnitPower1to7Max => [Entry + 0xD7D4] to [Entry + 0xD7E8]
    

  12. Thanks oiramario, moisteroyster (2 members gave Thanks to Razzue for this useful post)
  13. #55
    yezack's Avatar Member
    Reputation
    13
    Join Date
    Oct 2021
    Posts
    38
    Thanks G/R
    1/7
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Razzue View Post
    For the paste monkeys

    Code:
    public const int Array = 0x8;
    public const int ObjGuid = 0x8;
    public const int EntGuid = 0x18;
    public const int ObjType = 0x10;
    
    internal static bool TryUpdate()
    {
        try
        {
            lock (CacheLock)
            {
                var count = Reader.Read<uint>(Reader.Read<IntPtr>(Client.Base + Offsets.ObjectManager.Base));
                var array = Reader.Read<IntPtr>(Reader.Read<IntPtr>(Client.Base + Offsets.ObjectManager.Base) + Offsets.ObjectManager.Array);
                if (count == 0 || IntPtr.Zero == array)
                    throw new MemoryException("Could not get object manager array.");
                
    
                if (null == Entries) Entries = new Dictionary<GUID, CacheEntry>();
                var entrycount = Entries.Count;
    
                for (var i = 0; i < count; i++)
                {
                    var ptr = Reader.Read<IntPtr>(array + (i * 0x8));
                    if (ptr == IntPtr.Zero) continue;
    
                    while (ptr != IntPtr.Zero)
                    {
                        var entry = Reader.Read<IntPtr>(ptr + 0x18);
                        var guid = Reader.Read<GUID>(ptr + Offsets.ObjectManager.ObjGuid);
    
                        if (!guid.IsEmpty())
                        {
                            if (Entries.ContainsKey(guid))
                                Entries[guid].Updated = true;
                            else Entries.Add(guid, new CacheEntry { Base = entry, Updated = true });
                        }
    
                        ptr = Reader.Read<IntPtr>(ptr + 0x0);
                    }
                }
    
                var keys = Entries.Keys.ToList();
                foreach (var key in keys)
                {
                    if (Entries[key].Updated)
                        Entries[key].Updated = false;
                    else Entries.Remove(key);
                }
    
                return null != Entries && Entries.Count > 0;
            }
        }
        catch (MemoryException) { return false; }
    }
    
    ObjectName       => [[Entry + 0x148] + 0xE0]
    UnitName         => [[Entry + 0x3A0] + 0xF8] // Npc only
    UnitPosition     => [[Entry + 0xF0] + 0x20] // Entry + 0x148 works just as well
    UnitHealth       => [Entry + 0xD4E8]
    UnitHealthMax    => [Entry + 0xD4E8]
    UnitPower1to7    => [Entry + 0xD7B8] to [Entry + 0xD7D0]
    UnitPower1to7Max => [Entry + 0xD7D4] to [Entry + 0xD7E8]
    
    if (Entries.ContainsKey(guid))
    Entries[guid].Updated = true;
    else Entries.Add(guid, new CacheEntry { Base = entry, Updated = true });

    Entries[key].updated is always true. i can't understand

    it likes ((entries) in chains)in a list, but some entries will overwrite the olds
    Last edited by yezack; 03-24-2022 at 11:36 AM.

  14. #56
    Razzue's Avatar Elite User Avid Ailurophile

    CoreCoins Purchaser Authenticator enabled
    Reputation
    398
    Join Date
    Jun 2017
    Posts
    608
    Thanks G/R
    193/283
    Trade Feedback
    2 (100%)
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by yezack View Post
    if (Entries.ContainsKey(guid))
    Entries[guid].Updated = true;
    else Entries.Add(guid, new CacheEntry { Base = entry, Updated = true });

    Entries[key].updated is always true. i can't understand

    it likes ((entries) in chains)in a list, but some entries will overwrite the olds
    It quite clearly removes any entries that have NOT been updated, and sets Entry.Updated to false at the end of the function. This does NOT over write any existing entries (aside from setting .Updated to true) as entries are stored by GUID (a "Globally Unique ID".. pay specific attention to the "UNIQUE" part ;P)

  15. #57
    Tirthankara's Avatar Active Member
    Reputation
    31
    Join Date
    Jun 2017
    Posts
    50
    Thanks G/R
    6/19
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    ObjPosition => [Entry + 0x108] or + 0x180
    Last edited by Tirthankara; 03-24-2022 at 01:49 PM.

  16. Thanks Buntstift (1 members gave Thanks to Tirthankara for this useful post)
Page 4 of 4 FirstFirst 1234

Similar Threads

  1. [3.0.9] Descriptors dumper by Kynox [Help]
    By naa in forum WoW Memory Editing
    Replies: 10
    Last Post: 04-14-2009, 01:56 PM
  2. Descriptors
    By Shamun in forum WoW Memory Editing
    Replies: 4
    Last Post: 11-28-2008, 09:43 PM
  3. Help w/ Obj Dumper (3.0.3)
    By luciferc in forum WoW Memory Editing
    Replies: 6
    Last Post: 11-17-2008, 12:08 PM
  4. [SOURCE] WoW Object Dumper
    By kynox in forum WoW Memory Editing
    Replies: 13
    Last Post: 05-29-2008, 04:54 PM
All times are GMT -5. The time now is 11:09 PM. Powered by vBulletin® Version 4.2.3
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. User Alert System provided by Advanced User Tagging (Pro) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.
Google Authenticator verification provided by Two-Factor Authentication (Free) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.
Digital Point modules: Sphinx-based search