Entwickler-Ecke

Freeware Projekte - TNT


AHT - Do 24.01.08 20:22
Titel: TNT
...zu einer Zeit, als ich mich ziemlich intensiv mit dem Windows sicherheitssystem beschäftigt habe, bin ich auf einen Artikel über Chris Paget und die Shatter Attack gestoßen. Ich war damals über den Artikel sehr shockiert - nicht nur darüber, wie einfach es angeblich sein sollte, über ein Edit und eine Timer Message einen Service für eigene Zwecke zu kapern, sondern besonders darüber, dass Microsoft damals gar nicht darauf reagiert hatte.
Nun kam, dass ich gezwungen war mich notgedrungen für ein Jahr von meinem Internetanschluss zu trennen - und um nicht allzuviel Langeweile aufkommen zu lassen, hatte ich mir vorgenommen, der ganzen Sache bezüglich der Gefährlichkeit dieser Attacke mal etwas auf den Grund zu gehen...
Damals hatte ich noch so wenig Ahnung von Windows, dass ich gar nicht wusste, wie wenig ich weiß; jetzt bin ich da schon etwas weiter und weiß mit Bestimmtheit, dass ich eigentlich gar nichts weiß :wink:.
Was macht man aber, wenn man vor irgendeinem Problem steht, von nichts eine Ahnung hat, nirgendwo nachlesen kann und sich keine passenden Tools verschaffen kann? Man schreibt sich selbst ein kleines Tool [http://home.pages.at/fundgrube/TNT.zip], das es einem ermöglicht, sich selbst Ahnung zu verschaffen; also ein Tool [http://home.pages.at/fundgrube/TNT.zip], das zumindesten Usermode Speicher und Zugriffsrechte anderer Prozesse scannen und ändern kann. Daraus entstanden ist dieses Tool [http://home.pages.at/fundgrube/TNT.zip], mit dessen Erkenntnissen es mir als total Ahnungslosem Progger möglich war, Shatter nicht nur nachzuproggen, sondern sogar zu belegen, dass gar kein Edit nötig ist um Code zu injizieren, um durch Shatter aus einem eingeschränkten Account Administratorrechte zu bekommen. Microsoft musste damals zu den selben Erkenntnissen gekommen sein und kurz vorher Shatter mittels Servicepack 2 gefixt.


Das "Ding" das ich da verbrochen habe und öfters mal mit dem Kosenamen "TNT" bezeichne, kann natürlich noch viel mehr als bloß Usermode Speicher scannen, da ich gleich zur Arbeit muss, kann ich aber eine ausführliche Beschreibung hier jetzt nicht reinsetzen und reiche diese hier noch nach - also vielleicht einfach einmal überall rechts und links klicken und überraschen lassen. Es ist nicht in reinem Delphi programmiert, sondern in einer aus Delphi heraus erstellten Programmiersprache - deshalb über die etwas lahme Geschwindigkeit nicht wundern.

Warum steht es jetzt hier: Ich möchte ganz gerne mal wissen, ob mein kleines Kind auch für andere Leute vielleicht brauchbar ist, wo ich etwas ändern, verbessern oder erleichtern sollte, wo Fragen offenstehen und wo ich mir einfach nur riesengroße Fehler eingebaut habe ohne diese zu bemerken (das pssiert mir andauernd). Das Ding ist unter 2000/XP entwickelt worde - was unter Vista davon noch funktioniert, würde ich auch gerne wissen.
Über Rückmeldungen, egal welcher Art, würde ich mich sehr, sehr freuen und eine etwas umfangreichere Anleitung wird bei Bedarf nachgeliefert.

user defined image


Moderiert von user profile iconChristian S.: Topic aus Sonstiges (Delphi) verschoben am Do 24.01.2008 um 19:32


Blackheart666 - Do 24.01.08 20:31

Hab nur die ersten drei Zeilen gelesen dann hab Ich es aufgegeben.
Du hast doch nicht etwa einen Anschlag auf die Augen der User vor. :wink:


AHT - Do 24.01.08 20:36

user profile iconBlackheart666 hat folgendes geschrieben:
Hab nur die ersten drei Zeilen gelesen dann hab Ich es aufgegeben.
Du hast doch nicht etwa einen Anschlag auf die Augen der User vor. :wink:


Das sollte nur zur Einstimmung auf das was noch kommt sein. Für die Erklärungen, was das Programm alles so kann und wie das funktioniert, reichen 3 Bildschirmseiten längst nicht aus. :(


Blackheart666 - Do 24.01.08 20:40

So hab Ich das nicht gemeint, Du solltest deinen Text mal vernünftig einrücken sonst bekommt man Augenschmerzen beim lesen.


Timosch - Do 24.01.08 21:06

Nach dem Start siehts etwas verwirrend aus, weil man gleich "Für dieses Objekt nicht verfügbar!" sieht. Ist ja logisch, wenn noch kein Objekt ausgewählt ist, aber vielleicht wäre so was wie "Wählen Sie einen Prozess" besser.
Aber ansonsten: Gefällt mir sehr sehr gut. Ich liebe solche Tools.


AHT - Fr 25.01.08 09:11
Titel: Re: TNT
Zitat:

Nach dem Start siehts etwas verwirrend aus, weil man gleich "Für dieses Objekt nicht verfügbar!" sieht. Ist ja logisch, wenn noch kein Objekt ausgewählt ist, aber vielleicht wäre so was wie "Wählen Sie einen Prozess" besser.
Aber ansonsten: Gefällt mir sehr sehr gut. Ich liebe solche Tools.

Ja, ist nicht so ganz gut gelungen. Vielleicht sollte ich beim Start gleich die Prozessliste ausklappen und den ersten Prozess auswählen.


Sinspin - Fr 25.01.08 22:55

Erstmal: Hut Ab! Geniales Teil. :flehan:

Das bringt mich doch gleich wieder zur politischen Laage in Deutschland. Und dazu das dieses Forum öffentlich lesbar ist.
Meine Güte, man kann ja schon ärger bekommen, wenn man nur der Besitzer des PC's ist über den jemand, von solch einem mords gefährlichen Programm erfahren hat. :mahn: :rofl:


AHT - Sa 26.01.08 09:39

user profile iconSinspin hat folgendes geschrieben:
Erstmal: Hut Ab! Geniales Teil. :flehan:

Das bringt mich doch gleich wieder zur politischen Laage in Deutschland. Und dazu das dieses Forum öffentlich lesbar ist.
Meine Güte, man kann ja schon ärger bekommen, wenn man nur der Besitzer des PC's ist über den jemand, von solch einem mords gefährlichen Programm erfahren hat. :mahn: :rofl:


Ich glaube da irrst du dich :lol:. Bin rechtlich da sehr gut auf dem Laufenden und kann dir versichern, dass dieses Tool definitiv nicht unter den von dir da gemeinten Paragraphen des StGB fällt. Im Gegenteil - das Tool testet sogar bei Bedarf, ob Shatter in deiner Windowsversion gefixt ist und warnt dich - ist also ganz nebenbei ein sehr nützliches Sicherheitstool :D!

Hat keiner Fragen zu dem Ding? Wäre es sinnvoll, hier mal eine "kleine" Betriebsanleitung zu posten? Der Funktionsumfang ist enorm - listet unter anderem bei Bedarf auch Fenster, die Windows normalerweise sehr gründlich versteckt.


BlackDragon - Di 29.01.08 14:12

Hi.

Auf den ersten Blick sieht das Tool schon nicht schlecht aus. Mehr kann ich noch nicht sagen, werde es aber noch ausgiebig testen.

Da du über jedes Feedback erfreut bist, hätte ich gleich zwei kleine optischen Mängel bei den Systeminfos. :P

- Vielleicht solltest du die Speicherwerte dem User nicht als Bytes präsentieren...
- Bei Auslagerungsdatei gesamt steht meine ich ein "-" vor dem Wert...

Ansonsten gute Arbeit. 8) Weiter so...

Mfg

BlackDragon


AHT - Mi 30.01.08 09:01

user profile iconBlackDragon hat folgendes geschrieben:

...werde es aber noch ausgiebig testen.

BESTENS! Danke!!! Bin gespannt... :)

user profile iconBlackDragon hat folgendes geschrieben:

Da du über jedes Feedback erfreut bist, hätte ich gleich zwei kleine optischen Mängel bei den Systeminfos.

Sehr schön! :)

user profile iconBlackDragon hat folgendes geschrieben:

- Vielleicht solltest du die Speicherwerte dem User nicht als Bytes präsentieren...

Habe schon selbst darüber nachgedacht :gruebel: - bin aber ein "Pennigfuchser" und mag so viele Zahlen hinter dem Komma irgendwie nicht.

user profile iconBlackDragon hat folgendes geschrieben:

- Bei Auslagerungsdatei gesamt steht meine ich ein "-" vor dem Wert...

Das ist ernst gemeint: Ich habe hier schon eine ganze Zeit lang mit einer Lupe vor meinem PC gesessen und dieses "-" gesucht :lupe: - hast du mal einen Screenshot :crying:? Ich finde das Ding bei mir einfach nicht... :autsch:


Sinspin - Mi 30.01.08 12:26

Fehler in Bildern.


AHT - Mi 30.01.08 18:08

user profile iconSinspin hat folgendes geschrieben:
Fehler in Bildern.

Besten Dank, das hilft mir schon eine ganze Ecke weiter! Die Ursache ist bei beiden Fehlern einleuchtend - ich werde erst noch sammeln, da kommt bestimmt noch mehr zusammen, und danach fixen. :zustimm:


Jakob Schöttl - Mi 30.01.08 20:36

aber du könntest die Zahl der Bytes (Registerkarte Systeminfo) wenigstens mit Trennpunkten bei jedem 3er Block angeben, zB. "1.326.234.632 Bytes" mit dieser Funktion zB.:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function Mit1000erTrennung(Argument: string; TrennChar: char): string;
var n,i: integer;
begin
  Result := Argument;
  n := Length(Result);
  if n > 3 then begin
    i := 0;
    While n > 0 do begin
      inc(i);
      if (i >= 3and (n > 1then begin
        Insert(TrennChar,Result,n);
        i := 0;  
      end;
      dec(n);
    end;
  end;
end;


AHT - Do 31.01.08 09:32

user profile iconJakob Schöttl hat folgendes geschrieben:
aber du könntest die Zahl der Bytes (Registerkarte Systeminfo) wenigstens mit Trennpunkten bei jedem 3er Block angeben, zB. "1.326.234.632 Bytes" mit dieser Funktion zB.:...


Die Idee mit den Tausendertrennzeichen ist gar nicht schlecht; werde das aber, wenn ich das so mache, anders lösen - das soll schneller gehen.


pigfacejoe - Di 05.02.08 13:15

Hi AHT,

ich habe mir gestern in aller Ruhe dein Programm angesehen und ich finde TNT echt super, also erstmal Hut ab :zustimm:

Fehler habe ich eigentlich nicht gefunden( ich kenne mich aber auch nicht wirklich mit diesen Speicherzugriffsrechten aus.. :oops: ), ich kann mich eigentlich nur den bisher genannten Kritikpunkten anschließen:
- am Anfang die Meldung "Für dieses Objekt nicht verfügbar" evtl. ersetzen durch "Bitte einen Prozess aus untenstehender Liste" auswählen oder so.
- Bei den Systeminfos am besten die RAM Infos in Megabyte ausgeben..
- Bei jedem Prozess, den ich wähle steht unten "Falscher Parameter" was hat das eig zu bedueten?

Wahrscheinlich hilft dir dieser Beitrag nicht wirklich weiter, aber da du mich darum gebeten hast, auch mal dein Tool zu testen , hätte ich ein schlechtes Gewissen gehabt, wenn ich es nicht gemacht hätte... :D

Gruss
PigfaceJoe


Silas - Di 05.02.08 13:25

user profile iconAHT hat folgendes geschrieben:
user profile iconJakob Schöttl hat folgendes geschrieben:
aber du könntest die Zahl der Bytes (Registerkarte Systeminfo) wenigstens mit Trennpunkten bei jedem 3er Block angeben, zB. "1.326.234.632 Bytes" mit dieser Funktion zB.:...


Die Idee mit den Tausendertrennzeichen ist gar nicht schlecht; werde das aber, wenn ich das so mache, anders lösen - das soll schneller gehen.


Diese Funktion ist bei einem von meinen Projekten sozusagen als Nebenprodukt entstanden, du könntest es mal damit versuchen: Sie gibt den Plattenplatz in Byte, KB, MB, GB oder TB mit zwei Stellen hinterm Komma an.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function FormatDiskSpace(Bytes: Int64): String;
begin
  // Wenn Bytes, direkt kopieren
  if Bytes < 1000 then Result := IntToStr(Bytes) + ' Byte'
  // Ansonsten umrechnen
  else if Bytes < 1000000 then Result := FloatToStrF(Bytes / 1024, ffNumber,
    162) + ' KB'
  else if Bytes < 1000000000 then Result := FloatToStrF(Bytes / 1048576,
    ffNumber, 162) + ' MB'
  else if Bytes < 1000000000000 then Result := FloatToStrF(Bytes /
    1073741824, ffNumber, 162) + ' GB'
  else Result := FloatToStrF(Bytes / 1099511627776, ffNumber, 162) + ' TB';
end;


AHT - Di 05.02.08 13:50

user profile iconSilas hat folgendes geschrieben:

Diese Funktion ist bei einem von meinen Projekten sozusagen als Nebenprodukt entstanden, du könntest es mal damit versuchen:

Erst mal besten Dank. Das Problem (und die anderen hier erwähnten) habe ich auf meiner Version schon gefixt, habe Tausendertrennzeichen genommen - das geht bei mir am schnellsten. Das Update wird innerhalb der nächsten Tage noch hochgeladen, warte noch etwas auf weitere Bugmeldungen. Die Funktion für die Aktualisierung rufe ich über einen Timer Callback auf. Das Programm ist nicht direkt in Delphi geschrieben, sondern in einer in Delphi entwickelten Programmiersprache - einfach anzuwenden und mit extrem großer Funktionsumfang (sollte das der Entwickler dieser Sprache hier lesen, weiß er jetzt ganz genau, wer ich bin). Callbacks machen bei dieser Sprache nicht selten Probleme - möchte da also nicht zu viel in den Callback reinbauen.


Sinspin - Mi 06.02.08 18:20

Also, ich vermute mal du meinst mit der Programmiersprache XProfan.
Nur, das ich da jeden enttäschen muss! Das ist keine Programmiersprache, sondern ein heulendes Elend. (Meine Meinung)
Wer Basic Programmieren will kann das auch auf andere Art.


AHT - Mi 06.02.08 19:19

user profile iconSinspin hat folgendes geschrieben:
Also, ich vermute mal du meinst mit der Programmiersprache XProfan.
Nur, das ich da jeden enttäschen muss! Das ist keine Programmiersprache, sondern ein heulendes Elend. (Meine Meinung)
Wer Basic Programmieren will kann das auch auf andere Art.

Ich wollte auch keine Werbung für die Programmiersprache machen, sondern nur erklären, warum ich mit euren Codes hier nichts anfangen kann - ich meine, die nicht einbauen kann - und das Proggie langsam ist. Ich habe nie irgendwie großartig etwas was Programmierung angeht gelernt (als ich zur Schule ging, gab es noch keine PCs) und mir alles selbst beigebracht, kann aber schon ganz gut mit den Leuten mithalten, die Ahnung haben. Für mich ist diese Sprache genau das richtige. Bin vor kurzem Opa geworden - da hat man wirklich schon Probleme sich umzustellen. :D

PS:
Irgendwann will man bloss mal auch ganz gerne seine Ergebnisse Leuten vorstellen, die nicht immer nur denken man spricht chinesisch, wenn man von Access Token und virtuellem Speicher redet und für die ein "Test" nur darin besteht, in möglichst kurzer Zeit das "X" zum Austellen des Programmes zu finden.
Das Programm hat fast 1 Jahr in einem anderen Forum gestanden, ohne das es irgendwelche Kommentare gegeben hätte oder gar die hier angesprochenen Fehler aufgefallen wären.
Echt frustrierend sowas.

Es geht mir hier darum, mich mit Leuten auszutauschen, die Ahnung haben, und etwas von dem was ich weiß weiterzugeben. API ist API - die Sprache bleibt sich gleich.

Gruß

AHT


Sinspin - Mi 06.02.08 20:29

user profile iconAHT hat folgendes geschrieben:

Es geht mir hier darum, mich mit Leuten auszutauschen, die Ahnung haben, und etwas von dem was ich weiß weiterzugeben. API ist API - die Sprache bleibt sich gleich.

Ich habe auch nix gegen deine Programme gesagt, die sind einfach zu gut um darüber her zu fallen. Auch dass das mit *so* einer Sprache geht ist schon genial. Aber ich empfinde diese Spache als sehr schwehr verständlich und sehr unübersichtlich, wobei es da noch ganz andere, häufiger verwendete Sprachen gibt, die wesentlich übler sind.

Ich finde, das du hier genau im richtigen Forum bist um deine Programme vorzustellen, den wir alle können hier voneinander lernen. Und das trotz der *Sprachbariere*.


AHT - Do 07.02.08 09:06

Zitat:

Ich finde, das du hier genau im richtigen Forum bist um deine Programme vorzustellen, den wir alle können hier voneinander lernen. Und das trotz der *Sprachbariere*.

Genau das denke ich auch.


AHT - Mo 11.02.08 18:34

Habe gerade ein Update hochgeladen und folgende Sachen geändert und gefixt:

- Bei Auslagerungsdateien über 2GB werden nun (hoffentlich) keine negativen Werte mehr angezeigt.

- Die Speicherangaben auf der System-Infos Registrierkarte sind nun mit Tausendertrennzeichen versehen.

- Beim Beenden von Threads und Prozessen wurde als Parameter ein unlogischer Wert übergeben, was unter anderem bei Sachen wie den "AntiVir Zombies" [http://www.delphi-forum.de/topic_Merkwuerdigkeiten+in+Windows+XP_78104.html] zu merkwürdigen Exitcodes führte.

- Bei den Threadinfos werden nun die Momentanwerte einiger Register angezeigt. Wird ein Thread nicht angehalten, ist das eigentlich witzlos; ich brauchte die Register aber für andere Sachen, die ich noch vorhabe.

- Wenn Adressen im Listview in Hexformat umgewandelt wurden, kann jetzt per Rechtsklick auch optional nur der Hexwert ohne das Stringzeichen in die Zwischenablage kopiert werden, was eine Verwendung der Werte in Disassemblern einfacher macht.

- Eine weitere versteckte und undokumentierte Funktion wurde eingebaut (Parameterabhängig), die eigentlich nur für mich von Bedeutung ist.

- In einigen Popupmenüs fehlten Trennstriche - habe die Dinger hinzugefügt.

Optional ist per Rechtsklick statt des Treeviews eine Erklärung zu den im Listview markierten Werten einblendbar. Die Erklärungen befinden sich in der Datei TAT.INI. Der Aufbau ist, denke ich, auch ohne Erklärung zu verstehen. Wer dort in den Erklärungen Verbesserungen und Erweiterungen vornehmen will, kann das gerne tun und dazu eingeladen, die Änderungen hier zu posten.

PS: Unter http://home.pages.at/fundgrube/TNT.zip gibt es einen zweiten Download, der eine zusätzliche spezielle Hilfedatei enthält - auch wenn die Codes darin nicht in Delphi sind, dürfte der Inhalt doch für den ein oder anderen sehr interessant sein.


Timosch - Mo 11.02.08 18:40

user profile iconAHT hat folgendes geschrieben:

- Eine weitere versteckte und undokumentierte Funktion wurde eingebaut (Parameterabhängig), die eigentlich nur für mich von Bedeutung ist.

Ich bin ein neugieriger Mensch... :)


AHT - Mo 11.02.08 18:50

user profile iconTimosch hat folgendes geschrieben:

Ich bin ein neugieriger Mensch... :)

Zum einen gibt es da eine kleine Besonderheit in Bezug auf Handles von Hauptfenstern, die Microsoft bislang nicht verraten hat; zum anderen gibts es noch die Möglichkeit, sich über TNT Zombies anzeigen zu lassen.

Beides würde beim Arbeiten mit TNT eher zu Irritationen führen, behalte diesen Parameter also erst einmal für mich.


mael - Di 12.02.08 22:48

Hallo,

Ich habe mal ein bisschen mit deinem Programm rumgespielt. Gerade wegen Vista sind die Informationen bzgl. der Tokens und der Rechte ganz interessant. Auch gefällt mir die ausführliche Hilfe ganz gut.

Am meisten interessiert mich die DLL-Injektionsfunktion, das werde ich sicher öfter gebrauchen können um Sachen in anderen Programmen zu testen. Ich werde Dein Programm also in Zukunft wohl öfter verwenden.

Grüße, Maël.

P.S.: Ich sage das *nicht* nur weil Du mein Programm auch gelobt hast :-)


AHT - Mi 13.02.08 16:44

user profile iconmael hat folgendes geschrieben:
Gerade wegen Vista sind die Informationen bzgl. der Tokens und der Rechte ganz interessant.


Hallo mael (und an alle anderen mit Vista)...

Bezüglich Vista dürftem dem Tool noch Infos über den Token fehlen. Wenn ich irgendwann dazu einmal die Geleggenheit habe, wird das Ding noch erweitert.

Ich habe leider nicht die Möglichkeit, mir das Tool unter Vista anzusehen, mich würden folgende Sachen unter Windows Vista brennend interessieren:

- Wenn TNT mit Administrationsrechten gestartet wurde, funktioniert dann im Menü "Als Service starten" noch? Das Tool müsste sich dann im System Account (Account des Betriebsystems unter anderem für Services) starten und der Accountname in der Taskleiste müsste sich ändern.

- Kannst du mal Infos über den Token hier reinkopieren?
Folgende Sachen würden mich brennend interessieren:
Das dürfte auch anderen hier helfen. Lässt sich alles mittels Rechtsklick in die Zwischenablage einfügen.

Gruß

AHT


mael - Mi 13.02.08 17:51

Ich habe momentan leider kein Vista installiert.


Dezipaitor - Mi 13.02.08 23:19

Zitat:

Wenn TNT mit Administrationsrechten gestartet wurde, funktioniert dann im Menü "Als Service starten" noch? Das Tool müsste sich dann im System Account (Account des Betriebsystems unter anderem für Services) starten und der Accountname in der Taskleiste müsste sich ändern.


Ja+Nein, aber
du startest dein Programm in der Session 0 - also der Service Session. Unter Vista erscheint dann die Meldung, dass ein Dienst versucht eine GUI zu öffnen. Man kann dann zu dem Dienst Desktop wechseln.
Du musst schon die korrekte SessionID mit CreateProcessAsUser und dem Token verwenden. Um dein Programm mit SYSTEM Rechten auf dem Userdesktop zu starten kannst du
1. einfach ein SYSTEM Prozess in dieser Session suchen und an CreateProcessAsUser anhängen (WTSEnumerateProcesses) :winlogon.exe und csrss.exe gibt es für jede Session mit SYSTEM token.
2. dein eigenes Token duplizieren, ntsetinformation mit classtype sessionid aufrufen um die Session ID zu ändern und dann damit CreateProcessAsUser auszuführen .

Die GUI sollte bei beiden Varianten korrekt dargestellt werden, da SYSTEM Zugriff auf den Desktop hat. Daher funktioniert das aber nicht bei Benutzern im fremden Desktop.


Dezipaitor - Do 14.02.08 00:03

user profile iconAHT hat folgendes geschrieben:


- Kannst du mal Infos über den Token hier reinkopieren?
Folgende Sachen würden mich brennend interessieren:[list]
[*]vorhandene Privilegien eines normalen Programmes

Die Privilegien sind direkt vom Benutzertoken abgeleitet. Jeder Prozess bekommt seine eigene Kopie vom Benutzertoken.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Berechtigungsname             Beschreibung                                   Status
============================= ============================================== ===========
SeAssignPrimaryTokenPrivilege Ersetzen eines Tokens auf Prozessebene         Deaktiviert
SeShutdownPrivilege           Herunterfahren des Systems                     Deaktiviert
SeChangeNotifyPrivilege       Auslassen der durchsuchenden Überprüfung       Aktiviert
SeUndockPrivilege             Entfernen des Computers von der Dockingstation Deaktiviert
SeIncreaseWorkingSetPrivilege Arbeitssatz eines Prozesses vergrößern         Deaktiviert
SeTimeZonePrivilege           Ändern der Zeitzone                            Deaktiviert


Zitat:

[*]Default-DACL eines normal
gestarteten Programmes

ACE Count: 3


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
#0
ClassName: TJwDiscretionaryAccessControlEntryAllow
AceType: Allow
Flags:
Accessmask: STANDARD_RIGHTS_READ or TOKEN_ASSIGN_PRIMARY or TOKEN_DUPLICATE or TOKEN_IMPERSONATE or TOKEN_QUERY or TOKEN_QUERY_SOURCE or TOKEN_ADJUST_
DEFAULT or TOKEN_ADJUST_SESSIONID or WRITE_DAC or WRITE_OWNER or DELETE
SID: chris@ TestBenutzer (S-1-5-21-2721915288-875847878-2597518166-1004) []

#1
ClassName: TJwDiscretionaryAccessControlEntryAllow
AceType: Allow
Flags:
Accessmask: STANDARD_RIGHTS_READ or TOKEN_ASSIGN_PRIMARY or TOKEN_DUPLICATE or TOKEN_IMPERSONATE or TOKEN_QUERY or TOKEN_QUERY_SOURCE or TOKEN_ADJUST_
DEFAULT or TOKEN_ADJUST_SESSIONID or WRITE_DAC or WRITE_OWNER or DELETE
SID: NT-AUTORIT─T@ SYSTEM (S-1-5-18) []

#2
ClassName: TJwDiscretionaryAccessControlEntryAllow
AceType: Allow
Flags:
Accessmask: STANDARD_RIGHTS_READ or TOKEN_IMPERSONATE or TOKEN_QUERY or TOKEN_QUERY_SOURCE or  1024 [$400]
SID:   (S-1-5-5-0-147361) []


Zitat:

[*]Gruppen eines normal
gestarteten Programmes



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Gruppenname                                              Typ                 SID          Attribute
======================================================== =================== ============ ===============================================================
Jeder                                                    Bekannte Gruppe     S-1-1-0      Verbindliche Gruppe, Standardmäßig aktiviert, Aktivierte Gruppe
VORDEFINIERT\Benutzer                                    Alias               S-1-5-32-545 Verbindliche Gruppe, Standardmäßig aktiviert, Aktivierte Gruppe
NT-AUTORITÄT\INTERAKTIV                                  Bekannte Gruppe     S-1-5-4      Verbindliche Gruppe, Standardmäßig aktiviert, Aktivierte Gruppe
NT-AUTORITÄT\Authentifizierte Benutzer                   Bekannte Gruppe     S-1-5-11     Verbindliche Gruppe, Standardmäßig aktiviert, Aktivierte Gruppe
NT-AUTORITÄT\Diese Organisation                          Bekannte Gruppe     S-1-5-15     Verbindliche Gruppe, Standardmäßig aktiviert, Aktivierte Gruppe
LOKAL                                                    Bekannte Gruppe     S-1-2-0      Verbindliche Gruppe, Standardmäßig aktiviert, Aktivierte Gruppe
NT-AUTORITÄT\NTLM-Authentifizierung                      Bekannte Gruppe     S-1-5-64-10  Verbindliche Gruppe, Standardmäßig aktiviert, Aktivierte Gruppe
Verbindliche Beschriftung\Mittlere Verbindlichkeitsstufe Unbekannter SID-Typ S-1-16-8192  Verbindliche Gruppe, Standardmäßig aktiviert, Aktivierte Gruppe


Zitat:

[*]Default-DACL eines mit Adminrechten
gestarteten Programmes


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
ACE Count: 3

#0
ClassName: TJwDiscretionaryAccessControlEntryAllow
AceType: Allow
Flags:
Accessmask: STANDARD_RIGHTS_READ or TOKEN_ASSIGN_PRIMARY or TOKEN_DUPLICATE or TOKEN_IMPERSONATE or TOKEN_QUERY or TOKEN_QUERY_SOURCE or TOKEN_ADJUST_PRIVILEGES or TOKEN_ADJUST_GROUPS or TOKEN_ADJUST_DEFAULT or TOKEN_ADJUST_SESSIONID or WRITE_DAC or WRITE_OWNER or DELETE
SID: VORDEFINIERT@ Administratoren (S-1-5-32-544) []

#1
ClassName: TJwDiscretionaryAccessControlEntryAllow
AceType: Allow
Flags:
Accessmask: STANDARD_RIGHTS_READ or TOKEN_ASSIGN_PRIMARY or TOKEN_DUPLICATE or TOKEN_IMPERSONATE or TOKEN_QUERY or TOKEN
_QUERY_SOURCE or TOKEN_ADJUST_PRIVILEGES or TOKEN_ADJUST_GROUPS or TOKEN_ADJUST_DEFAULT or TOKEN_ADJUST_SESSIONID or WRITE_DAC or WRITE_OWNER or DELETE
SID: NT-AUTORIT─T@ SYSTEM (S-1-5-18) []

#2
ClassName: TJwDiscretionaryAccessControlEntryAllow
AceType: Allow
Flags:
Accessmask: STANDARD_RIGHTS_READ or TOKEN_IMPERSONATE or TOKEN_QUERY or TOKEN_QUERY_SOURCE or  1024 [$400]
SID:   (S-1-5-5-0-147361) []


Zitat:

[*]Gruppen eines mit Adminrechten
gestarteten Programmes



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 None,  enabled
 Jeder,         enabled
 Benutzer,      enabled
 Administratoren,       owner
 INTERAKTIV,    enabled
 Authentifizierte Benutzer,     enabled
 Diese Organisation,    enabled
 S-1-5-5-0-147361,      logon ID
 LOKAL,         enabled
 NTLM-Authentifizierung,        enabled
 Hohe Verbindlichkeitsstufe,    integrity enabled


Zitat:

[*]Default-DACL eines im Account
"System" gestarteten Programmes


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
ACE Count: 2
\#0
ClassName: TJwDiscretionaryAccessControlEntryAllow
AceType: Allow
Flags: 
Accessmask: STANDARD_RIGHTS_READ or TOKEN_ASSIGN_PRIMARY or TOKEN_DUPLICATE or TOKEN_IMPERSONATE or TOKEN_QUERY or TOKEN_QUERY_SOURCE or TOKEN_ADJUST_PRIVILEGES or TOKEN_ADJUST_GROUPS or TOKEN_ADJUST_DEFAULT or TOKEN_ADJUST_SESSIONID or WRITE_DAC or WRITE_OWNER or DELETE
SID: NT-AUTORITÄT@ SYSTEM (S-1-5-18) []

#1
ClassName: TJwDiscretionaryAccessControlEntryAllow
AceType: Allow
Flags: 
Accessmask: STANDARD_RIGHTS_READ or TOKEN_IMPERSONATE or TOKEN_QUERY or TOKEN_QUERY_SOURCE or  1024 [$400]
SID: VORDEFINIERT@ Administratoren (S-1-5-32-544) []


SYSTEM Token Gruppen

Quelltext
1:
2:
3:
4:
5:
6:
Gruppenname                                           Typ                 SID          Attribute                                                      
===================================================== =================== ============ ===============================================================
VORDEFINIERT\Administratoren                          Alias               S-1-5-32-544 Standardm„áig aktiviert, Aktivierte Gruppe, Gruppenbesitzer    
Jeder                                                 Bekannte Gruppe     S-1-1-0      Verbindliche Gruppe, Standardm„áig aktiviert, Aktivierte Gruppe
NT-AUTORITŽT\Authentifizierte Benutzer                Bekannte Gruppe     S-1-5-11     Verbindliche Gruppe, Standardm„áig aktiviert, Aktivierte Gruppe
Verbindliche Beschriftung\Systemverbindlichkeitsstufe Unbekannter SID-Typ S-1-16-16384



SYSTEM Prozess Privilegien:

Quelltext
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:
BERECHTIGUNGSINFORMATIONEN
--------------------------

Berechtigungsname               Beschreibung                                           Status     
=============================== ====================================================== ===========
SeAssignPrimaryTokenPrivilege   Ersetzen eines Tokens auf Prozessebene                 Deaktiviert
SeLockMemoryPrivilege           Sperren von Seiten im Speicher                         Aktiviert  
SeIncreaseQuotaPrivilege        Anpassen von Speicherkontingenten fr einen Prozess    Deaktiviert
SeTcbPrivilege                  Einsetzen als Teil des Betriebssystems                 Aktiviert  
SeSecurityPrivilege             Verwalten von šberwachungs- und Sicherheitsprotokollen Deaktiviert
SeTakeOwnershipPrivilege        šbernehmen des Besitzes von Dateien und Objekten       Deaktiviert
SeLoadDriverPrivilege           Laden und Entfernen von Ger„tetreibern                 Deaktiviert
SeSystemProfilePrivilege        Erstellen eines Profils der Systemleistung             Aktiviert  
SeSystemtimePrivilege           Žndern der Systemzeit                                  Deaktiviert
SeProfileSingleProcessPrivilege Erstellen eines Profils fr einen Einzelprozess        Aktiviert  
SeIncreaseBasePriorityPrivilege Anheben der Zeitplanungspriorit„t                      Aktiviert  
SeCreatePagefilePrivilege       Erstellen einer Auslagerungsdatei                      Aktiviert  
SeCreatePermanentPrivilege      Erstellen von dauerhaft freigegebenen Objekten         Aktiviert  
SeBackupPrivilege               Sichern von Dateien und Verzeichnissen                 Deaktiviert
SeRestorePrivilege              Wiederherstellen von Dateien und Verzeichnissen        Deaktiviert
SeShutdownPrivilege             Herunterfahren des Systems                             Deaktiviert
SeDebugPrivilege                Debuggen von Programmen                                Aktiviert  
SeAuditPrivilege                Generieren von Sicherheitsberwachungen                Aktiviert  
SeSystemEnvironmentPrivilege    Ver„ndern der Firmwareumgebungsvariablen               Deaktiviert
SeChangeNotifyPrivilege         Auslassen der durchsuchenden šberprfung               Aktiviert  
SeUndockPrivilege               Entfernen des Computers von der Dockingstation         Deaktiviert
SeManageVolumePrivilege         Durchfhren von Volumewartungsaufgaben                 Deaktiviert
SeImpersonatePrivilege          Annehmen der Clientidentit„t nach Authentifizierung    Aktiviert  
SeCreateGlobalPrivilege         Erstellen globaler Objekte                             Aktiviert  
SeIncreaseWorkingSetPrivilege   Arbeitssatz eines Prozesses vergr”áern                 Aktiviert  
SeTimeZonePrivilege             Žndern der Zeitzone                                    Aktiviert  
SeCreateSymbolicLinkPrivilege   Erstellen symbolischer Verknpfungen                   Aktiviert




Dein Programm stirbt, wenn man auf ein Prozess klickt, auf dem man kein Zugriff hat (5).


Kennst du das? http://technet.microsoft.com/de-de/sysinternals/bb896653.aspx


AHT - Do 14.02.08 10:39

user profile iconDezipaitor hat folgendes geschrieben:
Ja+Nein, aber
du startest dein Programm in der Session 0 - also der Service Session. Unter Vista erscheint dann die Meldung, dass ein Dienst versucht eine GUI zu öffnen. Man kann dann zu dem Dienst Desktop wechseln.
Du musst schon die korrekte SessionID mit CreateProcessAsUser und dem Token verwenden. Um dein Programm mit SYSTEM Rechten auf dem Userdesktop zu starten kannst du
1. einfach ein SYSTEM Prozess in dieser Session suchen und an CreateProcessAsUser anhängen (WTSEnumerateProcesses) :winlogon.exe und csrss.exe gibt es für jede Session mit SYSTEM token.
2. dein eigenes Token duplizieren, ntsetinformation mit classtype sessionid aufrufen um die Session ID zu ändern und dann damit CreateProcessAsUser auszuführen .


Besten Dank!
Habe schon vermutet, das meine Trickserei unter Vista nicht mehr funktioniert. Besten Dank für deine Tipps, werde auf Dauer Versuchen, das umzusetzen.

user profile iconDezipaitor hat folgendes geschrieben:

Dein Programm stirbt, wenn man auf ein Prozess klickt, auf dem man kein Zugriff hat (5).

Das ist wichtig, und nochmals danke. Welche Art von Prozess meinst du genau? Auf was genau hat man keinen Zugriff und warum nicht - bzw. wie verhindert der Prozess den Zugriff?
Unter XP hatte ich bislang solche Probleme noch nicht, kann aber sehr gut sein, dass ich da was übersehen habe.
Wenn der Fehler sich nur auf Vista bezieht, werde ich wohl kaum eine Chance haben, das zu fixen - da mache ich mir keine Illusionen. Habe erst seit kurzem ein XP System, auf dem ich programmieren kann und bin vom nächsten Vista leider mehr als Lichtjahre entfernt. Habe sowieso den Eindruck, dass das Ding auf Vista nicht so funktioniert, wie es sollte - wird also unter Vista unbrauchbar sein.

Komme gerade aus der Nachtschicht und habe deine Infos über den Token nur kurz überflogen. Selbst auf den ersten Blick sieht das schon sehr intertessant aus - was wirklich wichtig für mich ist, muss ich mir aber noch genauer ansehen. Muss erst mal den Toten von gestern abend etwas verdauen :( .

Nein den Process Explorer kannte ich noch nicht. Werde ich mir noch genauer ansehen, habe im Augenblick hier nur Windows98, und da gefällt der mir nicht so besonders - ist aber durchaus brauchbar. Warum die Frage?

Moderiert von user profile iconNarses: Quote-Tag repariert


AHT - Do 14.02.08 19:56

user profile iconDezipaitor hat folgendes geschrieben:

Um dein Programm mit SYSTEM Rechten auf dem Userdesktop zu starten kannst du
1. einfach ein SYSTEM Prozess in dieser Session suchen und an CreateProcessAsUser anhängen (WTSEnumerateProcesses) :winlogon.exe und csrss.exe gibt es für jede Session mit SYSTEM token.


Das sieht sehr einfach aus, diese Variante werde ich ausprobieren. Manchmal sieht man den Wald vor lauter Bäumen nicht! An eine passende PID zur Duplizierung des Tokens zu kommen, geht aber noch einfacher und schneller.
Ich glaube, wenn du wüsstest, was ich da getrickst habe damit das Starten eines Services überhaupt mit der von mir verwendeten Programmiersprache und eigenem Code funktioniert, ohne das es mir meinen TNT-Code um die Ohren haut, würdest du dich totlachen (siehe zweite EXE im Download) :roll: .

user profile iconDezipaitor hat folgendes geschrieben:

Die GUI sollte bei beiden Varianten korrekt dargestellt werden, da SYSTEM Zugriff auf den Desktop hat.

Nehme das auch an und bin auf das Ergebnis schon sehr gespannt - mal schauen, ob's klappt. Werde am Wochenende mal etwas proggen und bei Erfolg ein Update hochladen.

Zum Process Explorer:
Der Process Explorer hat aber auch einen anderen Zweck als mein Tool - haut mich deshalb vielleicht nicht vom Sockel (kann mich mit Mark Russinovich in keiner Weise vergleichen, den Level erreiche ich in hunderttausend Jahren nicht). Mein Tool habe ich mir zum Experimentieren gebaut (ganz oben beschrieben), um folgende Sachen zu lösen - es ist kein Taskmanager, dazu fehlt vor allem auch die automatische Aktualisierung der Daten:


user profile iconDezipaitor hat folgendes geschrieben:
Dein Programm stirbt, wenn man auf ein Prozess klickt, auf dem man kein Zugriff hat (5).

Ich will hoffen, das sich die 5 auf Zugriff verweigert bezieht und keine Schulnote für einen so miesen Fehler ist :) .
Unter XP konnte ich das leider nicht nachvollziehen, da läuft das Proggie bislang überall ohne Probleme durch, bin da also im Augenblick leider "etwas" ratlos :cry: .


Dezipaitor - Do 14.02.08 23:07

Erstmal das Zugriff verweigert Problem kommt bei mir garnicht mehr. Bin mir nicht sicher warum. Zumindest stürzt deine Anwendung nicht mehr ab.

Ich wollte den Process Explorer nicht mit deinem Programm vergleichen. Warum auch? Ich meinte nur damit, dass du damit auch einige Fragen selbst beantworten kannst (z.b. über die Privilegien)

Wenn du in XP als normaler Benutzer - als nicht Admin - arbeitest, dann ist es eigentlich genau dasselbe Gefühl (außer dass man mehr freien Speicher fühlt)

Zitat:

* Was passiert, wenn ich an Fenster fremder Anwendungen Messages sende und wie werden die Pointer in der Message ausgewertet.
* Wie sieht der Prozessspeicher aus?
* Kann ich allein über ein Handle unter Umständen in fremden Prozessen zu einer Adresse kommen und damit Daten auslesen (oder schreiben)?
* Was passiert im Speicherbereich zwischen 2GB und 3GB unter nicht NT basierenden Systemen?
* Wie funktioniert IAT-Hooking?
* Was passiert, wenn ich DLLs in fremde Prozesse injiziere und eine Funktion darin von einem fremden Prozess aus anspreche?
* Kann ich über das Auslesen und Verfolgen von mehreren Pointern innerhalb fremder Prozesse als Ergebnis zum Schluss an bestimmte Daten gelangen (Strukturen, auf die der PEB verweist, zum Beispiel)?
* Wie werden Daten von Fenstern im Usermode abgespeichert und kann ich diese Daten direkt auslesen und ändern?
* Ist für das Ausführen bestimmter Aktionen die Aktivierung eines Privilegs nötig oder nicht?
* Welche (auch unbenannte) Exportfunktionen besitzt eine DLL?
* Gibt es Fenster, die ich mit normalen Mitteln nicht listen kann?
* Was passiert, wenn ich bestimmte Daten im Speicher fremder Prozesse direkt ändere?
* ...





PS.
Mit meiner JWSCL könntest du dich mehr auf die eigentliche Sache konzentrieren als direkt mit der WinAPI zu arbeiten. :D


AHT - Fr 15.02.08 23:50

Zitat:

1. einfach ein SYSTEM Prozess in dieser Session suchen und an CreateProcessAsUser anhängen (WTSEnumerateProcesses) :winlogon.exe und csrss.exe gibt es für jede Session mit SYSTEM token.

Habs mal ausgetestet. Arbeitet man in einem Administratoraccount geht das nicht, da standardmäßig hier das Privileg SeAssignPrimaryTokenPrivilege fehlt. Man muss deshalb wohl trotzdem erst einmal einen Service starten, dann geht es problemlos. :cry:


Dezipaitor - Sa 16.02.08 01:21

user profile iconAHT hat folgendes geschrieben:
Zitat:

1. einfach ein SYSTEM Prozess in dieser Session suchen und an CreateProcessAsUser anhängen (WTSEnumerateProcesses) :winlogon.exe und csrss.exe gibt es für jede Session mit SYSTEM token.

Habs mal ausgetestet. Arbeitet man in einem Atministratoraccount geht das nicht, da standardmäßig hier das Privileg SeAssignPrimaryTokenPrivilege fehlt. Man muss deshalb wohl trotzdem erst einmal einen Service starten, dann geht es problemlos. :cry:


Ja. Es wird aber nicht sehr schwer sein, als Admin ein Service zu installieren und zu starten :D


AHT - Sa 16.02.08 11:10

user profile iconDezipaitor hat folgendes geschrieben:

Ja. Es wird aber nicht sehr schwer sein, als Admin ein Service zu installieren und zu starten :D


Womit wir aber wieder beim Ausgangsproblem sind:
Ich programmiere nicht in Delphi. In der Programmiersprache, die ich hier verwendet habe ist es nicht möglich, einen vernünftigen internen CallBack zu proggen, ohne das es unter Umständen zu einem Crash kommt - und einen CallBack brauche ich für einen richtigen Service. Unter Vista funktioniert das Ding sowieso nicht richtig, und für 2000 und XP würde ich mir eine weitere unberechenbare Fehlerquelle einbauen.

Zitat:

Pointer sind immer Prozessrelativ. D.h. man muss den Pointer im Kontext des Senders auswerten...

Ja, genau dabei soll das Proggie ja behilflich sein.

Zitat:

Was soll sein? 2GB MEM / 2GB KERNEL MEM...

Virtueller Prozessspeicher, was sonst. :?:

Zitat:

Den Wert auf 3GB zu erhöhen bringt nur dann was, wenn die Prozesse mit einem speziellen Flag ausgestattet sind...

Du hast mich nicht richtig verstanden. Unter nicht NT basierenden Systemen, also Windows95 / 98 /ME sind nicht 2GB sondern 3GB vom User auslesbar - dem Kernel gehören nur jeweils 1GB virtueller Prozessspeicher. In die Speicherbereiche zwischen 2GB und 3GB (zeigt TNT negativ an - ist für mich übersichtlicher) lädt Windows bei diesen Systemen wichtige System DLLs (z.B. die KERNEL32) und Prozess- und Threadspezifische Informationen (TEB). Dieser Speicherbereich ist "Shared Memory", dass heißt, die virtuellen Adressen dort verweisen immer auf die gkleichen realen Adressen. Ändert man dort also etwas, taucht diese Änderung (anders als bei virtuellen Speicherbereichen unterhalb von 2GB) in jedem Prozess auf, und nicht nur dort, wo man diese Änderung durchgeführt hat.
Siehe Bild im Anhang...

Sehr wichtig ist diese Tatsache unter anderem beim Schreiben von lokalen Hooks.

Selbst beim Auslesen dieser Speicherbereiche können unter Windows98 ganz ganz miese Fehler auftreten - kann man deshalb ausklammern.


Dezipaitor - Sa 16.02.08 13:21

Nur mal so ins blaue geschossen. Vielleicht kommen die negativen Zahlen davon, dass deine Zahlenbereiche zu klein sind?


AHT - Sa 16.02.08 16:07

user profile iconDezipaitor hat folgendes geschrieben:
Nur mal so ins blaue geschossen. Vielleicht kommen die negativen Zahlen davon, dass deine Zahlenbereiche zu klein sind?


Im Prinzip richtig, natürlich liegt das an der Formatierung! Ich weiß nicht, worauf du da hinauswillst... Ob ein Handle oder eine Adresse dezimal positiv oder negativ angezeigt wird, ist eigentlich total egal - bis zu dem Zeitpunkt, wo man ganz gerne die Speicherbereiche auslesen will, zu denen diese Handles oder Adressen gehören. Dann wird es für mich persönlich extrem vorteilhaft, Handles und Adresse auch negativ angezeigt zu bekommen:

Ich spare also Zeit, die ein ungebildeter Mensch wie ich ansonsten mit Rechnerei vergeuden würde.
Zum anderen spare ich aber auch Code, denn ich habe in meiner verwendeten Programmiersprache keinen geeigneten Datentyp, der die Handles und Adressen auch als positive Werte anzeigt.
Das ist also etwas, was ich auf keinen Fall ändern werde.


Dezipaitor - Sa 16.02.08 21:09

Kann sein, dass du mehr mit Beschränkungen Sprache an sich als mit dem Problem zu kämpfen hast? Ich meine das gibts bei jeder Sprache, aber wenn es heute kein unsigned longlong gibt, dann wundere ich mich doch, ob es die richtige Sprache ist.


AHT - So 17.02.08 12:01

user profile iconDezipaitor hat folgendes geschrieben:
Kann sein, dass du mehr mit Beschränkungen Sprache an sich als mit dem Problem zu kämpfen hast? Ich meine das gibts bei jeder Sprache, aber wenn es heute kein unsigned longlong gibt, dann wundere ich mich doch, ob es die richtige Sprache ist.


Da hast du auf jedenfall recht, dass das so ist und warum das so ist, das steht ja auch weiter oben schon.

In dieser Programmiersprache gibt es niemanden außer mir, der in dieser Art und Weise Programme schreibt - also sich mit Zugriffsrechten, Virtuellem Speicher und dem direkten Auslesen und Verfolgen von Pointer (PEB und dessen Strukturen zum Beispiel) beschäftigt - sämtliche Codes in diesem Programm sind also aus meiner Feder und nicht irgendwo abgekupferte Includes.

Ich war schon recht weit gekommen - an vielen Stellen sogar weiter, als bis dahin irgendeiner im Delphi Bereich öffentlich gemacht hatte. Wenn sich aber niemand um die Ergebnisse schert, verkommen diese irgendwann und sind nicht mehr zu gebrauchen.

Ich habe deshalb vor etwas über einem Jahr beschlossen, nicht weiter Geld, Zeit und Nerven in eine Sache zu verschwenden, die sowieso zu nichts führt und mich lieber da umzusehen, wo Leute die gleichen Interessen haben wie ich.

Dass das eine sehr gute Idee war, sehe ich hier:
http://www.delphi-forum.de/topic_Merkwuerdigkeiten+in+Windows+XP_78104.html
Das Problem beschäftigte mich schon seit eineinhalb Jahren :roll: ; auf Nachfragen von mir wurde dabei nicht reagiert.
:zustimm: Hier stehen sogar nach kurzer Zeit Ergebnisse fest, ohne dass ich vorher einen Rechner hatte, der dieses Problem produziert! :zustimm:

API ist eben API, egal in welcher Sprache man schreibt - da tut sich nicht viel. Mehr gibt es dazu eigentlich nicht zu sagen (die Seite ist ja sowieso schon voll :shock: ).


AHT - So 24.02.08 19:17

user profile iconDezipaitor hat folgendes geschrieben:
user profile iconAHT hat folgendes geschrieben:
Zitat:

1. einfach ein SYSTEM Prozess in dieser Session suchen und an CreateProcessAsUser anhängen (WTSEnumerateProcesses) :winlogon.exe und csrss.exe gibt es für jede Session mit SYSTEM token.

Habs mal ausgetestet. Arbeitet man in einem Administratoraccount geht das nicht, da standardmäßig hier das Privileg SeAssignPrimaryTokenPrivilege fehlt. Man muss deshalb wohl trotzdem erst einmal einen Service starten, dann geht es problemlos. :cry:


Ja. Es wird aber nicht sehr schwer sein, als Admin ein Service zu installieren und zu starten :D


So, ich muss da noch einges erklären - ist vielleicht noch für andere wichtig, da die Erklärung in der WIN32.HLP scheinbar nicht korrekt ist:

Was CreateProcessAsUser tut ist ja nichts anderes, als einen Prozess mit dem mitgegebenen Token starten. Aber wo und wie wird der Prozess gestartet? Er wird genau da gestartet, wo der Mutterprozess gestartet wurde. Ist der Mutterprozess ein interaktiver Service, läuft dieser auf dem aktuellen Desktop (Defalult/WinSta0). Ist Service nicht interaktiv läuft dieser aus Sicherheitsgründen in einer anderen Windowstation und einem anderen Desktop! Um die Fenster des erstellten Prozesses sichtbar zu machen, muss der Desktop des Threads dieses Prozesses mit SetThreadDesktop auf den aktuellen Desktop umgestellt werden. Davor muss mit SetProcessWindowStation aber wohl auch die Windowstation geändert werden (habe das bei meinem Test jedenfalls so gemacht).
Wenn der zu switchende Thread Fenster auf dem alten Desktop geöffnet hat, schlägt die Aktion mit GetLastError 170 fehl - ist auch logisch so.

Unter XP ist das alles kein Problem - ich gehe im Augenblick aber ganz stark davon aus, das Vista auch bei dieser Variante eine Messagebox bringen würde...