[C++ newbie] WinApi gui frage

04/11/2009 19:39 NixIs#1
HI leute,
seit vorgestern habe ich angefangen mich fest mit c++ zu beschäftigen. Mein Ziel ist ein CHARM oder wie das heißt halt bei Multiplayern Models hervorheben. Beispiel wie man oft bei CS/S sieht Blaue oder Rote Models. Oder Aimbot. Aber ich hab an GTA:SA gedacht, weil man das sehr schnell starten kann. Und warum nicht für sa:mp aimbot?

Aber na klar muss man sich von unten nach oben durch arbeiten^^ fing ich mit Basics und memorys an. War schon mir schwer genug weil es kaum Tutorials für Memory read und writes gab. Naja zu mindest ohne Erklärung.. (copy & paste)

hier bis jetzt was ich tat aber per console
Code:
#include <windows.h>
#include <iostream>
using namespace std;

int hp1 = 500;
int mp1 = 500;
int tbuf;
int hp11;
int mp11;		
void WriteMem(char* window, LPCVOID address, int value)


    {
    	HWND hWnd = FindWindow(0, window);
    	DWORD proc_id; 
    	GetWindowThreadProcessId(hWnd, &proc_id); 
    	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id); 
    	BYTE newdata[]={value}; 
    	DWORD newdatasize = sizeof(newdata); 
    	WriteProcessMemory(hProcess, (LPVOID)address, &newdata, newdatasize, 0);
    	CloseHandle(hProcess); 
}

void ReadMem(char *window, LPCVOID dAddr)


    {

    	HWND hWnd = FindWindow(0, window);
    	DWORD proc_id; 
    	GetWindowThreadProcessId(hWnd, &proc_id); 
    	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id); 
    	ReadProcessMemory(hProcess, dAddr, &tbuf, 4, NULL);
}

int main()


    {
ReadMem("Little Fighter 2", (LPCVOID)0x01CDFCFC);
hp11 = tbuf;
ReadMem("Little Fighter 2", (LPCVOID)0x01CDFD08);
mp11 = tbuf;
           cout<<"Player 1 current HP: ";
		   cout<<hp11;
		   hp1 = hp11;	
		   cout<<"\n";
           cout<<"Player 1 current MP: ";
 	       cout<<mp11;
  		   mp1 = mp11;
		   cout<<"\n\n";
          while(1) 
          {
		ReadMem("Little Fighter 2", (LPCVOID)0x01CDFCFC);
		hp11 = tbuf;
		ReadMem("Little Fighter 2", (LPCVOID)0x01CDFD08);
		mp11 = tbuf;
		if (hp1 != hp11 | mp1 != mp11 ) 
           {
           cout<<"Player 1 current HP: ";
		   cout<<hp11;
		   hp1 = hp11;		   
		   cout<<"\n";
           cout<<"Player 1 current MP: ";
 	       cout<<mp11;
  		   mp1 = mp11;
		   cout<<"\n\n";
           }
    	//WriteMem("Little Fighter 2",(LPCVOID)0x0044E4BC,900);
		Sleep(1000);
     }

}
Hier wird einfach von Little Fighter 2(Weil man wenig suchen muss ;) und beide charactere steuern kann) HP und MP gelesen und in console angezeigt. Falls es sich ändert wird neu angezeigt.

Aber jetzt wollte ich gerne ein Fenster, weil es schöner aussieht.
Code:
#define STRICT

#include <windows.h>
#include <iostream>
#include <cstring>

using namespace std;
int hp1 = 500;
int mp1 = 500;
int tbuf;
int hp11;
int mp11;

void WriteMem(char* window, LPCVOID address, int value)


    {
    	HWND hWnd = FindWindow(0, window);
    	DWORD proc_id; 
    	GetWindowThreadProcessId(hWnd, &proc_id); 
    	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id); 
    	BYTE newdata[]={value}; 
    	DWORD newdatasize = sizeof(newdata); 
    	WriteProcessMemory(hProcess, (LPVOID)address, &newdata, newdatasize, 0);
    	CloseHandle(hProcess); 
}

void ReadMem(char *window, LPCVOID dAddr)


    {

    	HWND hWnd = FindWindow(0, window);
    	DWORD proc_id; 
    	GetWindowThreadProcessId(hWnd, &proc_id); 
    	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id); 
    	ReadProcessMemory(hProcess, dAddr, &tbuf, 4, NULL);
}

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

const char szAppName[]    = "Little Fighter 2";

int WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     PSTR szCmdLine, int iCmdShow)
{
   MSG        msg;
   HWND       hWnd;
   WNDCLASS   wc;
   
   wc.style               = CS_HREDRAW | CS_VREDRAW;
   wc.lpfnWndProc         = WndProc;
   wc.cbClsExtra          = 0;
   wc.cbWndExtra          = 0;
   wc.hInstance           = hInstance;
   wc.hCursor             = LoadCursor(NULL, IDC_ARROW);
   wc.hIcon               = LoadIcon(NULL, IDI_APPLICATION);
   wc.hbrBackground       = (HBRUSH) GetStockObject(WHITE_BRUSH);
   wc.lpszClassName       = szAppName;
   wc.lpszMenuName        = NULL;
   
   RegisterClass(&wc);
   
   hWnd = CreateWindow(   szAppName,
                          szAppName,
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);
                          
   ShowWindow(hWnd, iCmdShow);
   UpdateWindow(hWnd);
   
   while (GetMessage(&msg, NULL, 0, 0))
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
   return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   switch (message)
   {
   case WM_PAINT:
      {
         PAINTSTRUCT ps;
         HDC         hDC;
         char  szText[5];
         hDC = BeginPaint(hWnd, &ps);
         {
         ReadMem("Little Fighter 2", (LPCVOID)0x01CDFCFC);
         hp11 = tbuf;
         ReadMem("Little Fighter 2", (LPCVOID)0x01CDFD08);
         mp11 = tbuf;
         sprintf(szText,"Player 1 current HP: %d",hp11);
         //MessageBox(NULL, szText, "Ha, ha, ha, ha...", MB_ICONINFORMATION);
         TextOut(hDC, 50, 50, szText, 25);
         sprintf(szText2,"Player 1 current MP: %d",mp11);
         TextOut(hDC, 50, 70, szText2, 25);
         Sleep(10);
         }
         EndPaint(hWnd, &ps);
         return 0;
      }
   case WM_DESTROY:
      {
         PostQuitMessage(0);
         return 0;
      }
   }
   return DefWindowProc(hWnd, message, wParam, lParam);
}
Das habe ich gemacht. Aber ich weiß nicht wie ich jede sekunde text ändern kann. Also ich möchte nur wenn es neue werte findet dann dahin auch schreibt.
Beispiel Player 1 current HP: 500
er verliert dann und wert ist 400
Player 1 current HP: 400

Hab das bis jetzt nicht hingekriegt.. message box zeigt aber neue werte immer an.

EDIT: hmm komischerweise hab ich jetzt nur noch bugs. Console wird nicht angezeigt.
Und Player 1 current HP: 0 kommt immer 0 raus :S
04/11/2009 19:50 Adroxxx#2
Quote:
Originally Posted by NixIs View Post
HI leute,
seit vorgestern habe ich angefangen mich fest mit c++ zu beschäftigen. Mein Ziel ist ein CHARM oder wie das heißt halt bei Multiplayern Models hervorheben. Beispiel wie man oft bei CS/S sieht Blaue oder Rote Models. Oder Aimbot. Aber ich hab an GTA:SA gedacht, weil man das sehr schnell starten kann. Und warum nicht für sa:mp aimbot?
Du wirfst da gerad zwei paar Schuhe durcheinander.
Wallhacks bzw charms geht in richtung directx. Aimbot hat damit aber überhaupt gar nichts zu tun. Der wird mittels Vektoren gemacht.


Quote:
Originally Posted by NixIs View Post
Aber na klar muss man sich von unten nach oben durch arbeiten^^ fing ich mit Basics und memorys an. War schon mir schwer genug weil es kaum Tutorials für Memory read und writes gab. Naja zu mindest ohne Erklärung.. (copy & paste)
Hab hier im Forum doch Tutorial gepostet wo auch C++ Code gepostet ist mit dem man den Speicher ausliest und schreibt. Alles mit Erklärung.



Und zu deinem WinApi Problem, ich frage mich ernsthaft, wieso du das per WinApi machst? Mittels WinApi ein Fenster aufbauen ist mitunter das nervigste was es gibt. Du musst da alles von Hand machen. Nimm doch lieber eine Libary o.Ä. dazu. So wie MFC oder GTK oder auch andere.

Bei MFC, z.B. musst du Updatedata(true) und Updatedata(false) benutzten, damit sich das fenster aktualisiert.
04/11/2009 20:10 NixIs#3
Naja ich würd MFC benutzen aber jedes mal wenn ich build mache und ausführen will steht da bei Visual Basic C++ "Linkin" und bleib stehen.. ich muss mit Taskmanager immer beenden und dann geht das.. aber bei 2te mal hängst wieder so.
Ich hab daher dev++ benutzt.

Ich weiß das wallhack und so mit directx oder opgengl zu tun hat. Aber bis dahin brauch ich halt die Basics.
Daher hab ich ja nur geschrieben, dass es mein Ziel ist.

Ich finde deinen TUT nicht :S

EDIT: Doch jetzt hab ich es gefunden
04/11/2009 20:24 Adroxxx#4
Also da steht bestimmt nicht Visual Basic C++ Linking xD Wenn das da steht, hast dir Visual Studio für Visal basic geladen und nicht für C++ ^^

Würd mal neu installieren 2005er Version oder 2008er Full nehmen. Wenn dann noch Probleme hast kannst dich ja melden.

Ja kann ja dein Ziel sein, was ich meinte ist aber das du schreibst das du halt Charms machen willst oder einen Wallhack. Und das sind einfach zwei paar verschiedene Sachen.
Wo du auch unterschiedliche Kenntnisse brauchst.

Also in dem Tut: [Only registered and activated users can see links. Click Here To Register...] Ist der ganze Memory Read und Memory Write kack drin. Das meiste ist da drin auch erklärt. Im Coding Bereich ist auch noch ein General GameHacking Tutorial von BlackFrog mit C++ Code. Kannste dir auch mal anschauen.
04/14/2009 16:11 NixIs#5
Hast mich nicht verstanden^^ Ich meinte Basics = Grundlagen. Allgemein wissen über C++

Ok. Thanks für Tipps. Ich hab jetzt mit MFC ein Trainer gemacht.
Nun gucke ich für Freezefunktion. Meine Theorie ist so.
Button angeklickt, while-schleife wiederholt writememory bis false.

Code:
	

void CL2Dlg::OnHPFreeze() 
{	
	i = 1;
	while(i)
	{
	WriteMemory((void*)0x01CDFCFC, (int)500);
	Sleep(1);
	}
}

void CL2Dlg::OnHPUnfreeze() 
{
	 i = 0;
}
Aber dann hängt mein Trainer. Mit Sleep 1000 auch. Das Spiel läuft und HP wird auch gefreezed. Nur um mein Trainer zu beenden brauch ichi taskmanger.
04/14/2009 16:27 Adroxxx#6
Joa ist klar, while(1) ist eine unendlich schleife. Das Freezen eines Wertes ist etwas kompliziert. Weil es keine Funktion gibt die den Wert freezen kann, also hast du schon gut erkannt, musst du ihn immer wieder überschreiben.

Wenn du bei der While Methode bleiben willst, musst du in die while noch eine if abfrage machen, ob eine Taste bzw Button betätigt wurde. Am einfachsten geht das, indem du einem Button ein funktion zuweist und dort eine boolvariable schreibst.

Sprich

Button -> Abbruch oder Ende oder so
PHP Code:
m_funktion_button_ende {

 
m_bEnde 1;


Dann kannst du bei der if () eine abfrage machen ob m_bEnde == 1 ist. Wenn ja springst du zB mittels break aus der schleife. Wenn nicht, schreibst du den wert wieder in den speicher.

Eine Andere Möglichkeit wäre die funktion zu hooken die den wert schreibt. Du könntest auch mittels Code Injection den Code verändern.

Normal sollte die Funktion ja ungefähr so aussehen, das irgendwas in den register geschrieben wird und dann verringert. Theoretisch müsstest du dieses veringern ändern.

Musst dich mal schlau machen über code injections, wollte eh mal ein deutsches tut dazu posten, aber zur zeit keine lust :P
04/14/2009 16:32 link#7
Vielleicht auch wie folgt...
Entweder:
Code:
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)HPThread, NULL, 0, NULL);

DWORD HPThread(void)
{
loop:
    while (bHPFreezed)
    {
        WriteMemory((void*)0x01CDFCFC, (int)500);
        Sleep(1);
    }
    Sleep(200);
    goto loop;
}

void CL2Dlg::OnHPFreeze() 
{	
    bHPFreezed = TRUE;
}

void CL2Dlg::OnHPUnfreeze() 
{
    bHPFreezed = FALSE;
}
Oder:
Code:
void CL2Dlg::OnHPFreeze() 
{	
    SetTimer(hWnd, 0, 1, NULL);
}

void CL2Dlg::OnHPUnfreeze() 
{
    KillTimer(hWnd, 0);
}

//In die Window-Routine:
case WM_TIMER: 
    WriteMemory((void*)0x01CDFCFC, (int)500);
    break;
04/14/2009 18:20 NixIs#8
@Adroxxx
also ich hab schon 2te Button der die whileschleife auflöst. Aber wenn mein Trainer hängt und ich nichts klicken kann ist ja arschkarte.

@link
Ich verstehe da nur bahnhof^^ wenn ich einfach so einfüge kommt da
undeclared identifier HPThread" usw.

bei 2ten findet er HWND nicht

//In die Window-Routine
wo ist das?

LÖSUNG:
PHP Code:
UINT hpfreezeLPVOID Param 
{
    
TRUE;
    while(
i)
    {
  
WriteMemory((void*)0x01BCFCFC,500);
  
WriteMemory((void*)0x01BCFD08,500);
    
Sleep(1);
    }
   return 
TRUE;
}

//button Freeze
void CL2Dlg::OnHPFreeze() 
{    

//wenn button geklickt und rest erklärt sich von selbst ;)
   
AfxBeginThread(hpfreeze,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);
    
    
//char szText[10];
    //ReadMemory((void*)0x01CDFCFC); 
    //sprintf(szText,"%d",value);
    //MessageBox(szText, "Error", MB_ICONERROR | MB_OK);