WOW script names in IDA menu

User Tag List

Page 1 of 2 12 LastLast
Results 1 to 15 of 22
  1. #1
    splasher's Avatar Member
    Reputation
    10
    Join Date
    Mar 2015
    Posts
    12
    Thanks G/R
    0/2
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    WOW script names in IDA

    Cheers, engineers!

    I am a bit new to all this fun, but would like to share my first results of playing with IDA and WOW.
    This is an IDAPython script that generates names of WOW scripts in IDA's .idb based on available string info inside (instead of sub_xxxxx).
    Just copy-paste code in notepad and then save as .py. Open your idb with wow.exe in IDA (0x32 was tested), press Alt-F7 and select saved .py.
    Surely Python and IDAPython shall be in place (they seem to be integrated in IDA from the box).
    P.S. It takes a while)
    P.S2 Don't blame me if it does not work for you for some reason)

    The code:

    Code:
    from idc import BADADDR, INF_BASEADDR, SEARCH_DOWN, FUNCATTR_START, FUNCATTR_END
    import idc
    import idaapi
    
    
    def FormatAddr(addr):
        return "%s:%08X" % (idc.SegName(addr), addr)
    
    def SetScriptNames():
    
    # For each of the segments
     for seg_ea in Segments():
      # For each of the defined elements
      for head in Heads(seg_ea, SegEnd(seg_ea)):
        # If it's an instruction
        if isCode(GetFlags(head)):
          mnem = GetMnem(head)
          if(mnem == "push"):
               if(GetOpType(head,0) == o_imm):
                 refAddr = idc.Dword(head+1)
                 try:
                   checkString = GetString(refAddr).split(":",1)[0]
                 except:
                   checkString = ""
                   continue
                 if (checkString=="Usage"):
                   scriptName = "Script_"+GetString(refAddr).split(":",1)[1].split("(",1)[0].strip()
                   if "=" in scriptName:
                     scriptName = scriptName.split("=",1)[1].strip()
                   if " " in scriptName:
                     scriptName = scriptName.replace(" ", "_")
                   if "<" in scriptName:
                     scriptName = scriptName.replace("<", "__")
                   if ">" in scriptName:
                     scriptName = scriptName.replace(">", "__")
                   altAddr = idc.LocByName(scriptName)
                   funcStartAddr = GetFunctionAttr(head, FUNCATTR_START)
                   i=1   
                   scriptBaseName = scriptName
                   while altAddr != BADADDR and altAddr != funcStartAddr:
                      scriptName = scriptBaseName + str(i)
                      altAddr = idc.LocByName(scriptName)
                      i+=1
                   print "%s %s" % (FormatAddr(funcStartAddr), scriptName)
                   idc.MakeName(funcStartAddr, scriptName)
                   idc.MakeComm(funcStartAddr, GetString(refAddr))
    
    
    SetScriptNames()

    WOW script names in IDA
  2. Thanks tutrakan, squiggy (2 members gave Thanks to splasher for this useful post)
  3. #2
    Jadd's Avatar 🐸 Premium Seller
    Reputation
    1511
    Join Date
    May 2008
    Posts
    2,432
    Thanks G/R
    81/333
    Trade Feedback
    1 (100%)
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)
    You check the entire binary for "Usage" strings? That would be reeeeeally slow..

  4. #3
    splasher's Avatar Member
    Reputation
    10
    Join Date
    Mar 2015
    Posts
    12
    Thanks G/R
    0/2
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Jadd View Post
    You check the entire binary for "Usage" strings? That would be reeeeeally slow..
    Yep, a couple of minutes on my i7, still a bit faster than rename manually)
    Still it does scan for "push" in the first place, then checks the reference against "usage".
    Last edited by splasher; 03-14-2015 at 03:03 AM.

  5. #4
    namreeb's Avatar Legendary

    Reputation
    658
    Join Date
    Sep 2008
    Posts
    1,023
    Thanks G/R
    7/215
    Trade Feedback
    0 (0%)
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)
    There is another method, too, which is to hook FrameScript_Register and output the results in a format that can be copy/pasted into an .idc to just rename each function individually. I seemed to come up with more results with this method.

  6. #5
    splasher's Avatar Member
    Reputation
    10
    Join Date
    Mar 2015
    Posts
    12
    Thanks G/R
    0/2
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by king48488 View Post
    using FindBinary with byte search will speedup it too
    Yea, that was the first thing I tried, but the present approach seems to be more universal one for the future (as soon as the "usage" strings tend to be less changable than the code of scripts).

  7. #6
    splasher's Avatar Member
    Reputation
    10
    Join Date
    Mar 2015
    Posts
    12
    Thanks G/R
    0/2
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    There is another method, too, which is to hook FrameScript_Register and output the results in a format that can be copy/pasted into an .idc to just rename each function individually. I seemed to come up with more results with this method.
    namreeb, thanx for this. Seems to be a bit more difficult, but reasonable in case of more hits (probably both approaches make sense in combination).

  8. #7
    namreeb's Avatar Legendary

    Reputation
    658
    Join Date
    Sep 2008
    Posts
    1,023
    Thanks G/R
    7/215
    Trade Feedback
    0 (0%)
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by splasher View Post
    namreeb, thanx for this. Seems to be a bit more difficult, but reasonable in case of more hits (probably both approaches make sense in combination).
    It's not difficult, though perhaps a bit more tedious. I prefer this method because there are some functions used, for example, only on the login screen, that are named elsewhere. Here is my code to do it:

    Code:
    using System;
    using System.Runtime.InteropServices;
    using TbcWowHack.Misc;
    using TbcWowHack.Native;
    
    namespace TbcWowHack.Game
    {
        static class Lua
        {
            [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
            private delegate void RegisterDelegate(IntPtr namePtr, IntPtr functionPtr);
    
            private static readonly RegisterDelegate RegisterHook = RegisterHandler;
    
            private static void RegisterHandler(IntPtr namePtr, IntPtr functionPtr)
            {
                var name = Marshal.PtrToStringAnsi(namePtr);
    
                //Logging.Write("Script_{0}_Offline ===> 0x{1}", name, functionPtr.ToString("X"));
                Logging.Write("MakeName(0x{0}, \"Script_{1}\");", functionPtr.ToString("X"), name);
    
                Detours.Get("Register_Hook").CallOriginal(namePtr, functionPtr);
            }
    
            static Lua()
            {
                Detours.Add(Utilities.RegisterDelegate<RegisterDelegate>(Locator.FrameScript__Register), RegisterHook, "Register_Hook").Apply();
            }
    
            public static void Init() { }
        }
    }
    This writes something to the logfile which I can copy and paste into an .idc file, load it and execute it against my IDB.

  9. #8
    splasher's Avatar Member
    Reputation
    10
    Join Date
    Mar 2015
    Posts
    12
    Thanks G/R
    0/2
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by namreeb View Post
    It's not difficult, though perhaps a bit more tedious. I prefer this method because there are some functions used, for example, only on the login screen, that are named elsewhere. Here is my code to do it:
    Nice approach, shall play with that also, but with the use of GreyMagic (thx Apoc). As far as it relies on detouring there are memory writes, but that is natural in Memory Editing branch

  10. #9
    DarthTon's Avatar Contributor
    Reputation
    171
    Join Date
    Apr 2010
    Posts
    108
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    The idc script I used to get this info. May not work with current patch
    x86 version
    Code:
    #include <idc.idc>
    
    /************************************************************************
       Desc:		Label each lua function based on its appropriate name
       Author:  kynox (droidz for wow 64 bit version)
       Credit:	bobbysing for RenameFunc
       Website: http://www.gamedeception.net
    *************************************************************************/
    
    // 1 = Success, 0 = Failure
    static RenameFunc( dwAddress, sFunction )
    {
    	auto dwRet;
        auto part = substr( GetFunctionName( dwAddress ), 0, 7 );
        
        if ( part != "Script_" )
        {
            auto oldName = GetFunctionName( dwAddress );
            
            dwRet = MakeNameEx( dwAddress, sFunction, SN_NOWARN );
    
            if( dwRet == 0 )
            {
                auto sTemp, i;
                
                for( i = 1; i < 32; i++ )
                {
                    sTemp = form( "%s_%i", sFunction, i );
    
                    if( ( dwRet = MakeNameEx( dwAddress, sTemp, SN_NOWARN ) ) != 0 )
                    {
                        Message( "Info: Renamed to %s instead of %s\n", sTemp, sFunction );
                        break;
                    }
                }
                
                if( i == 31)
                    Message( "-- Error --: Failed to rename %s -> %s\n", oldName, sFunction );
            }
            else
                Message( "-- Renamed --: %s -> %s\n", oldName, sFunction );
        }
    	
    	return dwRet;	
    }
    
    static Luafunc_GetName( structAddr )
    {
    	return GetString( Dword( structAddr ), -1, ASCSTR_C );
    }
    
    static Luafunc_GetFunc( structAddr )
    {
    	return Dword( structAddr + 4 );
    }
    
    static HandleLuaFunc( structBase )
    {
     	auto funcName, funcAddr;
        
    	funcName = Luafunc_GetName( structBase );
    	funcAddr = Luafunc_GetFunc( structBase );	
        
    	RenameFunc( funcAddr, form( "Script_%s", funcName ) );
    }
    
    static main()
    {
        //
        //    Wipe existing Script_ functions
        //
        /*auto curEA = NextFunction(0);    
    
        for( ; curEA != BADADDR; curEA = NextFunction(curEA) )
        {
            auto name = GetFunctionName(curEA);  
            auto part = substr(name, 0, 7);
            
            if ( part == "Script_" )
            {
                auto oldName = GetFunctionName( curEA );
                
                MakeNameEx( curEA, "", SN_NOWARN );
                
                auto newName = GetFunctionName( curEA );
                
                Message( "-- Wiped -- %s -> %s\n", oldName, newName );
            }
        }
        */
        
    	auto registerFunc, xRef;
    
        registerFunc = LocByName( "FrameScript_RegisterFunction" );
        if(registerFunc == BADADDR)
        {
            Warning("Can't find FrameScript_RegisterFunction");
            return;
        }
    	
    	for( xRef = RfirstB( registerFunc ); xRef != BADADDR; xRef = RnextB( registerFunc, xRef ) )
    	{
    		auto structBase;
            auto numFuncs, i;
               
    		structBase = Dword(xRef - 4);
            
            if(Byte( xRef + 5 ) == 0x83 )
                numFuncs = GetOperandValue( xRef + 10, 1 ) / 8;
            else
                numFuncs = 1;
             
    		if ( numFuncs < 1000 && numFuncs > 0)
    		{
    			//Message( "Found 0x%x, count: 0x%x\n", structBase, numFuncs);
                
    			for ( i = 0; i < numFuncs; i++ )
    			{
    				HandleLuaFunc( structBase );	
    				structBase = structBase + 0x8;
    			}	
    		} 
    	}
    }
    And x64 version
    Code:
    #include <idc.idc>
    
    /************************************************************************
       Desc:		Label each lua function based on its appropriate name
       Author:  kynox (droidz for wow 64 bit version)
       Credit:	bobbysing for RenameFunc
       Website: http://www.gamedeception.net
    *************************************************************************/
    
    // 1 = Success, 0 = Failure
    static RenameFunc( dwAddress, sFunction )
    {
    	auto dwRet;
        auto part = substr( GetFunctionName( dwAddress ), 0, 7 );
        
        if ( part != "Script_" )
        {
            auto oldName = GetFunctionName( dwAddress );
            
            dwRet = MakeNameEx( dwAddress, sFunction, SN_NOWARN );
    
            if( dwRet == 0 )
            {
                auto sTemp, i;
                
                for( i = 1; i < 32; i++ )
                {
                    sTemp = form( "%s_%i", sFunction, i );
    
                    if( ( dwRet = MakeNameEx( dwAddress, sTemp, SN_NOWARN ) ) != 0 )
                    {
                        Message( "Info: Renamed to %s instead of %s\n", sTemp, sFunction );
                        break;
                    }
                }
                
                if( i == 31)
                    Message( "-- Error --: Failed to rename %s -> %s\n", oldName, sFunction );
            }
            else
                Message( "-- Renamed --: %s -> %s\n", oldName, sFunction );
        }
    	
    	return dwRet;	
    }
    
    static Luafunc_GetName( structAddr )
    {
    	return GetString( Qword( structAddr ), -1, ASCSTR_C );
    }
    
    static Luafunc_GetFunc( structAddr )
    {
    	return Qword( structAddr + 8 );
    }
    
    static HandleLuaFunc( structBase )
    {
     	auto funcName, funcAddr;
        
    	funcName = Luafunc_GetName( structBase );
    	funcAddr = Luafunc_GetFunc( structBase );	
        
    	RenameFunc( funcAddr, form( "Script_%s", funcName ) );
    }
    
    static main()
    {
        //
        //    Wipe existing Script_ functions
        //
        /*auto curEA = NextFunction(0);    
    
        for( ; curEA != BADADDR; curEA = NextFunction(curEA) )
        {
            auto name = GetFunctionName(curEA);  
            auto part = substr(name, 0, 7);
            
            if ( part == "Script_" )
            {
                auto oldName = GetFunctionName( curEA );
                
                MakeNameEx( curEA, "", SN_NOWARN );
                
                auto newName = GetFunctionName( curEA );
                
                Message( "-- Wiped -- %s -> %s\n", oldName, newName );
            }
        }
        */
            
    	auto registerFunc, xRef;
    	registerFunc = LocByName("FrameScript_RegisterFunction");
        
        if( registerFunc == BADADDR )
        {
            Warning("Can't find FrameScript_RegisterFunction");
            return;
        }
    	
    	for( xRef = RfirstB( registerFunc ); xRef != BADADDR; xRef = RnextB( registerFunc, xRef ) )
    	{
    		auto structBase;
            auto numFuncs, i;       
            
            if( Byte( xRef + 5 ) == 0x48 && Byte( xRef + 6 ) == 0x83 )
            {
            	structBase = GetOperandValue( xRef - 15, 1 );
                numFuncs = GetOperandValue( xRef - 8, 1 );
            }
            else
            {
            	structBase = GetOperandValue( xRef - 7, 1 );
                numFuncs = 1;
            }
                     
    		if ( numFuncs < 1000 && numFuncs > 0 )
    		{
    			//Message( "Found 0x%x, count: 0x%x\n", structBase, numFuncs);
                
    			for ( i = 0; i < numFuncs; i++ )
    			{
    				HandleLuaFunc( structBase );	
    				structBase = structBase + 0x10;
    			}	
    		} 
    	}
    }
    Last edited by DarthTon; 03-16-2015 at 03:49 AM. Reason: x64 version

  11. #10
    Jadd's Avatar 🐸 Premium Seller
    Reputation
    1511
    Join Date
    May 2008
    Posts
    2,432
    Thanks G/R
    81/333
    Trade Feedback
    1 (100%)
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)
    Not exactly the cleanest script, but here's mine. Works with the latest patches, and pulls functions from FrameScript_RegisterFunction as well as FrameScript_RegisterFunctionNamespaceWithCount:

    <snip> (See below)

    Edit: x86 only, but easily convertible to x64.
    Last edited by Jadd; 03-25-2015 at 03:53 AM.

  12. #11
    splasher's Avatar Member
    Reputation
    10
    Join Date
    Mar 2015
    Posts
    12
    Thanks G/R
    0/2
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by DarthTon View Post
    The idc script I used to get this info. May not work with current patch
    Originally Posted by Jadd View Post
    Not exactly the cleanest script, but here's mine. Works with the latest patches, and pulls functions from FrameScript_RegisterFunction as well as FrameScript_RegisterFunctionNamespaceWithCount:
    Code samples are self explaining, Now it is evident what to do next. Thanks!

  13. #12
    splasher's Avatar Member
    Reputation
    10
    Join Date
    Mar 2015
    Posts
    12
    Thanks G/R
    0/2
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by splasher View Post
    Code samples are self explaining, Now it is evident what to do next. Thanks!
    FYI, I just compared the results of my and Jade's script.
    Jade's script: 3290 hits
    My script: 1759 hits.
    So the the approach with FrameScript_RegisterFunction is more beneficial.
    What is important, though, is that some scripts that present in my selection have not been found using FrameScript_RegisterFunction approach.
    The difference is 291 function names.
    Most of them are just references from the starting FrameScript_RegisterFunction position that just has a JMP to script name generated by my function (for instance, in case of Script_GetArenaSkirmishRewardByIndex)
    But for some there are no matches in FrameScript_RegisterFunction. For instance, AdjustFadeTimes, CycleVariation, NavigateHome, etc.
    What I have done is utilized both approaches changing a bit the name of scripts generated by one of the scripts, so now I have totally 3581 hits on scripts.
    Last edited by splasher; 03-17-2015 at 09:38 AM.

  14. #13
    Jadd's Avatar 🐸 Premium Seller
    Reputation
    1511
    Join Date
    May 2008
    Posts
    2,432
    Thanks G/R
    81/333
    Trade Feedback
    1 (100%)
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)
    FYI the latest update broke my script. Blizzard added Lua namespaces and functions for the new WoW Token thing. It compiled differently than the normal references to RegisterFunctionNamespaceWithCount, in a way which my script was not able to handle. Here's the new script:

    Code:
    FrameScript_RegisterFunction_Pattern = "55 8B EC A1 ? ? ? ? 56 6A 00"
    FrameScript_RegisterFunction = FindBinary(0, SEARCH_DOWN, FrameScript_RegisterFunction_Pattern)
    
    FrameScript_RegisterFunctionNamespaceWithCount_Pattern = "55 8B EC 53 56 8B 35 ? ? ? ? FF 75 10"
    FrameScript_RegisterFunctionNamespaceWithCount = FindBinary(0, SEARCH_DOWN, FrameScript_RegisterFunctionNamespaceWithCount_Pattern)
    
    if FrameScript_RegisterFunction == BADADDR:
    	quit("Could not find FrameScript_RegisterFunction.")
    	
    if FrameScript_RegisterFunctionNamespaceWithCount == BADADDR:
    	quit("Could not find FrameScript_RegisterFunctionNamespaceWithCount.")
    
    def WriteNamespaceFuncs(logFile):
    	luaNamespaces = []
    	reference = RnextB(FrameScript_RegisterFunctionNamespaceWithCount, 0)
    	
    	while reference != BADADDR:
    		luaFuncs = []
    		
    		prevOperation = PrevHead(reference)
    		while GetMnem(prevOperation) != "push":
    			prevOperation = PrevHead(prevOperation)
    		
    		funcArray = GetOperandValue(prevOperation, 0)
    		prevOperation = PrevHead(prevOperation)
    		funcCount = GetOperandValue(prevOperation, 0)
    		prevOperation = PrevHead(prevOperation)
    		funcNamespace = GetString(GetOperandValue(prevOperation, 0), -1, ASCSTR_C)
    		
    		isRegistered = False
    		
    		for i in xrange(0, len(luaNamespaces)):
    			if luaNamespaces[i][0] == funcNamespace:
    				isRegistered = True
    				break
    		
    		if not isRegistered:
    			for j in xrange(0, funcCount):
    				arrayPtr = funcArray + (j * 8)
    				funcName = GetString(Dword(arrayPtr), -1, ASCSTR_C)
    				funcAddr = Dword(arrayPtr + 4)
    				luaFuncs.append([funcName, funcAddr])
    			
    			luaFuncs.sort()
    			luaNamespaces.append([funcNamespace, luaFuncs])
    		
    		reference = RnextB(FrameScript_RegisterFunctionNamespaceWithCount, reference)
    	
    	luaNamespaces.sort()
    	for i in xrange(0, len(luaNamespaces)):
    		logFile.write("# %s Lua Functions #\n" % luaNamespaces[i][0])
    		for j in xrange(0, len(luaNamespaces[i][1])):
    			logFile.write("MakeNameEx(baseAddr + 0x%08X, \"Script_%s.%s\", SN_NOWARN)\n" % (luaNamespaces[i][1][j][1] - 0x00400000, luaNamespaces[i][0], luaNamespaces[i][1][j][0]))
    			print("%08X Script_%s.%s" % (luaNamespaces[i][1][j][1], luaNamespaces[i][0], luaNamespaces[i][1][j][0]))
    			MakeNameEx(luaNamespaces[i][1][j][1], "Script_%s.%s" % (luaNamespaces[i][0], luaNamespaces[i][1][j][0]), SN_NOWARN)
    		
    		logFile.write("\n")
    	logFile.write("\n")
    	
    def WriteGlobalFuncs(logFile):
    	luaFuncs = []
    	reference = RnextB(FrameScript_RegisterFunction, 0)
    	
    	while reference != BADADDR:
    		nextOperation = NextHead(reference)
    		prevOperation = PrevHead(reference)
    		funcCount = 1
    		
    		if GetMnem(nextOperation) == "add":
    			# Register array of functions.
    			nextOperation = NextHead(nextOperation)
    			nextOperation = NextHead(nextOperation)
    			nextOperation = NextHead(nextOperation)
    			funcCount = GetOperandValue(nextOperation, 1) / 8
    		
    		funcArray = GetOperandValue(prevOperation, 0)
    		
    		for i in xrange(0, funcCount):
    			arrayPtr = funcArray + (i * 8)
    			funcName = GetString(Dword(arrayPtr), -1, ASCSTR_C)
    			funcAddr = Dword(arrayPtr + 4)
    			luaFuncs.append([funcName, funcAddr])
    		
    		reference = RnextB(FrameScript_RegisterFunction, reference)
    	
    	luaFuncs.sort()
    	
    	logFile.write("# Global Lua Functions #\n")
    	for i in xrange(0, len(luaFuncs)):
    		logFile.write("MakeNameEx(baseAddr + 0x%08X, \"Script_%s\", SN_NOWARN)\n" % (luaFuncs[i][1] - 0x00400000, luaFuncs[i][0]))
    		print("%08X Script_%s" % (luaFuncs[i][1], luaFuncs[i][0]))
    		MakeNameEx(luaFuncs[i][1], "Script_%s" % luaFuncs[i][0], SN_NOWARN)
    
    with open("Lua Functions.py", "w") as logFile:
    	logFile.write("baseAddr = FirstSeg()\n\n")
    	
    	WriteNamespaceFuncs(logFile)
    	WriteGlobalFuncs(logFile)
    Again, this is specifically an x86 script.

  15. Thanks Parog, Sklug, hamer-xxx (3 members gave Thanks to Jadd for this useful post)
  16. #14
    splasher's Avatar Member
    Reputation
    10
    Join Date
    Mar 2015
    Posts
    12
    Thanks G/R
    0/2
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Many thanks for this!

  17. #15
    splasher's Avatar Member
    Reputation
    10
    Join Date
    Mar 2015
    Posts
    12
    Thanks G/R
    0/2
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    As of 6.1.2.19802:
    Jadd's script: 3 315 hits (+25 new scripts to previous Wow release)
    My script: 1762 (+3)
    Total scripts: 3 606 (+25)
    So there are 25 new scripts in the recent release.

Page 1 of 2 12 LastLast

Similar Threads

  1. Help me Plz ( wow map name changer and wow map editor)
    By poopytaco1 in forum World of Warcraft Emulator Servers
    Replies: 3
    Last Post: 07-20-2008, 11:25 PM
  2. WoW account name change?
    By alex.0390 in forum World of Warcraft General
    Replies: 6
    Last Post: 11-20-2007, 06:38 AM
  3. Possible leak of new wow expansion name
    By pikmin in forum World of Warcraft General
    Replies: 3
    Last Post: 08-01-2007, 06:55 AM
  4. ☻ WoW Scripting Scam ☻
    By ericlesl in forum WoW Scam Prevention
    Replies: 5
    Last Post: 07-04-2007, 04:14 PM
  5. Blizz WoW ip name?
    By krazy1killa in forum World of Warcraft General
    Replies: 1
    Last Post: 03-20-2007, 08:17 PM
All times are GMT -5. The time now is 07:08 PM. 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