| Autor |
Nachricht |
Robert1996
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.07.2011
Beiträge: 86
|
Robert1996 Mitglied
16:50:48 27.01.2012 Titel: |
Konstanter Speicherplatz |
Zitieren |
Hallo.
Ich habe mal wieder eine Frage: Wie kann man einem Programm anweisen, eine Variable immer an die selbe Stelle im RAM zu speichern. Sinn der Sache soll sein, das man mit folgendem Code einen Integer-Wert auslesen kann
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
HWND hWnd;
DWORD procid;
HANDLE hProc;
DWORD rw = 0;
int adress = 0x001B9000;
int buffer = 0;
hWnd = FindWindow(0, "Opfer");
if (!hWnd)
return 0;
GetWindowThreadProcessId(hWnd, &procid);
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);
if (ReadProcessMemory(hProc, (LPCVOID)adress, &buffer, sizeof(buffer), &rw))
{
cout << "Lesen erfolgreich . . ." << endl;
cout << buffer << endl;
}
buffer++;
if (WriteProcessMemory(hProc, (LPVOID)adress, &buffer, sizeof(buffer), &rw))
{
cout << "Schreiben erfolgreich . . ." << endl;
}
CloseHandle(hProc);
system("PAUSE");
return 0;
}
| |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
HWND hWnd;
DWORD procid;
HANDLE hProc;
DWORD rw = 0;
int adress = 0x001B9000;
int buffer = 0;
hWnd = FindWindow(0, "Opfer");
if (!hWnd)
return 0;
GetWindowThreadProcessId(hWnd, &procid);
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);
if (ReadProcessMemory(hProc, (LPCVOID)adress, &buffer, sizeof(buffer), &rw))
{
cout << "Lesen erfolgreich . . ." << endl;
cout << buffer << endl;
}
buffer++;
if (WriteProcessMemory(hProc, (LPVOID)adress, &buffer, sizeof(buffer), &rw))
{
cout << "Schreiben erfolgreich . . ." << endl;
}
CloseHandle(hProc);
system("PAUSE");
return 0;
}
| |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
HWND hWnd;
DWORD procid;
HANDLE hProc;
DWORD rw = 0;
int adress = 0x001B9000;
int buffer = 0;
hWnd = FindWindow(0, "Opfer");
if (!hWnd)
return 0;
GetWindowThreadProcessId(hWnd, &procid);
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);
if (ReadProcessMemory(hProc, (LPCVOID)adress, &buffer, sizeof(buffer), &rw))
{
cout << "Lesen erfolgreich . . ." << endl;
cout << buffer << endl;
}
buffer++;
if (WriteProcessMemory(hProc, (LPVOID)adress, &buffer, sizeof(buffer), &rw))
{
cout << "Schreiben erfolgreich . . ." << endl;
}
CloseHandle(hProc);
system("PAUSE");
return 0;
}
| |
Das geht nun bedeutend einfacher wenn das dazugehörige Opferprogramm immer an die selbe Stelle speichert.
Wenn das eine Rolle spielen sollte: mein OS ist Win7 HP 64bit
Danke im Voraus . . . |
|
|
|
 |
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
|
dot Mitglied
16:56:34 27.01.2012 Titel: |
|
Zitieren |
|
 |
Robert1996
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.07.2011
Beiträge: 86
|
Robert1996 Mitglied
17:01:27 27.01.2012 Titel: |
|
Zitieren |
Und wie baue ich das jetzt in meinen Code ein?
Einfach reinpasten geht nicht
OK . . . hat sich erledigt. Das musste man bei den Einstellungen machen.
Aber gibt es eine Möglichkeit das in den Code einzubetten? |
Zuletzt bearbeitet von Robert1996 am 17:05:19 27.01.2012, insgesamt 1-mal bearbeitet |
|
 |
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
|
dot Mitglied
17:07:49 27.01.2012 Titel: |
|
Zitieren |
Das soll ja auch nicht in deinen Code. Das ist ein Compilerflag. Du musst eben deine Zielanwendung entsprechend kompilieren... |
_________________ one point of view will never reveal the entire scene.
|
|
 |
Robert1996
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.07.2011
Beiträge: 86
|
Robert1996 Mitglied
17:11:13 27.01.2012 Titel: |
|
Zitieren |
Also gibt es keine Möglichkeit das direkt im Code festzulegen? |
|
|
|
 |
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
|
dot Mitglied
17:13:01 27.01.2012 Titel: |
|
Zitieren |
Wieso willst du das unbedingt im Code festlegen wenn du es einfach in den Einstellungen einstellen kannst? |
_________________ one point of view will never reveal the entire scene.
|
|
 |
Robert1996
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.07.2011
Beiträge: 86
|
Robert1996 Mitglied
17:20:19 27.01.2012 Titel: |
|
Zitieren |
Na weil mich sowas interessiert und ich eigentlich interessiert daran bin alles möglichst unabhängig von irgendwas zu machen |
|
|
|
 |
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
|
dot Mitglied
17:23:38 27.01.2012 Titel: |
|
Zitieren |
Well, there's your problem |
_________________ one point of view will never reveal the entire scene.
Zuletzt bearbeitet von dot am 17:27:01 27.01.2012, insgesamt 3-mal bearbeitet |
|
 |
Hi
Unregistrierter
|
Hi Unregistrierter
17:54:59 27.01.2012 Titel: |
Re: Konstanter Speicherplatz |
Zitieren |
| 3P!CF41L schrieb: | | ... wenn das dazugehörige Opferprogramm immer an die selbe Stelle speichert |
Du willst also eigentlich von einem fremden Programm (fertiges Binary ohne Source) Werte auslesen oder wie? |
|
|
|
 |
Robert1996
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.07.2011
Beiträge: 86
|
Robert1996 Mitglied
17:58:15 27.01.2012 Titel: |
|
Zitieren |
Genau...sone Art Trainer soll das mal werden
Dazu muss ich auch noch wissen, wie ich aus dem kompletten RAM werte auslesen kann.
bzw, wie kann man denn rauskriegen wo ein Programm "xyz" die variable "var1" speichert? |
|
|
|
 |
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
|
dot Mitglied
18:05:25 27.01.2012 Titel: |
|
Zitieren |
|
 |
Ethon
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.01.2011
Beiträge: 1114
|
Ethon Mitglied
18:25:31 27.01.2012 Titel: |
|
Zitieren |
Reverse Engineering !
Wenn du zb soetwas hast:
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | struct A
{
int a;
int b;
};
struct B
{
float c;
A* d;
int e;
}
B* globalB = new B; | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | struct A
{
int a;
int b;
};
struct B
{
float c;
A* d;
int e;
}
B* globalB = new B; | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | struct A
{
int a;
int b;
};
struct B
{
float c;
A* d;
int e;
}
B* globalB = new B; | |
Und du bist an dem Wert b in der Klasse A interessiert, dann kann es sein dass du zuerst die Addresse von globalB finden musst, 4 addieren + dereferenzieren, auf das Ergebnis nochmal 4 addieren und wieder dereferenzieren musst.
Ein Beispiel was so aussehen könnte: Ein Spiel, globalB ist ein Zeiger der immer auf den den aktuellen Spieler zeigt, B ist eine Struktur die Spieler hält und in A stehen Informationen über den Status des Spielers, zb HP. |
|
|
|
 |
kkkkkkkkkk
Unregistrierter
|
kkkkkkkkkk Unregistrierter
20:58:43 27.01.2012 Titel: |
|
Zitieren |
Ist es nicht so, dass das seit Windows 7 nicht mehr möglich ist? |
|
|
|
 |
Hi
Unregistrierter
|
Hi Unregistrierter
21:05:24 27.01.2012 Titel: |
|
Zitieren |
Was soll nicht mehr möglich sein? Wenn man eine statische Adresse findet, nimmt man einfach die moduleBase + offset, und findet so immer den selben Wert.
Findet man überhaupt keinen statischen Bezug, muss man sich an entsprechenden Stellen im Code "einklinken".
Versuchs mal mit http://www.cheatengine.org |
|
|
|
 |
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
|
dot Mitglied
21:13:49 27.01.2012 Titel: |
|
Zitieren |
Das Problem ist die ASLR... |
_________________ one point of view will never reveal the entire scene.
|
|
 |
MisterX
Unregistrierter
|
MisterX Unregistrierter
12:44:29 28.01.2012 Titel: |
|
Zitieren |
| dot schrieb: | | Das Problem ist die ASLR... |
Das ist doch kein Problem. Es wird doch nur die Startadresse zufällig gewählt. Und die kann man abfragen. Der Offset zur eigentlichen Adresse bleibt gleich. |
|
|
|
 |
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
|
dot Mitglied
12:52:57 28.01.2012 Titel: |
|
Zitieren |
| MisterX schrieb: | | dot schrieb: | | Das Problem ist die ASLR... |
Das ist doch kein Problem. Es wird doch nur die Startadresse zufällig gewählt. Und die kann man abfragen. Der Offset zur eigentlichen Adresse bleibt gleich. |
Ja, aber das ist eben etwas, was man berücksichtigen muss... |
_________________ one point of view will never reveal the entire scene.
|
|
 |
Patrickssj6
Mitglied
Benutzerprofil
Anmeldungsdatum: 08.01.2012
Beiträge: 87
|
Patrickssj6 Mitglied
14:59:08 28.01.2012 Titel: |
|
Zitieren |
| dot schrieb: | | MisterX schrieb: | | dot schrieb: | | Das Problem ist die ASLR... |
Das ist doch kein Problem. Es wird doch nur die Startadresse zufällig gewählt. Und die kann man abfragen. Der Offset zur eigentlichen Adresse bleibt gleich. |
Ja, aber das ist eben etwas, was man berücksichtigen muss... |
Stimmt, aber das ist sein geringstes Problem glaube ich Vor allem weil 90% der Programme immer bei 0x400000 anfangen.
BaseAddress + Offset zeigt auf nen Pointer.
Pointer dereferenzieren + Offset zeigt auf den Wert den du willst.
Danach kannst du dich richten. |
|
|
|
 |
Ethon
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.01.2011
Beiträge: 1114
|
Ethon Mitglied
19:05:42 28.01.2012 Titel: |
|
Zitieren |
| dot schrieb: | | Das Problem ist die ASLR... |
Die man sowohl systemweit als auch in der Executable selbst abstellen kann. System weit würde per Registry gehen, ist aber ein Sicherheitsproblem. Den Flag in der Exe entfernen ist kein Problem, einfach nen PE-Editor nehmen.
Obwohl es wirklich nicht zuviel verlange ist, am Anfang die Module-Liste mit den tlhelp32 Funktionen zu lesen, sich die Addresse des Hauptmodules zu merken und darauf Offsets zu addieren. |
|
|
|
 |
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
|
dot Mitglied
20:46:05 28.01.2012 Titel: |
|
Zitieren |
Ja, das ist alles richtig. Das ändert aber nix dran dass das Problem des Threaderstellers die ASLR ist/war. Und genau das hab ich gesagt |
_________________ one point of view will never reveal the entire scene.
|
|
 |
Robert1996
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.07.2011
Beiträge: 86
|
Robert1996 Mitglied
20:47:28 29.01.2012 Titel: |
|
Zitieren |
Nachdem ich nach ein paar Tutorials geguckt habe bin ich auch auf ein brauchbares gestoßen. Ich scheitere aber nach wenigen Zeilen. Der Tutor^^ verwendet einen Dateityp namens "Window" und bei mir gibts den nicht. . .In welcher header-Datei findet man den denn? |
|
|
|
 |
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
|
dot Mitglied
20:57:42 29.01.2012 Titel: |
|
Zitieren |
Das solltest du den Tutor fragen... |
_________________ one point of view will never reveal the entire scene.
|
|
 |
yxMan
Unregistrierter
|
yxMan Unregistrierter
21:09:44 29.01.2012 Titel: |
|
Zitieren |
| 3P!CF41L schrieb: | | einen Dateityp namens "Window" |
lass mich raten: die zugehörige Variable heißt HWND |
|
|
|
 |
noergel reloaded
Unregistrierter
|
noergel reloaded Unregistrierter
23:37:30 29.01.2012 Titel: |
|
Zitieren |
[quote="Patrickssj6"]| dot schrieb: |
Stimmt, aber das ist sein geringstes Problem glaube ich Vor allem weil 90% der Programme immer bei 0x400000 anfangen.
|
glauben ist nicht wissen |
|
|
|
 |
Der aus dem Westen ...
Mitglied
Benutzerprofil
Anmeldungsdatum: 06.12.2010
Beiträge: 1277
|
Der aus dem Westen ... Mitglied
23:50:06 29.01.2012 Titel: |
|
Zitieren |
Bei 3P!CF41L ist wohl der Name Programm ...
Wie schon der yxMan meinte, ist es wohl eher eine Variable mit Namen hWindow, und zwar vom Typ HWND. Was das ist, kann ich gerne erklären:
Mit Windows kann man arbeiten. Man kann sogar einigermaßen gut mit Windows arbeiten. Aber man weiß nicht, wie das System in seinem Innersten funktioniert, weil der Quellcode unter Verschluss steht. Mit der API des Systems kann man tolle Sachen machen, aber auch hier stößt man manchmal auf Grenzen, die sich "Handles" nennen. Hierbei handelt es sich um Zeiger auf Speicher - um Werte ... ähhh, ungefähr so, die Implementierung dieser Typen ist nicht offen, die behält Microsoft für sich. Wenn du dir die Definition dieser Typen anschaust, stolperst du über den Wert "unused", was einfach nur heißt, dass du nicht wissen sollst, was wirklich hinter dem Objekt steckt. Du kannst dich allerdings darauf verlassen, dass, wenn du Funktionen der API, welche diese verschlossenen Objekte verwenden, aufrufst, diese das Objekt ordentlich behandeln werden.
Es gibt mehrere Handle-Typen, und manchmal verschwimmen die Grenzen zueinander auch. HANDLE steht für Datei-Handles, Heap-Handles und Konsolenhandles, diese sind von der Definition und dem Typ her gleich und können in bestimmten Kontexten ausgewechselt werden. HWND steht für Handle for Windows, HCURSOR ist ein Handle auf einen Cursor, HDC einer auf einen Device Context usw ... |
|
|
|
 |
Robert1996
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.07.2011
Beiträge: 86
|
Robert1996 Mitglied
18:57:23 30.01.2012 Titel: |
|
Zitieren |
Also...bei mir ist nicht Name Programm! Hör auf zu flamen. Ich weiß schon was ich da gelesen habe und ich habe es auch hier richtig geschrieben! Mittlerweile hat sich das auch geklärt. Das war ein Struct namens 'Window'. Also frag bevor du rumtrollst . . . |
|
|
|
 |
Robert1996
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.07.2011
Beiträge: 86
|
Robert1996 Mitglied
19:10:58 31.01.2012 Titel: |
|
Zitieren |
Wie kann man denn die ASLR abschalten? Und das möglichst dauerhaft? |
|
|
|
 |
Hi
Unregistrierter
|
Hi Unregistrierter
20:31:51 31.01.2012 Titel: |
|
Zitieren |
Es bringt dir doch nix.
Und selbst ohne ASLR ist es nicht 100%ig, dass ein Modul immer die selbe Base hat. |
|
|
|
 |
Robert1996
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.07.2011
Beiträge: 86
|
Robert1996 Mitglied
20:53:32 31.01.2012 Titel: |
|
Zitieren |
Es bringt mir sehr wohl was. Dann kann ich nämlich den Trainer programmieren ohne alle RAM-Adressen zu durchsuchen. Wenn der Wert einen bestimmten Platz hat ist es doch einfacher, ihn zu verändern . . . |
|
|
|
 |
Ethon
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.01.2011
Beiträge: 1114
|
Ethon Mitglied
21:06:49 31.01.2012 Titel: |
|
Zitieren |
| 3P!CF41L schrieb: | | Wie kann man denn die ASLR abschalten? Und das möglichst dauerhaft? |
Etwa so als wenn du in nem Autoforum fragst wie du deinen Airbag entfernen kannst.
| Zitat: | | Es bringt mir sehr wohl was. Dann kann ich nämlich den Trainer programmieren ohne alle RAM-Adressen zu durchsuchen. Wenn der Wert einen bestimmten Platz hat ist es doch einfacher, ihn zu verändern . . . |
Was willst du durchsuchen? Anstatt der festen Addresse holst du dir die Basisaddresse und addierst das Offset drauf, fertig.
Tipp: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686701%28v=vs.85%29.aspx |
Zuletzt bearbeitet von Ethon am 21:07:29 31.01.2012, insgesamt 1-mal bearbeitet |
|
 |
Robert1996
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.07.2011
Beiträge: 86
|
Robert1996 Mitglied
21:19:48 31.01.2012 Titel: |
|
Zitieren |
OK. Bevor ich jetzt komplett abschalte, kannst du mir bitte erklären was eine Basisadresse und was das Offset ist? |
|
|
|
 |
Ethon
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.01.2011
Beiträge: 1114
|
Ethon Mitglied
21:47:53 31.01.2012 Titel: |
|
Zitieren |
Als Basisaddresse nimmst du die Addresse, an der das Hauptmodul geladen wurde.
Zb. (Ist zwar Linux, aber egal):
| Zitat: | 00400000-0040b000 r-xp 00000000 fd:01 2752531 /bin/cat
0060a000-0060b000 r--p 0000a000 fd:01 2752531 /bin/cat
0060b000-0060c000 rw-p 0000b000 fd:01 2752531 /bin/cat
01b05000-01b26000 rw-p 00000000 00:00 0 [heap]
7fb02d347000-7fb02e387000 r--p 00000000 fd:01 265831 /usr/lib/locale/locale-archive
7fb02e387000-7fb02e51c000 r-xp 00000000 fd:01 1314480 /lib/x86_64-linux-gnu/libc-2.13.so
7fb02e51c000-7fb02e71b000 ---p 00195000 fd:01 1314480 /lib/x86_64-linux-gnu/libc-2.13.so
7fb02e71b000-7fb02e71f000 r--p 00194000 fd:01 1314480 /lib/x86_64-linux-gnu/libc-2.13.so
7fb02e71f000-7fb02e720000 rw-p 00198000 fd:01 1314480 /lib/x86_64-linux-gnu/libc-2.13.so
7fb02e720000-7fb02e726000 rw-p 00000000 00:00 0
7fb02e726000-7fb02e747000 r-xp 00000000 fd:01 1314467 /lib/x86_64-linux-gnu/ld-2.13.so
7fb02e919000-7fb02e91c000 rw-p 00000000 00:00 0
7fb02e944000-7fb02e946000 rw-p 00000000 00:00 0
7fb02e946000-7fb02e947000 r--p 00020000 fd:01 1314467 /lib/x86_64-linux-gnu/ld-2.13.so
7fb02e947000-7fb02e949000 rw-p 00021000 fd:01 1314467 /lib/x86_64-linux-gnu/ld-2.13.so
7fff39ce5000-7fff39d06000 rw-p 00000000 00:00 0 [stack]
7fff39dff000-7fff39e00000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] |
Hier wurde das Programm cat an Addresse 0x400000 geladen. Wenn du jetzt eine interessante Speicherstelle an 0x400ABC gefunden hast, dann merkst du dir nicht 0x400ABC sondern (0x400ABC - 0x400000) = 0xABC, das ist also das Offset zur Basisaddresse. Wenn das Programm das nächste mal an 0x800000 geladen wird, dann addierst du einfach 0xABC darauf und hast wieder die richtige Speicherstelle.
Um die Basisaddresse unter Windows zu finden gehst du einfach mit den Module-Funktionen aus meinem Link die Liste durch, bis du auf ein Modul mit dem exakt selben Namen wie deine Exe stößt (Bei Notepad zb. "notepad.exe"). Dann merkst du dir einfach die Addresse, an die das Modul geladen wurde, und machst von da aus deine Additionen/Substraktionen.
Hoffe es wurde etwas klarer. |
|
|
|
 |
Robert1996
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.07.2011
Beiträge: 86
|
Robert1996 Mitglied
21:53:57 31.01.2012 Titel: |
|
Zitieren |
Naja...ich brauche ja die Basisadresse des anderen Programmes. Eben jenes, in das ich mich einklinken will. Wie bekomme ich dessen BA raus? |
Zuletzt bearbeitet von Robert1996 am 22:00:53 31.01.2012, insgesamt 1-mal bearbeitet |
|
 |
zeusosc
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.12.2006
Beiträge: 745
|
zeusosc Mitglied
22:09:31 03.02.2012 Titel: |
|
Zitieren |
|
 |