LC Bot

07/25/2010 00:58 freaktonx#1
Hey Leute,
ich bin gerade einen Bot für Last Chaos zu schreiben. Die ganzen Hacks wie Speedhack, Reichweite und Maphack habe ich schon funktioniert auch schon. Nur habe ich ein ganz großes Problem! Wenn ich versuche einen Tastendruck zu simulieren, damit z.B. die Selbstheilung einsetzt, passiert nichts. Kennt sich jemand mit Delphi aus und kann mir da helfen? Hier mal der Source mit dem ich das versucht habe:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var c: THandle;
begin
  c:=FindWindow(nil,'LastChaos - Gamigo (Window 1024x768)');
  if c<> 0 then
  begin
    c:=FindWindowEx(c,0,'ViewPort Window',nil);
    if c<>0 then
      begin
        PostMessage(c, WM_KEYDOWN, 73, 1);  // Tastendruck simulieren
      end;
  end;

end;
Ich bin für jede Hilfe dankbar.

gruß freaktonx
07/25/2010 09:23 HardCore.1337#2
Code:
procedure TForm1.Button1Click(Sender: TObject);
var c, d: HWnd;
begin
  c:= FindWindow(nil,'LastChaos - Gamigo (Window 1024x768)');
  if c<> 0 then
  begin
   d:=FindWindowEx(c,0,'ViewPort Window',nil);
       if d<>0 then
         begin
             PostMessage(d, WM_KEYDOWN, $73, 0); 
     sleep(100); //Evt. hinabsetzen
     PostMessage(d, WM_KEYUP, $73, 0);// Tastendruck simulieren
         end;
  end;

end;
Besser noch mit VKKeyScan arbeiten.

Code:
procedure TForm1.Button1Click(Sender: TObject);
var c, d: HWnd;
Key: Word;
begin
  Key := VKKeyScan('I');
  c:= FindWindow(nil,'LastChaos - Gamigo (Window 1024x768)');
  if c<> 0 then
  begin
   d:=FindWindowEx(c,0,'ViewPort Window',nil);
       if d<>0 then
         begin
             PostMessage(d, WM_KEYDOWN, Key, 0); 
     sleep(100); //Evt. hinabsetzen
     PostMessage(d, WM_KEYUP, Key, 0);// Tastendruck simulieren
         end;
  end;

end;
07/25/2010 11:59 vst0rm#3
kenn mich zwar nicht mit Delphi aus aber ich versuchs mal

am besten hookt man z.B. TranslateMessage um die parameter zu vergleichen

PHP Code:
[+] Attaching nksp.exe with PID 4060
[+] user32.dll.TranslateMessage hooked at0x74c47d79
[+] Hook set continuing process.
[*] 
hWnd28020400  wParam09000000  lParam01000f00        ## TAB ##
[*] hWnd28020400  wParam70000000  lParam01003b00        ## F1 ##
[*] hWnd28020400  wParam71000000  lParam01003c00        ## F2 ##
[*] hWnd28020400  wParam72000000  lParam01003d00        ## F3 ## 
das ganze dann in c/c++ ...(kann leider kein Delphi aber sollte leicht sein es zu portieren)

PHP Code:
#include <Windows.h>
#include <iostream>

using namespace std;

void SendKey(HWND hWndWPARAM wParamLPARAM lParam)
{
        
PostMessage(hWndWM_KEYDOWNwParamlParam );
        
Sleep(100);
        
PostMessage(hWndWM_KEYUPwParamlParam);
        
cout <<"Send key"<<endl;    
}



int main()
{


HWND hWnd FindWindowA("Nksp"NULL);


if(
hWnd)
{
    while(
true)
    {
        
SendKey(hWndVK_TAB0);
        
Sleep(1000);
        
SendKey(hWndVK_F10x3b0001);
    }
}

cin.get();

return 
0;

bei manchen Tasten kann man lParam auf 0 setzen

ich weiß es gibt mit sicherheit ne einfachere Methode als die zeichen als hex values zu übergeben
arbeite normal nicht oft mit PostMessage bin darum für verbesserungen offen ;-)

## EDIT ##
oki das mit dem Handel hab ich mal geändert und hab jetzt auch die definierten Virtual keys verwendet.
Bleibt nur noch der lParam den man nicht immer auf 0 setzen kann.
Die Antwort dürfte hier stehen [Only registered and activated users can see links. Click Here To Register...]
07/25/2010 13:52 HardCore.1337#4
Eine Möglichkeit, die der Geschwindigkeit hilft, wäre das Handle nur einmal zu holen anstatt bei jedem Funktionsaufruf.
07/25/2010 14:39 freaktonx#5
@HardCore.1337
Ich habe es mal mit deinem Code versucht aber da passiert auch nichts leider.

@vst0rm
Ich habe keine Ahnung wie ich das in Delphi schreiben soll.:confused: HardCore.1337 vielleicht kannst du mir da ein bisschen helfen.:D
07/25/2010 15:35 HardCore.1337#6
mhh

und so?
Code:
procedure TForm1.Button1Click(Sender: TObject);
var c: HWnd;
Key: Word;
begin
  Key := VKKeyScan('I');
  c:= FindWindow(nil,'LastChaos - Gamigo (Window 1024x768)');
  if c<> 0 then
  begin
     PostMessage(c, WM_KEYDOWN, Key, 0); 
     sleep(100); //Evt. hinabsetzen
     PostMessage(c, WM_KEYUP, Key, 0);// Tastendruck simulieren
         end;
  end;
Es kann aber auch sein das ein AntiCheat Schutz das Handle blockt.
07/25/2010 15:53 freaktonx#7
Mh so gehts auch nicht.
Quote:
Es kann aber auch sein das ein AntiCheat Schutz das Handle blockt.
Dann müsste ja aber "Handle=0" sein oder?

gruß freaktonx
07/25/2010 17:22 vst0rm#8
versuch das mal kanns leider nicht testen und kann auch kein Delphi hab nur
die Windos API funktionen angepasst ...

PHP Code:
procedure TForm1.Button1Click(SenderTObject);
var 
cHWnd;
KeyWord;
begin
  Key 
:= VK_TAB;   // wenn das fehler gibt dann die nächste zeile versuchen 
  //Key := 0x09     // oder wie man hex values auch immer bei Delphi schreibt 
  
c:= FindWindow('Nksp',nil);
  if 
c<> 0 then
  begin
     PostMessage
(cWM_KEYDOWNKey0); 
     
sleep(100); //Evt. hinabsetzen
     
PostMessage(cWM_KEYUPKey0);// Tastendruck simulieren
         
end;
  
end

PS:
LC hat meines wissens kaum Schutz gegen solche Sachen, zumindest hab ich noch nix davon bemerkt xD ... man hat so gut wie freie Hand ^^
07/25/2010 17:38 HardCore.1337#9
Wäre eine Idee, doch VKKeyScan ist schon richtig.
Den Titel als Class zu übergeben ist aber wirklich eine gute Idee.
07/25/2010 18:24 vst0rm#10
joa ich habs so (c/c++) zum laufen gebracht.
Das Problem ist nur das man nicht bei jeder Taste lParam auf 0 setzen kann,
hab mir das aber noch nicht so genau angesehen warum das nicht geht.
VK_TAB sollte (jedenfallst bei mir so) mit lParam auf 0 gehen
Bis jetzt bekomme ich lParam immer durch einen hook auf TranslateMessage raus, was aber nur ne Notlösung ist ...

Wenn wer ne Lösung dafür hat wäre nett sie hier zu posten ^^
07/25/2010 18:44 HardCore.1337#11
Also ich kann bestätigen, das die tasten von A-Z mit einem lparam von 0 funktionieren.
07/25/2010 19:59 vst0rm#12
Quote:
Originally Posted by HardCore.1337 View Post
Also ich kann bestätigen, das die tasten von A-Z mit einem lparam von 0 funktionieren.
hmm bei Last Chaos germany ?

habs grade noch mal getestet hier die ausgabe des hooks
Quote:
C:\eclipse\workspace\sortdata\src>python nksp-debug.py
[+] Attaching nksp-new.exe with PID 2720
[+] user32.dll.TranslateMessage hooked at: 0x74c47d79
[+] Hook set continuing process.
[*] hWnd: e8090400 wParam: 57000000 lParam: 00000000
[*] hWnd: e8090400 wParam: 57000000 lParam: 00000000
[*] hWnd: e8090400 wParam: 57000000 lParam: 00000000
[*] hWnd: e8090400 wParam: 57000000 lParam: 00000000


C:\eclipse\workspace\sortdata\src>python nksp-debug.py
[+] Attaching nksp-new.exe with PID 2720
[+] user32.dll.TranslateMessage hooked at: 0x74c47d79
[+] Hook set continuing process.
[*] hWnd: e8090400 wParam: 57000000 lParam: 01001100
[*] hWnd: e8090400 wParam: 57000000 lParam: 01001100
[*] hWnd: e8090400 wParam: 57000000 lParam: 01001100
[*] hWnd: e8090400 wParam: 57000000 lParam: 01001100


C:\eclipse\workspace\sortdata\src>
erster aufruf ist die Übergabe mit einem Programm (PostMessage) und lParam auf 0 ... keine reaktion im spiel
zweiter aufruf ist normal über Tastatur eingegeben ... und dann ging es
Ich werd mal das ganze weiter verfolgen, wenn ich näheres weiss poste ich es hier rein ^^

## EDIT ##
Hab ne Lösung gefunden

PHP Code:
#include <iostream>
#include <Windows.h>

using namespace std;

typedef struct _KEYSTROKE
{
    
WORD KeyRepeatCount ;
    
BYTE ScanCode ;
    
BYTE ExtendedKey ;
    
BYTE Reserved ;
    
BYTE AltDown ;
    
BYTE Repeat ;
    
BYTE Up ;

KEYSTROKE;


typedef struct _PARAM
{
    
WPARAM wParam;
    
LPARAM lParam;
PARAM;


void SendKey(HWND hWndPARAM param)
{  
    
PostMessage(hWndWM_KEYDOWNparam.wParamparam.lParam );
    
Sleep(100);
    
PostMessage(hWndWM_KEYUPparam.wParamparam.lParam);
    
cout <<"Send \t wParam: "<<hex<<param.wParam<<" \t lParam: "<<param.lParam<<endl;    
}


void FillParam(int vkPARAM &param)
{
    
KEYSTROKE sKey;
    
memset ( &sKey sizeof KEYSTROKE ) ) ;
    
sKey.Repeat 1;
    
sKey.ScanCode = (BYTE)MapVirtualKey vk ) ;
    
sKey.ExtendedKey ;
    
sKey.AltDown ;
    
sKey.Repeat ;
    
sKey.Up ;

    
param.wParam vk;
    
memcpy ( &param.lParam, &sKey sizeof DWORD ) ) ;

}


 



int main()
{

    
PARAM pF1pTabpW;

    
FillParam(VK_F1pF1);
    
FillParam(VK_TABpTab);
    
//FillParam(VkKeyScan('w'), pW);
    
    


HWND hWnd FindWindowA("Nksp"NULL);


if(
hWnd)
{
    while(
true)
    {
        
SendKey(hWndpTab);
        
Sleep(1000);
        
SendKey(hWndpF1);
        
//SendKey(hWnd, pW);
        

    
}
}

cin.get();

return 
0;

und hier noch paar Infos dazu wenns wen interessiert ;-) [Only registered and activated users can see links. Click Here To Register...]
07/26/2010 07:35 HardCore.1337#13
Danke.
Funktioniert bei mir ebenfalls.
07/26/2010 17:44 freaktonx#14
Hey,
vst0rm der code den du gepostet hast funktioniert auch nicht.:( Ich kenne mich leider mit C++ überhaupt nicht aus und in Delphi bin ich auch kein pro deshalb wäre es total nett wenn mir einer erklären könnte wie ich den code von die von C++ in Delphi umschreiben kann.

P.s. Ich finde es total toll wie ihr euch damit beschäftigt um jemanden in diesem Forum weiter zu helfen. Thx

gruß freaktonx
07/26/2010 19:49 vst0rm#15
Quote:
P.s. Ich finde es total toll wie ihr euch damit beschäftigt um jemanden in diesem Forum weiter zu helfen. Thx
Hab mich auch damit gerade beschäftigt ... dachte mir, dann kann ich auch meine Ergebnisse hier teilen ;-)

Warum das bei dir nicht geht weiss ich grade nicht.
Ich hab mal den TranslateMessage Hook zu ner .exe datei gemacht und hoch geladen. Dann kannst ja mal gucken
in wie weit dein Programm und die normale Tastatureingabe sich unterscheiden

[Only registered and activated users can see links. Click Here To Register...]

Der Hook gibt [ hWnd , wParam und lParam ] aus bei jedem mal wenn eine KEYDOWN message an Nksp.exe übergeben wird