Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > .NET Languages
You last visited: Today at 03:52

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



WinAPI use in C#

Discussion on WinAPI use in C# within the .NET Languages forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Oct 2005
Posts: 2,485
Received Thanks: 215
WinAPI use in C#

Hi,

in Anlehnung an die Topics hier habe ich mich dazu aufgerafft, nen Annotrainer zu schreiben (siehe Attachment).

In der Listview werden halt aktive Annoprozesse angezeigt, die man dann anwählen kann um dann mit dem Cheat button Geld zu cheaten. Jedes item in der Listview hat im item.Tag das jeweilige Prozessobject, somit auch die ID.

Allerdings komme ich mit den eigentlichen Funktionen OpenProcess, ReadProcessMemory und WirteProcessMemory in C# noch nicht klar. Zwar bekomme ich das irgendwie hin, aber ich würde es gerne richtig verstehen und nicht nur die compilerfehler behandeln.

Imports:
Code:
        [DllImport("kernel32.dll")]
        static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
           byte[] lpBuffer, UIntPtr nSize, out IntPtr lpNumberOfBytesWritten);
        
        [DllImport("kernel32.dll")]
        static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Boolean bInheritHandle, UInt32 dwProcessId);
Code:
IntPtr phdl = OpenProcess(0x10, false, (uint)po.Id);
Das Handle, is sogar != null.

Zwar weiss ich, dass man die für C# "unbekannten" Datenformate wie zB DWORD irgendwie in ein IntPtr Objekt umwandelt, aber was da genau passiert und was es bedeutet weiss ich nicht. Und das wüsste ich gern

Grüße
Attached Images
File Type: jpg Trainer.JPG (7.8 KB, 91 views)
Term!nX is offline  
Old 05/19/2008, 19:41   #2
 
elite*gold: 0
Join Date: Oct 2005
Posts: 2,485
Received Thanks: 215
Mir grad erst aufgefallen, komischerweise dp, obwohl ich nur edit gemacht habe ..
Term!nX is offline  
Old 05/19/2008, 22:05   #3
 
elite*gold: 0
Join Date: Apr 2004
Posts: 741
Received Thanks: 453
Ich finde den Startpost seehr unpräzise.
Bitte mehr Quellcode, am besten das ganze Projekt und dazu noch ne konkrete Frage.
Hier meine allgemeine Antwort für deine allgemeine Frage:
(Google c# dword erster Treffer :x)
sirru is offline  
Old 05/20/2008, 12:37   #4
 
elite*gold: 0
Join Date: Oct 2005
Posts: 2,485
Received Thanks: 215
Joa es geht nur darum, wie ich die unterschiedlichen Datentypen behandle.
In C++ war es DWORD PROCESS_VM_READ zB, oder HANDLE processhndl. Hier mal der Code in C++:

Code:
#include <iostream>
#include <stdlib.h>
#include <windows.h>

using namespace std;

class Trainer {
    public:
        Trainer();
        ~Trainer();
        int Pressed(int vkey);
        void SetMoneyValue();
        void GetHandles();
        void SetMoney();
        
    private:
        int ValueAddToMoney;
        HWND hWnd;
        HANDLE hProcess;
        DWORD dwProcessId;
        unsigned lpBaseAdress
        int buffer;
        DWORD rw; 
};

Trainer::Trainer()
{
    lpBaseAdress = 0x560264; //Hier Speicheradresse für Gold eingeben
    rw = 0;
}

Trainer::~Trainer()
{
    CloseHandle(hProcess);
}

void Trainer::SetMoneyValue()
{
    cout << "Wieviel Gold hinzufügen?n";
    cin >> ValueAddToMoney;
}

void Trainer::GetHandles()
{
  hWnd = FindWindowA(NULL, "Anno 1602");
  
  if (hWnd == 0) {
    cerr << "Fenster nicht gefunden. Prozess offen? Exit in 3 Sekunden.";
    Sleep(3000);
    exit(1);
  }
  
  GetWindowThreadProcessId(hWnd, &dwProcessId);

  hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
  
  if (hProcess == 0)
  {
  DWORD error = GetLastError();

  cout << "n Errorcode: " << error << "n";
  cout << "Handle konnte nicht initialisiert werden. Exit in 3 Sekunden.n";
  Sleep(3000);
  exit(1);
  }
}  

void Trainer::SetMoney()
{ 
  ReadProcessMemory(hProcess, (LPCVOID)lpBaseAdress, &buffer, sizeof(int), &rw);
  
  WriteProcessMemory(hProcess, (LPVOID)lpBaseAdress, &(buffer = buffer + ValueAddToMoney), sizeof(int), &rw);
}    
                  
int Trainer::Pressed(int vkey)
{
    //return GetAsyncKeyState(vkey);
}

int main(int argc, char *argv[])
{
  Trainer Anno;
  
  Anno.SetMoneyValue();
  Anno.GetHandles();
  
  while (true)
  {
      Sleep(50);
      if (Anno.Pressed(0x79)!= 0)
      {
          Anno.SetMoney();
      }    
  }  
  
  system("PAUSE");	
  return 0;
}
Jetzt steht da als 1 Argument der ReadProcessMemory Funktion: DWORD dwProcessId. DWORD gibts aber in C# nicht, also mache ich aus DWORD irgendwie IntPtr. Darum gehts im Endeffekt, wie ich der Funktion die DWORD, HANDLE und HWND Argumente liefere, ohne diese Datentypen in C# wirklich verfügbar zu haben.
Term!nX is offline  
Old 05/20/2008, 20:35   #5
 
elite*gold: 0
Join Date: Oct 2005
Posts: 2,485
Received Thanks: 215
Code:
            IntPtr phdl = OpenProcess(0x10, false, (uint)po.Id);
            if (phdl == null)
                MessageBox.Show("Prozesshandle konnte nicht erstellt werden! Prozess aktiv?", "Fehler!");
            uint size = 4;
            // uint vNumberOfBytesRead = 0;
            byte[] vBuffer = new byte[size];
            uint adress = 0x560264;
            uint size2 = sizeof(int);
            IntPtr rw;
            bool read;
            read = ReadProcessMemory(phdl, (IntPtr)adress, vBuffer, (UIntPtr)size2, out rw);
            if (!read)
                MessageBox.Show("ReadMem fehlgeschlagen.");
            bool write;
            vBuffer = BitConverter.
            write = WriteProcessMemory(phdl, (IntPtr)adress, vBuffer, (UIntPtr)size2, out rw);
            if (!write)
                MessageBox.Show("write fehlgeschlagen.");
So. ReadMemory klappt, gibt auch den richtigen Wert an. Jetzt weiss ich bei write memory nicht, wie ich den Wert des Buffers jetzt verändere, damit ich letzlich den Wert an der Speicherstelle verändern kann. Im Moment ist write immer false (vBuffer = BitConverter. ist absichtlich stehen gelassen und nicht der Fehler )
Term!nX is offline  
Old 05/20/2008, 23:23   #6
 
elite*gold: 0
Join Date: Apr 2004
Posts: 741
Received Thanks: 453
Wort = 1Byte
Dword = Doppelwort = 2Byte
Zumindest habe ich das mal so gelernt, du solltest einfach immer den Datentyp wählen in den die Zahl die von der WinAPI kommt rein passt.
Hättest dir vielleicht mal den Link den ich gepostet habe anschauen sollen, da ist genau so ein Beispiel aufgeführt:
Quote:
Arbeiten mit Strukturen

Ich wollte schon öfter den Akkustatus meines Laptops ermitteln. Win32 bietet Energieverwaltungsfunktionen für das Abrufen dieser Informationen.
Eine Suche im MSDN führt schnell zu der GetSystemPowerStatus()-Funktion.

BOOL GetSystemPowerStatus(
LPSYSTEM_POWER_STATUS lpSystemPowerStatus
);

Diese Funktion verarbeitet einen Zeiger auf eine Struktur. Darauf sind wir bisher noch nicht eingegangen. Für das Arbeiten mit Strukturen müssen wir eine Struktur in C# definieren. Wir beginnen mit der nicht verwalteten Definition:

typedef struct _SYSTEM_POWER_STATUS {
BYTE ACLineStatus;
BYTE BatteryFlag;
BYTE BatteryLifePercent;
BYTE Reserved1;
DWORD BatteryLifeTime;
DWORD BatteryFullLifeTime;
} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;

Anschließend schreiben wir eine C#-Version, indem wir die C-Typen durch ihre C#-Entsprechungen ersetzen.

struct SystemPowerStatus
{
byte ACLineStatus;
byte batteryFlag;
byte batteryLifePercent;
byte reserved1;
int batteryLifeTime;
int batteryFullLifeTime;
}

Nun können wir einfach den C#-Prototyp schreiben:

[DllImport("kernel32.dll")]
public static extern bool GetSystemPowerStatus(
ref SystemPowerStatus systemPowerStatus);
IntP(oin)tr sind übrig eigentlich für was anderes gedacht:


Da ich wieder selbst recherchieren müsste um den Quellcode nachzuvollziehen gucke ich mir das morgen mal an und schreibe dir vielleicht was dazu.
sirru is offline  
Thanks
1 User
Old 05/22/2008, 16:37   #7

 
x]vIrus[x's Avatar
 
elite*gold: 37
Join Date: Apr 2004
Posts: 2,154
Received Thanks: 250
Quote:
Originally Posted by sirru View Post
Wort = 1Byte
Dword = Doppelwort = 2Byte
Zumindest habe ich das mal so gelernt, du solltest einfach immer den Datentyp wählen in den die Zahl die von der WinAPI kommt rein passt.
Hättest dir vielleicht mal den Link den ich gepostet habe anschauen sollen, da ist genau so ein Beispiel aufgeführt:
IntP(oin)tr sind übrig eigentlich für was anderes gedacht:


Da ich wieder selbst recherchieren müsste um den Quellcode nachzuvollziehen gucke ich mir das morgen mal an und schreibe dir vielleicht was dazu.
word = 16bit = 2 byte
dword = 32bit = 4byte = in c# nimmt man dafür unsigned int, (uint)

ein handle ist einfach ein IntPtr
x]vIrus[x is offline  
Thanks
1 User
Old 05/22/2008, 16:45   #8
 
elite*gold: 0
Join Date: Oct 2005
Posts: 2,485
Received Thanks: 215
Danke, dass hilft mir schon weiter hab leider keine Zeit mir die Seiten vernünftig durchzulesen. Mal sehen, danke!
Term!nX is offline  
Old 05/22/2008, 20:09   #9
 
elite*gold: 0
Join Date: Oct 2005
Posts: 201
Received Thanks: 23
Quote:
Originally Posted by x]vIrus[x View Post
dword = 32bit = 4byte = in c# nimmt man dafür unsigned int, (uint)
Ich hätte dafür spontan einen Int32 genommen in c#.
Oder kann ein dword nicht negativ sein?
mondesser is offline  
Old 05/24/2008, 04:01   #10
 
elite*gold: 0
Join Date: Apr 2004
Posts: 741
Received Thanks: 453
Kommt ganz drauf an nehm ich an.
Der Unterschied zwischen Int und Uint besteht ja darin, dass beim normalen Integer das MSB als Vorzeichenbit verwendet wird und die Zahl deswegen um ein Bit kleiner ist.
Trotzdem sind sowohl int als auch unit beides 32 (ja ich glaube der viri hat Recht, ich war mir selber nicht ganz sicher) Bit Zahlen.
sirru is offline  
Old 06/08/2008, 14:43   #11
 
elite*gold: 0
Join Date: Oct 2005
Posts: 2,485
Received Thanks: 215
Öhm wenn ich ein bytearray habe.. Wie kann man das jetzt bearbeiten? Unter anderem möchte ich den Wert in int konvertieren, habe dazu das gemacht:

Code:
                int[] ints = new int[bytes.Length];
                for (int i = 0; i < bytes.Length; i++)
                {
                    ints[i] = bytes[i];
                }
                int val = 0;
                for (int k = 0; k < ints.Length; k++)
                {
                    val += ints[k];
                    MessageBox.Show(ints[k].ToString());
                }
                MessageBox.Show(val.ToString(), "Value:");
Aber val ist nicht richtig. Denn irgendwie muss ich das bytearray ja verändern, um einen neuen Wert zu schreiben.

In cpp macht man einfach &(buffer = buffer + x)
Term!nX is offline  
Old 06/08/2008, 17:43   #12
 
elite*gold: 0
Join Date: Oct 2005
Posts: 201
Received Thanks: 23
Quote:
Originally Posted by Term!nX View Post
Öhm wenn ich ein bytearray habe.. Wie kann man das jetzt bearbeiten? Unter anderem möchte ich den Wert in int konvertieren, habe dazu das gemacht:

Aber val ist nicht richtig. Denn irgendwie muss ich das bytearray ja verändern, um einen neuen Wert zu schreiben.

In cpp macht man einfach &(buffer = buffer + x)


Schau dir mal die Klasse an.
Die stellt genau das zur Verfügung, was du suchst.
mondesser is offline  
Old 06/08/2008, 19:14   #13
 
elite*gold: 0
Join Date: Oct 2005
Posts: 2,485
Received Thanks: 215
Fein Danke.
Term!nX is offline  
Old 06/09/2008, 01:15   #14
 
elite*gold: 20
Join Date: Sep 2006
Posts: 1,100
Received Thanks: 184
Die Größe des words hängt auch von der Prozessor Architektur ab, man kann also nicht sagen ein word entsprich 16bits, oder ein dword entschricht 32bits.
Bot_interesierter is offline  
Old 06/09/2008, 02:14   #15
 
-Anthrax-'s Avatar
 
elite*gold: 0
Join Date: Apr 2007
Posts: 542
Received Thanks: 112
Nein, ein DWORD ist unter x64 auch nur 32 Bit groß. Allerdings passen die nun verwendeten 64 Bit-Adressen nicht mehr in ein DWORD. Im MSDN-Artikel ist das alles wunderbar erklärt

c-p von ^^
-Anthrax- is offline  
Reply


Similar Threads Similar Threads
Winapi funktionen von kal blockiert?
05/17/2010 - Kal Online - 14 Replies
hi all ich beschäftige mich gerade damit einen kleinen bot zu machen. ich benutze die winapi funktionen. das programm funktioniert auch soweit so gut, ausser wenn ich in kal reingehe. ich vermute mal dass kal die winapi funktionen blockt. kann mir jemand sagen wie ich diese blockade umgehen kann? oder an was das liegen könnte? thx
winApi Pbot Hilfe
08/15/2009 - General Coding - 1 Replies
Guten Tag, eigentlich habe ich gehofft, dass ich nicht auf die Hilfe eines Forums angewiesen bin,aber da heftiges googlen letztendlich nichts ausgespuckt hat, habe ich mich entschieden, hier zu schreiben. Also, ich habe ein Problem. Da Memoryhacking mir eben zu langweilig wurde, habe ich mir mal überlegt, was ich so für (m)einen ersten Bot brauche. Ich habe mir folgende Überlegungen gemacht: #1 Er muss die Farben/Pixel suchen (Ich habe beide jeweils Teams sicherheitshalber in Grau...
Maussimulation ohne Winapi?
04/27/2009 - Kal Online - 1 Replies
Hi, Hat jemand von euch ne idee wie man ne Maussimulation ohne Winapi schreiben kann?. (Möcht n bot zum pimpen von waffen machen da mir der normale weg echt zu stressig sit ;). Nur as Problem ist dass Kal komplett mir alle bekannten Möglichkeiten sperrt. Jemand ne idee was man noch benutzen könnte?
[C++ newbie] WinApi gui frage
04/14/2009 - C/C++ - 7 Replies
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...
WinAPI use in C#
05/19/2008 - .NET Languages - 0 Replies
Hi, in Anlehnung an die Topics hier habe ich mich dazu aufgerafft, nen Annotrainer zu schreiben (siehe Attachment). In der Listview werden halt aktive Annoprozesse angezeigt, die man dann anwählen kann um dann mit dem Cheat button Geld zu cheaten. Jedes item in der Listview hat im item.Tag das jeweilige Prozessobject, somit auch die ID. Allerdings komme ich mit den eigentlichen Funktionen OpenProcess, ReadProcessMemory und WirteProcessMemory in C# noch nicht klar. Zwar bekomme ich das...



All times are GMT +2. The time now is 03:52.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.