Autor Beitrag
AHT Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: 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" 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 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: 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... :)

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
AHT Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 198
Erhaltene Danke: 39


Delphi XE3 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: 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:

  • vorhandene Privilegien eines normalen Programmes
  • Default-DACL eines normal
    gestarteten Programmes
  • Gruppen eines normal
    gestarteten Programmes
  • Default-DACL eines mit Adminrechten
    gestarteten Programmes
  • Gruppen eines mit Adminrechten
    gestarteten Programmes
  • Default-DACL eines im Account
    "System" gestarteten Programmes

Das dürfte auch anderen hier helfen. Lässt sich alles mittels Rechtsklick in die Zwischenablage einfügen.

Gruß

AHT
mael
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 198
Erhaltene Danke: 39


Delphi XE3 Prof.
BeitragVerfasst: Mi 13.02.08 17:51 
Ich habe momentan leider kein Vista installiert.
Dezipaitor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220



BeitragVerfasst: 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.
ausblenden 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

ausblenden 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


ausblenden 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

ausblenden 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


ausblenden 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

ausblenden 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
ausblenden 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:
ausblenden volle Höhe 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? technet.microsoft.co...ernals/bb896653.aspx
AHT Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: 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:

  • 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?
  • ...


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220



BeitragVerfasst: 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?
* ...



  • Pointer sind immer Prozessrelativ. D.h. man muss den Pointer im Kontext des Senders auswerten (oder rüber kopieren). ReadProcessMemory und WriteProcessMemory funktioniert damit - übrigens auch in Prozessen deselben Benutzers, da es gestattet ist. Das Debug Privileg erlaubt es zudem, Prozesse anderer Benutzer (auch SYSTEM) auszulesen und zu beschreiben.
    In Windows VISTA gibt es eine neuen ACE Type : System Mandatory Label. Es steckt in der SACL und kann 4 Zustände (low, medium,high, SYSTEM) besitzen. Zudem kann man angeben, ob Objekte mit kleinerem Level auf Objekte mit höherem Level zugreifen dürfen. Wenn unter Vista ein Benutzer einen Prozess mit Administratorrechten startet, dann hat der Prozess (und damit die GUI) ein höheres Level als alle anderen und somit kann kein normaler Prozess eine Nachricht an dieses Fenster schicken. Das verhindert, dass andere Programme Adminrechte erlangen.
    In Vista gibt es zudem für ein Administrator Token ein Zwilling. Der Zwilling ist der echte Administrator. Bei dem normalen Token, dass man mit LogonUser erhält, ist die Gruppe Administratoren in TokenGroups auf DENY-Only eingestellt. In ACLs werden daher nur deny ACEs der Admingruppe verwendet. Mit GetTokenInformation kann man das andere Token bekommen. Wenn man jedoch kein Admin ist, kann man nicht mit SetThreadToken dieses Token angeben (-> GL=5). Aber anschauen kann man es. Wirklich verwenden geht daher nur über einen Service. D.h. ein Service kann LogonUser, GetTokenInformation, CreateProcessAsUser ein Benutzer mit Adminrechten starten, wenn dieser in der Gruppe Administratoren ist (sonst gibt es kein Twintoken). Mit LSALogonUser kann man übrigens eigene Gruppen zum Token hinzufügen. So werden auch normale Benutzer für einen Prozess zum Admin (geht unter Vista auch).
  • Was soll sein? 2GB MEM / 2GB KERNEL MEM - Heap von oben, Stack von unten, wenn sie sich treffen, dann is Speicher alle :D. Den Wert auf 3GB zu erhöhen bringt nur dann was, wenn die Prozesse mit einem speziellen Flag ausgestattet sind und es dann auch nutzen.
    Siehe auch blogs.msdn.com/oldne...04/08/11/212720.aspx
  • mit OpenProcess, Read/WriteProcessMemory kannst du alles. Und wenn Debug privileg vorhanden, dann geht das auch in Dienstprozesse
  • nicht NT Systeme können nicht soviel Speicher verwalten (Win98 hat einen inoffiziellen Patch, damit es überhaupt mit 1GB läuft) Der Speichermanager wurde nie für soviel Speicher ausgelegt. Bei "The Old New Thing" gibt es einen Artikel dazu.
    blogs.msdn.com/oldne...003/08/14/54640.aspx
  • IAT? Implizite Assoziationstest?
  • DLL Injection lass ich jemanden anderes beantworten :D
  • dito
  • Daten von Fenstern? Man sollte die Finger davon lassen, da diese Daten beliebig sein können und sich auch ständig ändern. Aber ändern kann man alles. -> blogs.msdn.com/oldne...8/02/05/7452279.aspx
  • Ja und nein. WTSQueryUserToken erfordert das TCB Priv UND den Nutzer SYSTEM.
    Dagegen überprüft CreateWindow, ob der Aufruferprozess (genauer der Benutzer) Zugriff hat, indem es nachsieht, ob der Benutzer in der Desktop DACL das Recht DESKTOP_CREATEWINDOW besitzt.
  • Normale DLLs haben ne Menge Funktionen. Aber keine speziellen. Das machen die Anwendungsprogrammierer schon selbst - z.B. für Plugins. Man vereinbart genau festgelegte Funktionen, die erwartet werden.
    COM definiert das genau so, um Objekte zu exportieren.
  • Kann ich nicht wirklich sagen, ob es Fenster gibt, die nicht aufgezählt werden können. Unter Vista können jedoch Fenster nicht aufgezählt werden, wenn der Prozess ein höheres IntegrityLevel besitzt. Aber im Endeffekt geht alls über die ProzessDACL.
  • Fremde Daten im fremden Speicher: Da kann alles passieren. Vom CheatProgramm bis zum Stackoverflow. In normalen Benutzerprozessen stürzt das System jedoch nicht ab, sondern nur der Prozess wird beendet. In SYSTEM Prozessen kann auch Hardware beschädigt werden (wenn es dumm kommt).
  • ...



PS.
Mit meiner JWSCL könntest du dich mehr auf die eigentliche Sache konzentrieren als direkt mit der WinAPI zu arbeiten. :D
AHT Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: 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:


Zuletzt bearbeitet von AHT am Mo 25.02.08 21:09, insgesamt 1-mal bearbeitet
Dezipaitor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: 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.
Einloggen, um Attachments anzusehen!
Dezipaitor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: 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:

  • Bei positive Handles ist es öfters der Fall, dass ich den dazugehörigen Adressbereich im fremden Prozess über das Verfolgen von zwei Pointern ermitteln kann. TNT habe ich mir damals zum Nachforschen solcher Sachen gebaut, die undokumentiert oder schlecht dokumentiet sind. Chris Padget wird damals wohl auch kaum in den Dokus von MSDN gefunden haben, wie man genau den Adressbereich ermitteln kann, in dem in einem fremden Edit der Text steht oder?
  • Bei negativen Handles von DLLs sehe ich unter Windows98 sofort, dass diese in den "shared Memorybereich" geladen wurde.
  • Bei negativen Adressen muss ich mich gar nicht erst anstrengen, diese mit dem Tool auslesen zu wollen.

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: 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:
www.delphi-forum.de/...indows+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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: 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...