Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

1

18.09.2009, 22:56

kernel mode strukturen im usermode auslesen?

Hallo

ich versuche grade mich in LoadLibrary reinzuhooken, um eine DLL aus
dem speicher laden zu können. dazu fange ich alle filesystem-funktionen
ab, z.b. NtOpenFile.

die parameter der funktion bekomme ich schön per pointer an meine
hookfunktion. sieh sehen so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
struct NtOpenFileParameter
{
  PHANDLE FileHandle;
  ACCESS_MASK DesiredAccess;
  POBJECT_ATTRIBUTES ObjectAttributes;
  PIO_STATUS_BLOCK IoStatusBlock;
  ULONG ShareAccess;
  ULONG OpenOptions;
};


im vc++ debugger (mein lieblingstool :) ) sehe ich alle werte, nur
kann ich die "ObjectAttributes" nicht einsehen. liegen irgentwo
um 0x01000000 oder so.

diesen parameter brauche ich aber, um an den dateinamen zu kommen.

auch mit ReadProcessMemory komme ich nicht an die daten.

wie komme ich jetzt an den dateinamen ?
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

2

19.09.2009, 01:58

Hi,
ich glaub dein Ansatz allein ist schon zum Scheitern prädistiniert :)

Angenommen der Code in der DLL macht ein GetModuleFileName mit dem hInstance, das DllMain übergeben wurde, und versucht, diese Datei auszulesen, dann wirds krachen ;) Selbst wenn du Kontrolle über den Code hast, du weißt nicht, was die Win32 Funktionen intern alles machen.

Machs doch wie jeder andere, extrahier die Resource in ne temporäre Datei und ein LoadLibrary darauf.

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

3

19.09.2009, 11:12

Zitat von »"Helmut"«


Angenommen der Code in der DLL macht ein GetModuleFileName mit dem hInstance, das DllMain übergeben wurde, und versucht, diese Datei auszulesen, dann wirds krachen


hm da ist was dran, aber wer sagt den, dass GetModuleFileName nicht
auch gehookt ist? und überhaupt, wieviele programme lesen sich selber
aus, wenn sie s doch schon im speicher stehen. nicht viele.

und warum sollte das crashen? das einzige was GetModuleFileName zurück
gibt ist der name den ich LoadLibrary gegeben habe (+verzeichnis).
im schlimmsten fall gibts beim öffnen der datei n nullhandle. außerdem
habe ich immernoch die kontrolle über openfile ;)

es geht nicht sosehr um den praktischen nutzen, aber ich höre immerwieder,
dass das so nicht geht und man:

Zitat von »"Helmut"«


Machs doch wie jeder andere, extrahier die Resource in ne temporäre Datei und ein LoadLibrary darauf.


machen sollte... das MUSS anders gehen.

ich vermute mittlerweile, der fehler liegt in der parameterreihenfolge.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

4

19.09.2009, 13:30

Zitat von »"Gotbread"«

und überhaupt, wieviele programme lesen sich selber
aus, wenn sie s doch schon im speicher stehen. nicht viele.

Ziemlich viele würd ich sagen, ein einfaches LoadIcon dürfte reichen. Außerdem wird der Code der DLL niemals in die Auslagerungsdatei geschoben. Wenn der Speicher knapp wird, wird der Speicher ganz gelöscht, und wenn er wieder gebraucht wird, wird er direkt wieder aus der Datei geladen. Also auf unterster Stufe, wenn du dich also nicht 1a mit dem Kernelmode auskennst, würde ich das lassen.

Und was hast du eigentlich gegen den temp Ansatz? Einen Dummypfadnamen brauchst du bei deinem Ansatz auch und wenn du CreateFile das richtige Flag übergibst, wird sich die Festplatte kein Stück bewegen müssen.

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

5

19.09.2009, 17:54

nungut, an loadicon hab ich nicht gedacht. das flag ist mir bekannt,
aber es geht ja nur um die theorie.

den fehler habe ich schon beheben können, es lag am hooking-code,
der die parameter um 4 byte verschoben hatte.

aber du hast recht, createfile ist schöner.

ist es den garantiert, dass eine temporäre datei, die von der größe
in den chache passt, niemals im explorer zu sehen sein wird (und auch nicht
auf der disk)?
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

6

19.09.2009, 18:08

Ich denke nicht. Zumindest der Explorer wird die Datei immer anzeigen, auch wenn sie nicht auf der Festplatte ist. Aber selbst wenn nicht, Programme wie Processexplorer können alle geladenen DLLs anzeigen.

Kann es sein, dass du nicht willst, dass man an deinen Code rankommt? Dann würde ich den Code direkt in den Speicher laden, ev. entschlüsseln und ausführen. Lässt sich natürlich alles umgehen...

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

7

19.09.2009, 18:36

den code können sie haben, ich möchte nur keine festplattenzugriffe.

kann man einer geladenen DLL einfach so den boden wegziehen? (DeleteFile)
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

8

19.09.2009, 18:59

Ja wie gesagt, dann benutz das Flag. DeleteFile geht nicht, wohl aber MoveFile ;) (wird dir aber natürlich nicht helfen:))

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

9

19.09.2009, 19:48

und wenn ich da wieder was mit hooks baue? ich hab neulich mal ein
sysinternal (heißen die so? ) beispiel gesehen, wo eine beliebige offene
datei geschloßen wurde. vielleicht klappt das ja :)
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

10

19.09.2009, 20:48

Und was soll das bringen?

Das einzige was passiert, ist dass wahrscheinlich das System abstürzt (BSOD), wenn der Speicher nicht benötigt wird, gelöscht wird, und das System ihn wieder laden möchte.

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Werbeanzeige