External Programm showing scoreboard

Talk about all Legion TD versions here.
User avatar
Patti30
Armored Tree
Posts: 95
Joined: Thu Dec 04, 2014 8:50 pm
Location: Germany
Has thanked: 5 times
Been thanked: 2 times

External Programm showing scoreboard

Postby Patti30 » Sat Jan 24, 2015 8:44 pm

Hey,

So I made an external Programm for Leagion TD that shows the scoreboard in the game.
I made it specifically to only use pointers that point to the String used in the Scoreboard and not the actual value! It is coded in C#.
I mean I could change this in a few minutes to show even the scores of the enemies... But thats why I used the Strings! So for the enemie score it will only show "?" unless beeing in the arena of course.
I am no fan of hacking and that stuff even though you can't really describe this as hacking since Warcraft III is so old and its way to easy but it destroyes most of the fun in the game!

Since I am streaming Leagion TD I was planning on adding that into my Stream.
It is fully working already it just needs some optical changes :P
I added a screenshot of the programm in the actual stats. I never searched for values pointes or debugged while beeing ingame. I was only doing this with replays! The names in the programm were from an replay aswell.

The reason I made this topic is to specifically ask admins if this is allowed. I doubt anyone from Blizzard will actually care to much but I don't wanna get banned for that from the Ent bots.
I still don't know if I will release this in the future but it may be the case.
Attachments
Leagion TD stats.PNG
Leagion TD stats.PNG (45.25 KiB) Viewed 1371 times
Ingame name: Gluebale

User avatar
aRt)Y
Protector of Nature
Posts: 13142
Joined: Fri May 03, 2013 9:15 pm
Has thanked: 10 times
Been thanked: 174 times
Contact:

Re: External Programm showing scoreboard

Postby aRt)Y » Sun Jan 25, 2015 9:27 am

@Patti30 I am just gonna say that you should be careful with your interpretation of hacking.
I am no fan of hacking and that stuff even though you can't really describe this as hacking since Warcraft III is so old and its way to easy but it destroyes most of the fun in the game!
Warcraft III may be old and there may be dozens of ways to hack it, but it doesn't mean it's acceptable to do so.

As long as your tool does not provide any information a normal player has no access to (e.g. enemy scores), then it is fully acceptable to use.

Is there a source code to look at?
    Information, Rules, Guides and everything else you need to know about ENT is on the ENT Wiki.
      Ignorantia juris non excusat • Quis custodiet ipsos custodes? • Fallacy of composition

User avatar
Patti30
Armored Tree
Posts: 95
Joined: Thu Dec 04, 2014 8:50 pm
Location: Germany
Has thanked: 5 times
Been thanked: 2 times

Re: External Programm showing scoreboard

Postby Patti30 » Sun Jan 25, 2015 11:52 pm

Sure this ist pretty much the whole source code:

Code: Select all

public partial class MainForm : Form
   {
      public MainForm()
      {
         //
         // The InitializeComponent() call is required for Windows Forms designer support.
         //
         InitializeComponent();
         (new Thread(this.DoWork)).Start();

   }
   
   public void DoWork() {
      LTD.OpenProcess();
         
         while (true) {
         
            System.Threading.Thread.Sleep(1000);
            
            
            int a_name_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x200,
               0x168,
               0x1e8,
               0
            });
            int a_value_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x240,
               0x168,
               0x1e8,
               0
            });
            int a_income_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x280,
               0x168,
               0x1e8,
               0
            });
            int a_lumb_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x2C0,
               0x168,
               0x1e8,
               0
            });
            int a_score_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x300,
               0x168,
               0x1e8,
               0
            });
         
            int b_name_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x340,
               0x168,
               0x1e8,
               0
            });
            int b_value_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x380,
               0x168,
               0x1e8,
               0
            });
            int b_income_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x3C0,
               0x168,
               0x1e8,
               0
            });
            int b_lumb_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x400,
               0x168,
               0x1e8,
               0
            });
            int b_score_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x440,
               0x168,
               0x1e8,
               0
            });
         
            int c_name_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x480,
               0x168,
               0x1e8,
               0
            });
            int c_value_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x4C0,
               0x168,
               0x1e8,
               0
            });
            int c_income_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x500,
               0x168,
               0x1e8,
               0
            });
            int c_lumb_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x540,
               0x168,
               0x1e8,
               0
            });
            int c_score_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x580,
               0x168,
               0x1e8,
               0
            });
         
            int d_name_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x5C0,
               0x168,
               0x1e8,
               0
            });
            int d_value_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x600,
               0x168,
               0x1e8,
               0
            });
            int d_income_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x640,
               0x168,
               0x1e8,
               0
            });
            int d_lumb_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x680,
               0x168,
               0x1e8,
               0
            });
            int d_score_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x6C0,
               0x168,
               0x1e8,
               0
            });
         
            int e_name_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x700,
               0x168,
               0x1e8,
               0
            });
            int e_value_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x740,
               0x168,
               0x1e8,
               0
            });
            int e_income_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x780,
               0x168,
               0x1e8,
               0
            });
            int e_lumb_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x7C0,
               0x168,
               0x1e8,
               0
            });
            int e_score_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x800,
               0x168,
               0x1e8,
               0
            });
         
            int f_name_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x840,
               0x168,
               0x1e8,
               0
            });
            int f_value_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x880,
               0x168,
               0x1e8,
               0
            });
            int f_income_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x8C0,
               0x168,
               0x1e8,
               0
            });
            int f_lumb_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x900,
               0x168,
               0x1e8,
               0
            });
            int f_score_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x940,
               0x168,
               0x1e8,
               0
            });
         
            int g_name_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x980,
               0x168,
               0x1e8,
               0
            });
            int g_value_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0x9C0,
               0x168,
               0x1e8,
               0
            });
            int g_income_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0xA00,
               0x168,
               0x1e8,
               0
            });
            int g_lumb_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0xA40,
               0x168,
               0x1e8,
               0
            });
            int g_score_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0xA80,
               0x168,
               0x1e8,
               0
            });
         
            int h_name_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0xAC0,
               0x168,
               0x1e8,
               0
            });
            int h_value_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0xB00,
               0x168,
               0x1e8,
               0
            });
            int h_income_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0xB40,
               0x168,
               0x1e8,
               0
            });
            int h_lumb_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0xB80,
               0x168,
               0x1e8,
               0
            });
            int h_score_ptr = LTD.MultiPointer(LTD.STORMDLL + 0x00055408, new int[] {
               0xBC0,
               0x168,
               0x1e8,
               0
            });
         
            string aname = LTD.ReadString(a_name_ptr);
            string avalue = LTD.ReadString(a_value_ptr);
            string aincome = LTD.ReadString(a_income_ptr);
            string alumb = LTD.ReadString(a_lumb_ptr);
            string ascore = LTD.ReadString(a_score_ptr);
         
            string bname = LTD.ReadString(b_name_ptr);
            string bvalue = LTD.ReadString(b_value_ptr);
            string bincome = LTD.ReadString(b_income_ptr);
            string blumb = LTD.ReadString(b_lumb_ptr);
            string bscore = LTD.ReadString(b_score_ptr);
         
            string cname = LTD.ReadString(c_name_ptr);
            string cvalue = LTD.ReadString(c_value_ptr);
            string cincome = LTD.ReadString(c_income_ptr);
            string clumb = LTD.ReadString(c_lumb_ptr);
            string cscore = LTD.ReadString(c_score_ptr);
         
            string dname = LTD.ReadString(d_name_ptr);
            string dvalue = LTD.ReadString(d_value_ptr);
            string dincome = LTD.ReadString(d_income_ptr);
            string dlumb = LTD.ReadString(d_lumb_ptr);
            string dscore = LTD.ReadString(d_score_ptr);
         
            string ename = LTD.ReadString(e_name_ptr);
            string evalue = LTD.ReadString(e_value_ptr);
            string eincome = LTD.ReadString(e_income_ptr);
            string elumb = LTD.ReadString(e_lumb_ptr);
            string escore = LTD.ReadString(e_score_ptr);
         
            string fname = LTD.ReadString(f_name_ptr);
            string fvalue = LTD.ReadString(f_value_ptr);
            string fincome = LTD.ReadString(f_income_ptr);
            string flumb = LTD.ReadString(f_lumb_ptr);
            string fscore = LTD.ReadString(f_score_ptr);
         
            string gname = LTD.ReadString(g_name_ptr);
            string gvalue = LTD.ReadString(g_value_ptr);
            string gincome = LTD.ReadString(g_income_ptr);
            string glumb = LTD.ReadString(g_lumb_ptr);
            string gscore = LTD.ReadString(g_score_ptr);
         
            string hname = LTD.ReadString(h_name_ptr);
            string hvalue = LTD.ReadString(h_value_ptr);
            string hincome = LTD.ReadString(h_income_ptr);
            string hlumb = LTD.ReadString(h_lumb_ptr);
            string hscore = LTD.ReadString(h_score_ptr);
            
            this.BeginInvoke((MethodInvoker) delegate() {
            try {
               this.label1.Text = aname.Replace("|r", "").Substring(10);;
            }
            catch {}
            try {
            label2.Text = bname.Replace("|r", "").Substring(10);
            }
            catch {}
            try {
            label3.Text = cname.Replace("|r", "").Substring(10);
            }
            catch {}
            try {
            label4.Text = dname.Replace("|r", "").Substring(10);
            }
            catch {}
            try {
            label5.Text = ename.Replace("|r", "").Substring(10);
            }
            catch {}
            try {
            label6.Text = fname.Replace("|r", "").Substring(10);
            }
            catch {}
            try {
            label7.Text = gname.Replace("|r", "").Substring(10);
            }
            catch {}
            try {
            label8.Text = hname.Replace("|r", "").Substring(10);
            }
            catch {}
            
            label9.Text = avalue;
            label10.Text = bvalue;
            label11.Text = cvalue;
            label12.Text = dvalue;
            label13.Text = evalue;
            label14.Text = fvalue;
            label15.Text = gvalue;
            label16.Text = hvalue;
         
            label17.Text = aincome;
            label18.Text = bincome;
            label19.Text = cincome;
            label20.Text = dincome;
            label21.Text = eincome;
            label22.Text = fincome;
            label23.Text = gincome;
            label24.Text = hincome;
         
            label25.Text = alumb;
            label26.Text = blumb;
            label27.Text = clumb;
            label28.Text = dlumb;
            label29.Text = elumb;
            label30.Text = flumb;
            label31.Text = glumb;
            label32.Text = hlumb;
         
            label36.Text = ascore;
            label37.Text = bscore;
            label38.Text = cscore;
            label39.Text = dscore;
            label40.Text = escore;
            label41.Text = fscore;
            label42.Text = gscore;
            label43.Text = hscore;
                                    });
         }
      }
   }
   
   class LTD
    {
        public static int proccID;
        public static IntPtr pHandle;
        public static int GAMEDLL;
        public static int STORMDLL;
 
        [DllImport("kernel32.dll")]
        private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId);
 
        [DllImport("kernel32.dll")]
        private static extern bool ReadProcessMemory(IntPtr hProcess, UIntPtr lpBaseAddress, [Out] byte[] lpBuffer, UIntPtr nSize, IntPtr lpNumberOfBytesRead);
 
        public static void OpenProcess()
        {
            Process[] procs = Process.GetProcessesByName("war3");
            if (procs.Length == 0)
            {
                proccID = 0;
            }
            else
            {
                proccID = procs[0].Id;
                pHandle = OpenProcess(0x1F0FFF, false, proccID);
 
                ProcessModuleCollection modules = procs[0].Modules;
                foreach (ProcessModule module in modules)
                {
                    if (module.ModuleName == "Game.dll")
                    {
                        GAMEDLL = module.BaseAddress.ToInt32();
                    }
                    else if (module.ModuleName == "Storm.dll")
                    {
                        STORMDLL = module.BaseAddress.ToInt32();
                    }
                }
 
            }
 
        }
 
        public static int ReadInt(int Address)
        {
            byte[] buffer = new byte[sizeof(int)];
            ReadProcessMemory(pHandle, (UIntPtr)Address, buffer, (UIntPtr)4, IntPtr.Zero);
            return BitConverter.ToInt32(buffer, 0);
        }
 
        public static string ReadString(int Address)
        {
            byte[] buffer = new byte[50];
 
            ReadProcessMemory(pHandle, (UIntPtr)Address, buffer, (UIntPtr)50, IntPtr.Zero);
 
            string ret = Encoding.ASCII.GetString(buffer);
 
            if (ret.IndexOf('\0') != -1)
                ret = ret.Remove(ret.IndexOf('\0'));
            return ret;
        }
 
        public static int MultiPointer(int Base, int[] Offsets)
        {
            byte[] buff = new byte[sizeof(int)];
            ReadProcessMemory(pHandle, (UIntPtr)Base, buff, (UIntPtr)4, IntPtr.Zero);
            Base = BitConverter.ToInt32(buff, 0);
            for (int i = 0; i < Offsets.Length; i++)
            {
                ReadProcessMemory(pHandle, (UIntPtr)Base + Offsets[i], buff, (UIntPtr)4, IntPtr.Zero);
                Base = i != (Offsets.Length - 1) ? BitConverter.ToInt32(buff, 0) : Base += Offsets[i];
            }
            return Base;
        }
   }
Ingame name: Gluebale

User avatar
aRt)Y
Protector of Nature
Posts: 13142
Joined: Fri May 03, 2013 9:15 pm
Has thanked: 10 times
Been thanked: 174 times
Contact:

Re: External Programm showing scoreboard

Postby aRt)Y » Mon Jan 26, 2015 9:30 am

Thanks. Could it be that your replace function ".Replace("|r", "")." isnt working as intended?

As a suggestion: The information should be listed like in a table with same sized columns and the color code should be removed since you've it right next it as a square.
    Information, Rules, Guides and everything else you need to know about ENT is on the ENT Wiki.
      Ignorantia juris non excusat • Quis custodiet ipsos custodes? • Fallacy of composition

User avatar
Patti30
Armored Tree
Posts: 95
Joined: Thu Dec 04, 2014 8:50 pm
Location: Germany
Has thanked: 5 times
Been thanked: 2 times

Re: External Programm showing scoreboard

Postby Patti30 » Thu Jan 29, 2015 2:31 pm

Thanks for the suggestions :)
The source code I posted is a bit newer than the picture I uploaded. Thanks why it looked like the replace function was not working.
I am still working on it but I will upload a picure on how it looks like at the moment.
One big problem I encountered is that the strings where the pointer point at dont refresh if the scoreboard is not open in the game.
Attachments
Unbenannt.PNG
Unbenannt.PNG (18.83 KiB) Viewed 1266 times
Ingame name: Gluebale

User avatar
godlik3
Donator
Posts: 599
Joined: Tue Jul 22, 2014 6:10 pm
Been thanked: 14 times

Re: External Programm showing scoreboard

Postby godlik3 » Fri Jan 30, 2015 4:07 am

where is the link so we can dl it?

User avatar
nabo.
Donator
Posts: 11892
Joined: Mon Jun 10, 2013 4:30 am
Location: Dokdo, KOREA
Has thanked: 44 times
Been thanked: 158 times

Re: External Programm showing scoreboard

Postby nabo. » Fri Jan 30, 2015 4:03 pm

What exactly is the point of this?

Doesnt the table in the game already provide these info?
Clan High@useast

  • Check the wiki for ENT rules and general information.
  • Talk to mods on ENT chat.
  • Host games through our bots, Manage your stats, Secure your account(s), and check your ban status on ENT LINK.

User avatar
aRt)Y
Protector of Nature
Posts: 13142
Joined: Fri May 03, 2013 9:15 pm
Has thanked: 10 times
Been thanked: 174 times
Contact:

Re: External Programm showing scoreboard

Postby aRt)Y » Fri Jan 30, 2015 4:06 pm

Well, dunno if the normal one is well readable on stream.
    Information, Rules, Guides and everything else you need to know about ENT is on the ENT Wiki.
      Ignorantia juris non excusat • Quis custodiet ipsos custodes? • Fallacy of composition

User avatar
Patti30
Armored Tree
Posts: 95
Joined: Thu Dec 04, 2014 8:50 pm
Location: Germany
Has thanked: 5 times
Been thanked: 2 times

Re: External Programm showing scoreboard

Postby Patti30 » Thu Feb 05, 2015 5:07 pm

@nabo
The point is that I can learn some stuff about C# :P
and as arty already said I will have a well readable table on my stream.

@godlik3
Since I had some work to do the last days I couldn't work on the program but if you wanna download it (its still pretty bad) I will attach it here.
Attachments
LegionTdStats.rar
(7.31 KiB) Downloaded 30 times
Ingame name: Gluebale

User avatar
ThiaZ
Donator
Posts: 35
Joined: Fri Jun 07, 2013 1:14 pm
Has thanked: 4 times

Re: External Programm showing scoreboard

Postby ThiaZ » Sat Feb 07, 2015 1:12 am

i will use it :)

Will free some viewing space up in the game window and i can move the stats window to another monitor. Good work


Return to “Legion TD”

Who is online

Users browsing this forum: No registered users and 2 guests