[C++]Assemblercode ändern

10/21/2010 13:25 schrillismus#1
Wie kann ich bei einem laufenden Prozess den Assemblercode auf einer bestimmten Adresse ändern?
Ich habe es schon mmit diesem Code hier versucht, aber das hat leider nicht funktioniert.
Code:
#include <windows.h> 
#include <iostream> 
using namespace std;

int main()  
{
HWND hwnd;
hwnd = FindWindow(0,L"Plants vs. Zombies");
DWORD Id; 
HANDLE ProcessHandle;
int value;
unsigned adress = 0x0041D406; 
int opcode = 90;


if(!hwnd) 
    {
    cout << "Prozess nicht gefunden!" << endl; 
    }
else  
    {
    cout << "Prozess gefunden!" << endl; 
    cout << "Fensterhandle: " << hwnd << endl; 
       
        GetWindowThreadProcessId(hwnd,&Id);

        cout << Id << endl;
        ProcessHandle = OpenProcess(PROCESS_VM_WRITE |PROCESS_VM_OPERATION ,false,Id);
    
    cout << "ProcessHandle: " << ProcessHandle << endl;

    WriteProcessMemory(ProcessHandle,(LPVOID)adress,&opcode,1,NULL); 
    cout << "Wert geschrieben" << endl;
    cin.get();

    }
}
10/21/2010 14:34 Lazeboy#2
ich mache das per Byte denn eigentlich ist der Assembler codes nix anderes als Bytes.



Code:
#include <windows.h> 
#include <iostream> 
using namespace std;

int main()  
{
HWND hwnd;
hwnd = FindWindow(0,L"Plants vs. Zombies");
DWORD Id; 
HANDLE ProcessHandle;
int value;
unsigned adress = 0x0041D406; 
[COLOR="Red"]BYTE opcode = 0x90;    // in hex 0x90   = nop  
//beim array so   BYTE opcode[] ={0x90,0x90,0x90};[/COLOR]


if(!hwnd) 
    {
    cout << "Prozess nicht gefunden!" << endl; 
    }
else  
    {
    cout << "Prozess gefunden!" << endl; 
    cout << "Fensterhandle: " << hwnd << endl; 
       
        GetWindowThreadProcessId(hwnd,&Id);

        cout << Id << endl;
        ProcessHandle = OpenProcess(PROCESS_VM_WRITE |PROCESS_VM_OPERATION ,false,Id);
    
    cout << "ProcessHandle: " << ProcessHandle << endl;

    [COLOR="Red"]WriteProcessMemory(ProcessHandle,(LPVOID)adress,&opcode,sizeof(opcode),NULL); [/COLOR]
    cout << "Wert geschrieben" << endl;
    cin.get();

    }
}
10/21/2010 15:05 schrillismus#3
Ok, ich habe es mit dem neuen Code versucht, aber es kommt immernoch eine Fehlermeldung:
Quote:
Exception: Access Violation (code 0xc0000005) at address 0041D40A in thread 134C
Module: PflanzenGegenZombies_og.exe
Logical Address: 0001:0001C40A

0018FB70 0041D40A 0001:0001C40A PflanzenGegenZombies_og.exe
Params: 0E824430 00000002 0018FC4C 00000001


EAX:00000032 EBX:00000032 ECX:FFFFFFFF EDX:0E824430 ESI:00000000 EDI:0E824430
EIP:0041D40A ESP:0018FB6C EBP:0E824430
CS:0023 SS:002B DS:002B ES:002B FS:0053 GS:002B
Flags:00010246
10/21/2010 15:35 Lazeboy#4
benutzt du Visual Studio ?
10/21/2010 15:43 schrillismus#5
Ja, dieses programm habe ich mit Visual Studio Express 2010 gemacht.
Falls das ein Problem ist, habe ich mir heute gerade die Ultimate version installiert.
10/21/2010 16:36 Lazeboy#6
bei mir funktioniert das wunderbar so du brauchst halt noch DebugPriveleges aber hat ja nix mit dem fehler zu tun

versuch mal das
[Only registered and activated users can see links. Click Here To Register...]
10/21/2010 16:49 schrillismus#7
Nein, das Programm ist dazu da, bei dem Spiel die Funktion zu noppen, die dafür verantwortlich ist, dass einem Cash abgezogen wird.
Also starte ich das Programm und es schreibt in den Speicher des Spiels. Das Spiel funktioniert dann solange weiter, bis ich etwas kaufe; dann kommt die Fehlermeldung.
10/21/2010 17:46 wurstbrot123#8
Falsch gepatcht.
10/21/2010 17:53 schrillismus#9
Wenn ich bei Olly auf der gleichen Adresse noppe, funktioniert es perfekt.
10/21/2010 18:46 ms​#10
Sicher, dass du auch nur 1 Byte nopen willst?
10/21/2010 19:05 schrillismus#11
Nein, ich bin mit überhaupt nicht sicher :D
Das könnte wirklich das problem sein...
Hier ist die Zeile, die ich noppen will:
[Only registered and activated users can see links. Click Here To Register...]
10/21/2010 19:17 mydoom#12
Du brauchst anscheinend 6x 0x90, weil die Anweisung 6 Byte lang ist.
10/21/2010 19:42 schrillismus#13
Also würde das so aussehen:
Code:
BYTE opcode[] ={0x90,0x90,0x90,0x90,0x90};
Edit: Ja, danke man, jetzt hat es Funktioniert! :smile:
10/21/2010 20:20 P-a-i-n#14
Quote:
Originally Posted by schrillismus View Post
Also würde das so aussehen:
Code:
BYTE opcode[] ={0x90,0x90,0x90,0x90,0x90};
Edit: Ja, danke man, jetzt hat es Funktioniert! :smile:
Wenn dann so ist ja ein Array
BYTE opcode[5] ={0x90,0x90,0x90,0x90,0x90};
10/21/2010 20:47 ms​#15
Quote:
Originally Posted by P-a-i-n View Post
Wenn dann so ist ja ein Array
BYTE opcode[5] ={0x90,0x90,0x90,0x90,0x90};
Ob in den eckigen Klammern 5 steht oder gar nichts macht in diesem Fall keinen Unterschied. Für das Array wird hier automatisch eine Größe von 5 angenommen.