[Hilfe]Unit / Objectnamen auslesen

10/19/2009 22:33 iderise#1
Abend:P

Ich bin hier gerade dabei mir zum lernen nen kleinen Bot zu schreiben was auch bisher wunderbar funktioniert...

Nur stolper ich gerade darüber die GameObject / bzw Playernamen von den jeweiligen objectadressen auszulesen :
[Only registered and activated users can see links. Click Here To Register...]

die objekte lese ich aus mit:

Code:
void GetObjects(HANDLE hProcess,vector<DWORD>& vobjects)
{
wowstruct wow;
int i=0;
DWORD gclientconnection,curobj, scurmgr, nextobj, pbase, cguid;

gclientconnection = MemoryReadInt(hProcess,wow.ptr.clientConnection,true,"(gClientCOnnection)");
scurmgr = MemoryReadInt(hProcess,gclientconnection + wow.offsets.objectManagerOffset,true,"(scurmgr)");
curobj = MemoryReadInt(hProcess,scurmgr + wow.offsets.ObjManagerFirstObject,true,"");

nextobj = curobj;
vobjects.push_back(curobj);
while((curobj != 0) && (curobj & 1) == 0)
{
++i;
nextobj = MemoryReadInt(hProcess,curobj + wow.offsets.ObjectNextOffset,true,"");
cguid = MemoryReadInt(hProcess,(curobj + wow.offsets.ObjectGUIDOffset),true,"");

if (nextobj == curobj){
	break;
} else {
	vobjects.push_back(curobj);
	curobj = nextobj;
}
}//whileend

}
Die listbox fülle ich mit:
Code:
		case 4: //Players
			index = m_pModeless->m_DebugLogBox.InsertItem(i,ToString(i).c_str());
			stor.Format("0x%X",vobjects[i]);
			m_pModeless->m_DebugLogBox.SetItemText(index,1,stor);
			m_pModeless->m_DebugLogBox.SetItemText(index,2,ToString(guid).c_str());
			m_pModeless->m_DebugLogBox.SetItemText(index,3,"Player");
			
			stor.Format("%10s",MemoryReadString(Handle,(vobjects[i] + 0x95C)+0x5C,""));
			m_pModeless->m_DebugLogBox.SetItemText(index,4,stor);
Code:
		case 5: //GameObjects
			index = m_pModeless->m_DebugLogBox.InsertItem(i,ToString(i).c_str());
			stor.Format("0x%X",vobjects[i]);
			m_pModeless->m_DebugLogBox.SetItemText(index,1,stor);
			m_pModeless->m_DebugLogBox.SetItemText(index,2,ToString(guid).c_str());
			m_pModeless->m_DebugLogBox.SetItemText(index,3,"GO");
			
			storage = MemoryReadInt(Handle,vobjects[i] + 0x1A4,0,"");
			stor.Format("%10s",MemoryReadString(Handle,storage+0x90,""));
			m_pModeless->m_DebugLogBox.SetItemText(index,4,stor);
(loop mit for schleife und case nach jeweiligen objecttyp) storage=dword / stor=cstring

bei player habe ich (vobjects[i] + 0x95C)+0x5C versucht
und bei GO's einzeln


Ich bin mir sicher das die offsets soweit stimmen allerdings komme ich einfach nicht darauf wie ich sie auslese...

Hoffe jemand kann helfen :x
10/20/2009 03:42 Xeranor#2
#in Engine kram#

Code:
        /// <summary>
        /// Reads the name of the unit
        /// </summary>
        /// <param name="curObject">The ObjectID optained from the objectmanager</param>
        /// <returns>Returns the name of the unit as ASCII string.</returns>
        public string getName(uint curObject)
        {
            bm.OpenProcessAndThread(pid);
            try
            {
                return bm.ReadASCIIString(bm.ReadUInt((bm.ReadUInt((curObject + (uint)offsets.UNIT_NAMEOFFSET_1)) + (uint)offsets.UNIT_NAMEOFFSET_2)), 50);
            }
            catch
            {
                try
                {
                    return bm.ReadASCIIString(bm.ReadUInt((bm.ReadUInt((curObject + (uint)offsets.GAMEOBJECT_NAMEOFFSET_1)) + (uint)offsets.GAMEOBJECT_NAMEOFFSET_2)), 50);
                }
                catch
                {
                    return "error";
                }
            }
        }
und die offsets dazu:
Code:
        UNIT_NAMEOFFSET_1 = 0x968,
        UNIT_NAMEOFFSET_2 = 0x5C,
        GAMEOBJECT_NAMEOFFSET_1 = 0x1A4,
        GAMEOBJECT_NAMEOFFSET_2 = 0x90,
ich hoffe das hilft dir ;)
10/20/2009 21:33 iderise#3
SO macht das ganze sinn danke dir ! :P


Hast du vllt. auch eine Ahnung wie ich die playernamen auslese?
NPC's/GO's/funktionieren wunderbar
10/20/2009 21:36 Xeranor#4
ja da gibts eine eigene adresse *such*

bm.ReadASCIIString(0x012705E8,30)
10/20/2009 21:39 iderise#5
Die Static is klar ^^

Ich meinte das auslesen von den Namen anderer Player.

danke trozdem für die mühe:P
10/21/2009 14:55 iderise#6
Status update
[Only registered and activated users can see links. Click Here To Register...]

Ich bekomm die Playernamen einfach nich hin :<
10/21/2009 17:25 12354#7
Playernamen sind in so ner Art DB gespeichert.

afaik(lang ists her ;D) musste die durchgehen und dann per GUID Vergleich den richtigen Namen finden.

Mom ich such mal den Code.

EDIT für faule( ist aber "in-process"): Du könntest auch einfach die entsprechende VMT callen
-> musst bei WoW Updates nur eventuell den Index ändern : D
-> nur eine Methode für alle ObjektArten(NPCs,Units,GOs,etc)

EDIT2 sagt:
Nö hab den Code nimmer!(hab nur noch den vmt call code ;P)
MMO sagt aber ,dass es so funktioniert(mit alten 3.0.3 Offsets)
Code:
void NameFromGuid(LONGLONG guid, int numBytes, char *name)
{                                                
	static const unsigned long nameStorePtr        = 0x011AE3D0 + 0x8;  // Player name database
	static const unsigned long nameMaskOffset      = 0x024;  // Offset for the mask used with GUID to select a linked list
	static const unsigned long nameBaseOffset      = 0x01c;  // Offset for the start of the name linked list
	static const unsigned long nameStringOffset    = 0x020;  // Offset to the C string in a name structure

	unsigned long mask, base, offset, current, shortGUID, testGUID;
	
	mask = ReadDword(nameStorePtr + nameMaskOffset);
	base = ReadDword(nameStorePtr + nameBaseOffset);

	shortGUID = guid & 0xffffffff;  // Only half the guid is used to check for a hit
	offset = 12 * (mask & shortGUID);  // select the appropriate linked list
	
	current = ReadDword(base + offset + 8);
	offset = ReadDword(base + offset);  // next-4 ?

	if (current == 0 || (current & 0x1)) {*name = 0; return;}

	testGUID = ReadDword(current);
	
	while (testGUID != shortGUID)
	{
		current = ReadDword(current + offset + 4);
		
		if (current == 0 || (current & 0x1)) {*name = 0; return;}
		testGUID = ReadDword(current);		
	}

	// Found the guid in the name list...
	ReadBytesIntoBuffer(current + nameStringOffset, numBytes, name);	
}
10/21/2009 22:41 iderise#8
Großer dank an dich ! Nun mal schaun wie ich an die aktuellen offsets komme...
10/22/2009 17:51 12354#9
Lad mal die aktuellste WoW.exe hoch.
Ich schau se mir in Olly/IDA dann mal an : D
10/22/2009 18:29 iderise#10
[Only registered and activated users can see links. Click Here To Register...]

Hier :P falls du icq/msn/whatever hast und lust hast mir mal zu sagen wie du das machst ...ich hör dir gern zu :P

is doch stress immer wieder nachzufragen :<
10/22/2009 20:47 12354#11
So weit ich das erkennen kann :
nameStorePtr = 0x12542D8 + 0x8
Die restlichen Offsets sollten sich nicht verändert haben.

Meine ICQ : FUUUUUUUUUUUUUUUUUUUUUUUU ->
(lololol russische Links inc ;D )
EDIT: russische Links sind angekommen ,_,