Im hexeditor "*** Welcome to TeamSpeak 2 ***" suchen (nur die drei Sternchen reichen als Suchbegirff schon) und du findest sowas wie
das Rot umkreiste Byte (1E = dezimal: 30) repräsentiert die Länge der Welcomemessage (*** Welcome to TeamSpeak 2 *** = 30 Buchstaben).
Einfach den Text ändern und die Länge anpassen.
Die zwei NULL-bytes nach der Welcomemessage, die ich dünn rot unterlegt habe sollten auch noch überschreibbar sein, ohne das Programm zum absturz zu bringen. Für die Welcomemessage ergibt sich also eine maximale Länge von 30 + 2 (= 32 xD).
Die Länge ist vom Typ int (4 Bytes -> 1 R + 3 G) in meinem Programm habe ich die Zahl aber als einfachen char dargestellt und den Rest als 3 NULL-bytes, da man die Welcomemessage sowieso nicht so lang machen kann um einen integer zu füllen.
Code:
/*
Win32 TeamSpeak 2 Welcome Message Patch
by BlackBerry
This will change the Welcomemessage of
your TeamSpeak 2 Client.
(Default: *** Welcome to TeamSpeak 2 ***)
Note: This can also be done with a simple Hex-Editor.
The final size of this program is about 20 KB.
*/
#include <cstdio>
unsigned int strlen(const char*);
void* memset(void*, int, unsigned int);
void* memcpy(void*, const void*, unsigned int);
void exit(int);
void putError(const char*);
void cin(FILE*, void*, unsigned int);
FILE* fp;
struct ts2_wm
{
char len;
char fill[3];
char msg[33];
};
int main()
{
printf("Win32 TeamSpeak 2 Welcome Message Patch\n"
" by BlackBerry\n\n");
if ((fp = fopen("TeamSpeak.exe", "rb+")) == NULL)
putError("- Could not find/open TeamSpeak.exe\n");
char tswm[35] = "\x1e\x00\x00\x00*** Welcome to TeamSpeak 2 ***";
char buffer;
int x = -1;
int pos = -35;
while(!feof(fp))
{
if (x == 34)
break;
fread(&buffer, 1, sizeof(buffer), fp);
if (buffer != tswm[++x])
x = -1;
}
if (feof(fp))
putError("- No default Welcomemessage found (already patched?)\n");
pos += ftell(fp);
if (fseek(fp, pos, SEEK_SET) != 0)
putError("- Could not set writing position\n");
struct ts2_wm ts2wm;
printf("- Enter new welcomemessage\n"
" Characterlimit: 31\n"
" > ");
cin(stdin, &ts2wm.msg, sizeof(ts2wm.msg));
for(int a=strlen(ts2wm.msg);a<=sizeof(ts2wm.msg);a++)
ts2wm.msg[a] = 0;
ts2wm.len = strlen(ts2wm.msg);
for(int i=0;i<3;i++)
ts2wm.fill[i] = 0;
fwrite(&ts2wm, 1, sizeof(ts2_wm), fp);
fclose(fp);
printf(" [DONE] TeamSpeak.exe");
return 0;
}
void putError(const char* errmsg)
{
printf("%s", errmsg);
fclose(fp);
exit(0);
}
void cin(FILE* stream, void* dest, unsigned int size)
{
char buffer[size];
char buff;
unsigned int len = 0;
for(int x=0;x<size;x++)
{
len += fread(&buff, 1, sizeof(buff), stream);
if (buff == '\n')
break;
memcpy(&buffer[x], &buff, sizeof(buff));
}
buffer[size-2] = 0;
memcpy(dest, &buffer, strlen(buffer));
}
Wie immer - getestet mit dem Dev-C++ IDE.