C++ Memcpy

12/25/2010 23:12 ~kau~#1
Hey Leute,
wie immer!! hab mal ne Frage ;D Kann mir einer denn Fehler im Source sagen?!
Source:
t soll auf Addy übertragen werden, aber es ändert 0 immer in eine andere zahl oO
ty 4 Help :)
12/25/2010 23:47 Medix#2
der fehler sollte im letzten argument von memcpy liegen.

Quote:
DWORD Addy = 0x00AA678;
int t = 300;
memcpy((void*)Addy,&t,sizeof(t));
12/26/2010 01:15 ~kau~#3
ok fixxed ^^ kp wie aber es funzt jetzt 100%.
Nächste Frage : wenn meine addy char ist kann ich dann auch int addy nehmen oder muss ich da char/connest char* nehmen.
12/26/2010 02:24 bloodx#4
du kannst 300 nicht auf nur 1 byte schreiben deswegen ging deins auch nicht oO
12/26/2010 02:26 ~kau~#5
:O das hatte ich hier nicht verbessert in meinem source schon ;D aber ty...
12/26/2010 09:05 MoepMeep#6
Quote:
Originally Posted by kauknochen View Post
Hey Leute,
wie immer!! hab mal ne Frage ;D Kann mir einer denn Fehler im Source sagen?!
Jo, du kannst die Sprache nicht. Haste aber fein kopiert (:
12/28/2010 19:28 MrSm!th#7
Code:
#include <Windows.h>
#include <stdio.h>
#pragma warning(disable: 4312)
	
[COLOR="Red"]void Hack()[/COLOR]
        {
			int Addy = 0x00AA678;
			int t = 300;
            [COLOR="DarkOrange"]memcpy((void*)Addy,&t,1);[/COLOR]
        }

int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
    [COLOR="DarkOrange"]if(reason==DLL_PROCESS_ATTACH)
    {
        MessageBoxA(NULL, "Erfolgreich!", "Injection by ;D", MB_OK);
        CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)Hack, NULL, NULL, NULL);
    }[/COLOR]
    return true;
}
Rotes ist falsch, orangenes nicht ganz in Ordnung:

Statt memcpy kannst du für Werte, die die Größe von vier Bytes nicht überschreiten, einfach Pointer nutzen:

Code:
*(int*)Addy = t;
Ein Thread hat den Typ DWORD WINAPI und nicht void.
Code:
void Hack()
solltest du also nicht nutzen, um einen Thread zu erstellen.

Wenn du einen Thread beim injecten erstellst, solltest du ihm beim ejecten wieder beenden, damit das Programm nicht crasht. (Falls man die Möglichkeit haben soll, die Dll wieder rauszuholen; außerdem ist es für Tests der Dll auch praktisch, wenn man nicht immer das Programm neustarten muss, weil ejecten nicht möglich ist.)

Schlussendlich eine Antwort auf deine letzte Frage:

Quote:
Nächste Frage : wenn meine addy char ist kann ich dann auch int addy nehmen oder muss ich da char/connest char* nehmen.
1. heißt es const char, was Moeps Post untermauert, dass du die Sprache nichtmal kannst (das ist nicht das einzige, was seinen Post belegt)
2. Eine Adresse kann nicht int oder sonst was sein, eine Adresse ist eine Adresse. Was an dieser Adresse steht, ist dem Compiler scheißegal.

Du kannst also so etwas machen:

Code:
int x;
char *z = (char*)&x;
*z = 10;
Danach wird x den Wert 10 haben, als hättest du es x direkt zugewiesen oder einen int Pointer benutzt.
Die Datentypen sind nur für den Programmierer wichtig, damit er nicht durcheinander kommt, Pointer haben aber generell die gleiche Größe und es ist demnach völlig egal, welchen Typ die Variable eigentlich haben sollte, auf die er zeigt, die Wirkung am Ende im Programm ist die gleiche.
Der Compiler unterscheidet da nur, damit du nicht aus Versehen int Werte in Strings schreibst o.Ä..