DMA in C++ umgehen

03/21/2009 18:39 Bot_interesierter#16
OMG
Der Typ von Speicher Adressen ist unsigned long und nicht unsigned int, das ist extrem wichtig, denn so geht dir ein Teil der Adresse verloren...
Beschäftige dich erstmal ein wenig mit Daten Typen bevor du versuchst irgendwas mit C++ an zu fangen, nur wenn du die Daten Typen verstehst kannst du auch mit Zeigern richtig umgehen und kommst dann von alleine darauf wie du einen Zeiger per ReadProcessMemory benutzten kannst.

Obwohl es vermutlich sinnlos ist hier mal "funktionierender" Code für dein Beispiel:
PHP Code:
int value;
unsigned long address1=0x0071A0;
unsigned long address2;
ReadProcessMemory(ProcessHandle,(LPVOID)adress1,&adress2,sizeof(unsinged long),NULL);
ReadProcessMemory(ProcessHandle,(LPVOID)adress2,&value,sizeof(int),NULL); 
Der erste ReadProcessMemory Aufruf liest die Adresse auf die der Pointer zeigt in die Variable address2, da Adressen den Daten Typ unsinged long haben muss auch die Größe von diesem Daten Typ übergeben werden.

Da du mit Daten Typen scheinbar nicht wirklich vertraut bist wird dir das ganze wohl wenig sagen ^^
03/24/2009 14:24 Pat Garrett#17
Quote:
Obwohl es vermutlich sinnlos ist hier mal "funktionierender" Code für dein Beispiel:
Failed. Er funktioniert nicht. ;) Und ja, ich bin schon von selber auf die Idee gekommen statt unsinged unsigned zu schreiben. Das Ergebnis ist exakt das selbe wie bei meinen Versuchen.

Und bitte korrigier mich, wenn ich falsch liege, aber sind auf 32-Bit System unsigned long und unsigned int nicht gleich groß und zwar 32 Bit von 0 bis 4 Milliarden irgendwas, in Hexadezimal FFFFFFFF?
Ich hab ja bestimmt keine Ahnung also korrigier mich einfach wenn ich Unsinn rede.

edit:

OMG!
03/24/2009 17:57 Bot_interesierter#18
Quote:
Originally Posted by Pat Garrett View Post
Failed. Er funktioniert nicht. ;) Und ja, ich bin schon von selber auf die Idee gekommen statt unsinged unsigned zu schreiben. Das Ergebnis ist exakt das selbe wie bei meinen Versuchen.

Und bitte korrigier mich, wenn ich falsch liege, aber sind auf 32-Bit System unsigned long und unsigned int nicht gleich groß und zwar 32 Bit von 0 bis 4 Milliarden irgendwas, in Hexadezimal FFFFFFFF?
Ich hab ja bestimmt keine Ahnung also korrigier mich einfach wenn ich Unsinn rede.

edit:

OMG!
Mein C++ Buch sagt 16bit int sei die Standard Größe, allerdings kann es ja auch sein das du mehr Ahnung als der Buch Autor hast, naja egal

Mal eine andere Sache, versuchst du immer noch ohne Debug Rechte ReadProcessMemory auf zu rufen?
03/24/2009 18:03 Adroxxx#19
PHP Code:
void EnableDebugPrivilege( ) {

    
TOKEN_PRIVILEGES priv;
    
HANDLE hThishToken;
    
LUID luid;

    
hThis GetCurrentProcess();

    
OpenProcessToken(hThisTOKEN_ADJUST_PRIVILEGES, &hToken);
 
    
LookupPrivilegeValue(0"seDebugPrivilege", &luid);

    
priv.PrivilegeCount 1;
    
priv.Privileges[0].Luid luid;
    
priv.Privileges[0].Attributes SE_PRIVILEGE_ENABLED;

    
AdjustTokenPrivileges(hTokenfalse, &priv000);
    
CloseHandle(hToken);
    
CloseHandle(hThis);

03/24/2009 18:39 Pat Garrett#20
Quote:
Originally Posted by Bot_interesierter View Post
Mein C++ Buch sagt 16bit int sei die Standard Größe, allerdings kann es ja auch sein das du mehr Ahnung als der Buch Autor hast, naja egal
Hab ich in dem Fall wohl tatsächlich. Int ist in 32-bit Systemen auch 32 Bit lang. In 16-bit System lediglich 16 Bit. Kannst ja mal ausprobieren einer Unsigned Int den Wert 4.000.000.000 zuzuweisen, wenn du mir nicht glaubst.

Quote:
Mal eine andere Sache, versuchst du immer noch ohne Debug Rechte ReadProcessMemory auf zu rufen?
Nein, hab es inzwischen schon mit Debug-Rechten probiert. Funktioniert auch nicht. Das Lesen aus anderen Adressen funktioniert ja auch einwandfrei, nur wenn ich aus dem Pointer lesen möchte, macht er Faxen.
03/24/2009 19:29 Bot_interesierter#21
PHP Code:
#include <iostream>


int main(int argccharargv[]){
int a=4000000000;
std::cout << a<<std::endl;


Quote:
xxx@xxxx:~/Dokumente$ g++ blub.cc
blub.cc:5: Warnung: diese Dezimalkonstante ist nur in ISO-C90 vorzeichenlos
blub.cc:8:2: Warnung: Kein Newline am Dateiende
blub.cc: In function »int main(int, char**)«:
blub.cc:5: Warnung: Große Ganzzahl implizit auf vorzeichenlosen Typen abgeschnitten
xxx@xxxx:~/Dokumente$ ./a.out
10240
Dann ist mein Rechner wohl 'ne 16bit Maschine ^^
03/24/2009 19:33 Adroxxx#22
unsigned short != unsigned int!
03/24/2009 20:12 Bot_interesierter#23
Quote:
Originally Posted by Adroxxx View Post
unsigned short != unsigned int!
Wo siehst du denn ein unsigned short :>
03/24/2009 20:21 Adroxxx#24
Geändert von Bot_interesierter (Heute um 20:11 Uhr)

yaaayaa :P ^,^
03/24/2009 23:01 Pat Garrett#25
Und, nochmal mit normaler Integer ausprobiert? ;)

Ich weiß jedenfalls immernoch nicht, was ich falsch gemacht habe. Ich bin gerade dabei an mir zu zweifeln, ob ich den falschen Pointer hab, was ich aber stark bezweifle. Was kann man mit CE und Solitair schon so falsch machen beim Suchen eines Pointers? :S
03/24/2009 23:09 Adroxxx#26
@Bot_interesierter

Ich muss dir jetzt aber nicht sagen, das int weniger positive werte unterstützt als unsigned oder?

signed int = 2 Mrd unsinged int 4Mrd , signed geht ja von -2 mrd bis +2 mrd.
Unsigned nur bis +4mrd.
03/25/2009 11:54 Bot_interesierter#27
Quote:
Originally Posted by Adroxxx View Post
@Bot_interesierter

Ich muss dir jetzt aber nicht sagen, das int weniger positive werte unterstützt als unsigned oder?

signed int = 2 Mrd unsinged int 4Mrd , signed geht ja von -2 mrd bis +2 mrd.
Unsigned nur bis +4mrd.
pssssst sonst fällt noch auf das mein C++ Buch einfach veraltet ist und integer inzwischen wirklich 32bit lang sind XD

@Pat Garrett
Du solltest wirklich mal überprüfen ob dein Pointer stimmt, mach das am besten mit CheatEngine und sonst kann ich dir nur raten Debug ausgaben in deinen Programmen zu machen, oder ein Debug Log zu schreiben, das hilft beim finden von Logischen und anderen Fehlern.
03/25/2009 11:58 Adroxxx#28
Ich habs nix gesagt ;)

@ Pat Garrett, lass dir doch die zwischenadresse auch ausgeben, als textausgabe oder messagebox. Dann weißt du schonmal ob die zwischenadresse richtig ist usw. fehlersuche ftw! :D
03/25/2009 12:07 Pat Garrett#29
Natürlich schon getan. Die Adresse ist völliger Humbug und stimmt niemals.
Hab auch schon min. 5 mal auf 2 verschiedenen Rechnern überprüft, ob der Pointer richtig ist. Der MUSS richtig sein, es gibt einfach keine andere Lösung. Wenn jemand mal kurz Lust/Zeit hat, könnte er mir ja einen Gefallen tun und überprüfen welchen Pointer er bei Solitär herauskriegt.

Bei mir ist es bis jetzt jedes mal 0x0071A0 gewesen, bzw. 0x007170 mit Offset 30.

EDIT: GetLastError sagt: "Only part of a ReadProcessMemory or WriteProcessMemory request was completed."
03/25/2009 12:14 Adroxxx#30
Für was ist der pointer? Die Punkte?

Der Pointer funzt bei mir nicht. 0x007170 + offset 30 geht nicht.