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
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.
External Programm showing scoreboard
- 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
@Patti30 I am just gonna say that you should be careful with your interpretation of hacking.
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?
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.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!
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
- 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
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
- 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
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.
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
- 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
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.
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 (18.83 KiB) Viewed 1267 times
Ingame name: Gluebale
- 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
What exactly is the point of this?
Doesnt the table in the game already provide these info?
Doesnt the table in the game already provide these info?
- 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
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
- 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
@nabo
The point is that I can learn some stuff about C#
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.
The point is that I can learn some stuff about C#
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
Re: External Programm showing scoreboard
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
Will free some viewing space up in the game window and i can move the stats window to another monitor. Good work
Who is online
Users browsing this forum: No registered users and 7 guests