Konstanter Speicherplatz
-
3P!CF41L schrieb:
einen Dateityp namens "Window"
lass mich raten: die zugehörige Variable heißt HWND
-
[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
-
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 TypHWND
. 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 ...
-
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 . . .
-
Wie kann man denn die ASLR abschalten? Und das möglichst dauerhaft?
-
Es bringt dir doch nix.
Und selbst ohne ASLR ist es nicht 100%ig, dass ein Modul immer die selbe Base hat.
-
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 . . .
-
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.
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(v=vs.85).aspx
-
OK. Bevor ich jetzt komplett abschalte, kannst du mir bitte erklären was eine Basisadresse und was das Offset ist?
-
Als Basisaddresse nimmst du die Addresse, an der das Hauptmodul geladen wurde.
Zb. (Ist zwar Linux, aber egal):
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.
-
Naja...ich brauche ja die Basisadresse des anderen Programmes. Eben jenes, in das ich mich einklinken will. Wie bekomme ich dessen BA raus?
-
Hat ethon doch schon geschrieben:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686701(v=vs.85).aspxerst DURCHLESEN (echt jetzt...) dann Fragen !