ich bin derzeit dabei einen Bot für den Online-Shooter Combat Arms zu erstellen und bräuchte da bei zwei Problemen ein wenig Hilfe. Erstmal zur Vorgeschichte, wen es nicht interessiert der kann ja runterscrollen:
Vor 1-2 Jahren kam mal ein CA-Bot auf AC-Tools Basis heraus der an sich schon recht gut war, wenn ich ihn auch selbst ein wenig angepasst hatte damit er mehr konnte. Irgendwann wurde Nexon dann wohl schlau und passte den hackschutz so an dass das Game nach 1-2 Stunden ausging wenn keine "echte" Tastatureingabe vorhanden war.
Da AC Tools aber auch Programme starten konnte, war das erstmal kein Problem und ich konnte es umschreiben dass einfach wnen das Programm ausfiel neu gestartet wurde. Letztendlich kam Nexon aber wieder auf eine neue Idee und baute ein, dass CA automatisch nach 5 Minuten abstürzt wenn AC Tools auf dem Rechner läuft. Lange zeit habe ich mich dann nicht mehr mit dme Thema befasst.
Vor ein paar Tagen kam ich dann auf die Idee den Bot neu zu machen mithilfe von C#.
Nun zu meinem ersten Problem:
Wie ich leider Feststellen musste, kann CA auch hier auf irgendweine Weise entdecken dass keine "echte" Aktion am PC gemacht wird und schaltet sich nach 1-2 Stunden ab. Nun wollte ich das wie mit dem AC-Tool machen und CA vom Bot starten lassen, allerdings lässt sich CA weder direkt(über die "Engine.exe") noch über den Launcher mittels eines simulierten Klicks auf den Start-Button starten. Scheinbar erkennt Hackshield dass da die Maus teleportiert und nicht gezogen wird.
Ich sehe da 3 Möglichkeiten das zu beheben:
-Verhindern dass CA den Bot erkennt bzw. sich von selbst herunterfährt.
-Der Engine.exe vorgaukeln dass sie vom CA-Starter aus aufgerufen wurde
-Die Mausbewegung so zu tarnen dass Hackshield es für einen "echten" Klick hält.
Ich hatte es sogar über Virtuelle Keys versucht, d.h. Starter ausführen, zum "Game Start"-Button tabben und dann Enter, aber auch das funktioniert nicht.
Zumal ich bei den VK's mein zweites Problem habe: Der Bot kann zwar Tasten drücken und z.b. einzeln Schiessen oder schreiben ingame, ein "KeyDown"-Event kann er aber nicht simulieren sodass der Bot auch laufen kann.
Damit ihr wisst womit ihr es zu tun habt hänge ich auch auch mal die Funktionen an die ich jeweils benutze. Nichts davon funktioniert zu 100% wie ich es möchte:
Keyboard:
Code:
public static void keys(string keystroke) { SendKeys.Send(keystroke); } //Setup the Keydown and KeyUp-Messages public const ushort KEYEVENTF_KEYUP = 0x0002; public const ushort KEYEVENTF_KEYDOWN = 0x0000; public const ushort KEYEVENTF_SCANCODE = 0x0008; public const ushort KEYEVENTF_UNICODE = 0x0004; public struct KEYBDINPUT { public ushort wVk; public ushort wScan; public uint dwFlags; public long time; public uint dwExtraInfo; } [StructLayout(LayoutKind.Explicit, Size = 28)] public struct INPUT { [FieldOffset(0)] public uint type; [FieldOffset(4)] public KEYBDINPUT ki; } [DllImport("user32.dll")] public static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize); public static void forcedInput(string SArgument) { INPUT structInput; structInput = new INPUT(); structInput.type = 1; structInput.ki.wScan = 0; structInput.ki.wVk = 0; structInput.ki.time = 0; structInput.ki.dwFlags = 0; structInput.ki.dwExtraInfo = 0; foreach (char c in SArgument.ToCharArray()) { structInput.ki.dwFlags = KEYEVENTF_UNICODE; structInput.ki.wScan = (ushort)c; SendInput(1, ref structInput, Marshal.SizeOf(structInput)); structInput.ki.dwFlags = KEYEVENTF_UNICODE; structInput.ki.dwFlags += KEYEVENTF_KEYUP; structInput.ki.wScan = (ushort)c; SendInput(1, ref structInput, Marshal.SizeOf(structInput)); } } [DllImport("user32.dll")] static extern void keybd_event(byte key, byte scan, int flags, int extraInfo); [DllImport("user32.dll")] static extern short VkKeyScan(char ch); public static void keyCodeDown(byte keyCode) { keybd_event(keyCode, 0, 0, 0); } public static void keyCodeUp(byte keyCode) { keybd_event(keyCode, 0, KEYEVENTF_KEYUP, 0); } public static void keyDown(char key) { byte keyCode = (byte)VkKeyScan(key); keybd_event(keyCode, 0, 0, 0); } public static void keyUp(char key) { byte keyCode = (byte)VkKeyScan(key); keybd_event(keyCode, 0, KEYEVENTF_KEYUP, 0); }
Code:
//Setup Mouse Click Event Function [DllImport("User32.dll")] private static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, uint dwExtraInf); //MousePos public static void MousePos(int x, int y) { Cursor.Position = new Point(x, y); } //Left Click public static void LeftClick() { const UInt32 MOUSEEVENTF_LEFTDOWN = 0x0002; const UInt32 MOUSEEVENTF_LEFTUP = 0x0004; mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//make left button down mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//make left button up } //Right Click public static void RightClick() { const UInt32 MOUSEEVENTF_RIGHTDOWN = 0x0008; const UInt32 MOUSEEVENTF_RIGHTUP = 0x0010; mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);//make left button down mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);//make left button up }
Gruß,
sge
EDIT 1:
sorry für den Doppelpost, aber vlt. ist das Problem 1 fast gelöst. Ich habe herausgefunden dass man über folgende Kommandozeile die Engin.exe per Verknüpfung auch direkt starten kann:
"E:\Combat Arms Europe\Combat Arms EU\Engine.exe" -windowtitle "CombatArms" -rez Engine.rez -rez Game -authip 91.202.203.22 -authport 10001 -pcroom 0 -Ver Ver_EU_2.1107.02 -UserId
zumindest theoretisch, denn parktisch wird mir ständig angezeigt dass die Verbindung zum Server nicht aufrecht erhalten werden konnte.
Weiss zufällig jemand was an den daten oben inkorrekt ist?