JEDI Windows API + JEDI Windows Security Code Library

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
dezipaitor
Beiträge: 12
Registriert: Sa 10. Nov 2007, 12:12
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

JEDI Windows API + JEDI Windows Security Code Library

Beitrag von dezipaitor »

Hallo,

dies ist die erste öffentliche Bekanntmachung für etwas das ich mittlerweile fast ein Jahr entwickle. Zudem habe ich mich nach einigem Gerangel entschieden sie als OpenSource freizugeben. Dies geschieht aus der Hoffnung, dass Andere dazukommen und Verbesserungen beitragen oder sogar weitere Klassen hinzufügen. Die Veröffentlichung geschieht jedoch mit der ausdrücklichen Bitte die Bibliothek als ganzes zu verwenden und sie nicht als Selbstbedienungsladen zu sehen.

Was ist JEDI Windows API (JWA)?
Die JWA ist eine Bibliothek, die versucht soviele original Windows Header Dateien (C-Header) wie möglich nach Delphi zu konvertieren.

Was ist JEDI Windows Security Code Library (JWSCL) ?
Die JWSCL ist eine reine Klassenbibliothek, die die Programmierung mit der Windows API (in C geschrieben) vereinfachen soll.
Darunter fallen derzeit folgende Konstrukte:
*Erkennung der Windows Version
*Token
**Impersonation (Personifizierung)
**Benutzerlogin
*SID
*Access Control List
*Security Descriptor (Sicherheitsdeskriptor)
**Owner, Group, DACL, SACL
*WindowStation
*Desktop
*LSA (Teile)
*Rights mapping
*Gesicherte Objekte z.B. Dateien, Registry (+Vererbung), aber auch alle anderen Handles
*Credentials (Login Dialog)
*Verschlüsselung (MS Crypt API)
*Known SIDs
*Privilegien
*Security Dialogs (Sicherheitsdialog, wie man ihn bei der Dateisicherheit des Explorers sieht)
*Terminal Sessions
*Unicode + Ansicode
*Vista Elevation
*Vista Integrity Level

In Entwicklung:
*Terminal Server (u.a. Session shadowing) (40%)
*Secure Private Objects (Sicherung von benutzerdefinierten Strukturen mit Sicherheitsdeskriptor + opt. Vererbung) (20%)
*Group Policy (0%)
*Active Directory (0%)
*und weitere

Die JWSCL gibt es derzeit im BETA Status über Subversion (Versionsverwaltung) von SourceForge. Sie ist unter der GPL (wenn auch noch nicht in der Dokumentation erwähnt) oder MPL als OpenSource freigegeben.
Zusätzlich gibt es noch eine erweiterte Version der JEDI API Lib, die in demselben Subversion Repository liegt. Sie findet Verwendung in der JWSCL.
(Anonymer Zugriff)
Die URL ist über ein SVN Client, wie Tortoise SVN zu verwenden.

Auf allgemeine Anfrage ist nun der Download des aktuellen Subversion Repository rev#30 - Download von SF.net möglich. Das Archiv hat denselben Inhalt, wie ein Checkout über SVN.


Die JWSCL verwendet die neue JEDI API Lib (JWA). Dazu muss die JWA als Paket kompiliert werden.
1. Öffne die Projektgruppe im Ordner jwaapi\trunk\Packages, was zu deiner Delphiversion passt. Oder wenn nicht vorhanden, verwende eine ältere Version.
2. Kompiliere alle Pakete. Die DCU Dateien werden in einem Ordner "Bin" gespeichert. Dieser ist nochmals in vier weitere Unterordner aufgeteilt, die die verschiedenen Versionsarten (Debug/Release, Dynamic/Static) repräsentieren.
Die Dateien "JwaWindows.dcu" und "JwaVista.dcu" sind dann die entscheidenden Teile.
3. Kopiere dir den Pfad-Text von einem dieser vier Ordner. Ich empfehle für die Entwicklung Static\Debug. Dieser Pfad wird der Suchpfad für JediAPI DCU Dateien in deinen neuen Projekten.

Diese Vorgehensweite ist empfehlenswert im Gegensatz zu der direkten Einbindung der Quelldateien. In diesem Fall müsste bei jeder Projekterzeugung alle Jedi API Lib Dateien erneut kompiliert werden - das dauert.

Die Verwendung der JWSCL ist dann einfach. Man muss nur den Suchpfad des eigenen Projekts noch durch den Pfad zur Quelle "jwscl\trunk\source" erweitern.


So, das wars für die Vorbereitung.
Einige Beispiele sind bereits in den Ordnern. Der Rest ist durch Ausprobieren erfahrbar :D

Zum BETA Status:
BETA Status bedeutet für die JWSCL, dass es noch viele unentdeckte Fehler gibt. Daher ist es nicht ratsam blindlings die Bibliothek in wichtigen Projekten einzusetzen. Ich verbiete es jedoch nicht! Ich werde mich jedoch bemühen, Fehler so gut wie möglich zu korrigieren. Ich rufe aber inständig andere Entwickler auf mich bei der Arbeit zu unterstützen. Tester suche ich daher weniger als Helfer.

Es gibt einige Probleme bei der Ausführung von Beispielen. Diese funktionieren nicht so, wie sie sollten. Das ACL Editor WinStation Beispiele, zum Beispiel, hat wohl ein Problem mit der Rücksprungaddresse (zerstörtert Stack?). Ich weiß einfach nicht warum.

Es gibt im Moment noch kein FreePascal-Paket oder Projekt, weil ich nocht nicht wirklich zufrieden mit der Funktionsweise unter Freepascal/Lazarus bin. Ich bin auch einfach nicht erfahren genug und habe nicht genügend Zeit, um JWA und JWSCL unter Freepascal und Delphi 5-2007 vollständig zum Laufen zu bringen.

Vielleicht finde ich hier jemand, der das übernehmen will? Es sollte etwas einfacher sein, da die Bibliotheken in FP kompilierbar sind.

Der folgende Quelltext demonstriert wie man die maximalen Zugriffsrechte einer Datei bekommt.

Code: Alles auswählen

program ReadFileSecurity;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  Dialogs,
  Controls,
  JwaWindows,
  JwsclTypes,
  JwsclExceptions,
  JwsclConstants,
  JwsclMapping,
  JwsclVersion,
  JwsclProcess,
  JwsclSid,
  JwsclAcl,
  JwsclCredentials,
  JwsclDescriptor,
  JwsclToken,
  JwsclKnownSid,
  JwsclAccounts,
  JwsclSecureObjects,
  JwsclStrings;
 
function CheckAccessToFile(
  DesiredAccess: DWORD; const FileName: WideString): Boolean;
var FileObject : TJwSecureFileObject;
begin
  FileObject := TJwSecureFileObject.Create(FileName);
  try
    result := FileObject.AccessCheck(DesiredAccess);
  finally
    FileObject.Free;
  end;
end;
 
function CheckMaximumAccessToFile(const FileName: WideString): DWORD;
var FileObject : TJwSecureFileObject;
    PrivilegeSet: TJwPrivilegeSet;
    AccessStatus: boolean;
begin
  FileObject := TJwSecureFileObject.Create(FileName);
  try
    FileObject.AccessCheck(
      MAXIMUM_ALLOWED,//DesiredAccess: TJwAccessMask;
      PrivilegeSet,//out PrivilegeSet: TJwPrivilegeSet;
      result,//out GrantedAccess: TJwAccessMask;
      AccessStatus,//out AccessStatus: boolean;
      nil//const ClientToken: TJwSecurityToken = nil);
      );
  finally
    PrivilegeSet.Free;
    FileObject.Free;
  end;
end;
 
var AccessMask : DWORD;
    FileName : String;
begin
  FileName := ParamStr(1);
  if Length(FileName) = 0 then
    FileName := ParamStr(0);
 
  writeln('Check access for '+FileName);
  try
    if CheckAccessToFile(FILE_ALL_ACCESS,FileName) then
      writeln('Full control allowed')
    else
      writeln('Full control denied');
  except
    On E : Exception do
     Writeln(E.Message);
  end;
 
  try
    AccessMask := CheckMaximumAccessToFile(FileName);
    writeln('Maximum access possible: ['+TJwSecurityFileMapping.MapAccessMaskToString(AccessMask)+']');
  except
    On E : Exception do
     Writeln(E.Message);
  end;
 
  Writeln('[Hit return]');
  readln;
end.
Zuletzt geändert von dezipaitor am Mi 14. Nov 2007, 22:52, insgesamt 1-mal geändert.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ich denke um erhrlich zu seiun, das die Bibliotheken für Lazarus nutzer recht uninteressant sind. Wenn ich von mir ausgehe hab ich schon seit jahren keine Windows spezifischen Sachen mehr benutzt oder nen Wrapper drum gebaut. Einzige ausnahme bildet das RAPI.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

dezipaitor
Beiträge: 12
Registriert: Sa 10. Nov 2007, 12:12
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von dezipaitor »

Ach Unsinn. Klar ist es Windows only. Aber mit Lazarus kann man ja auch Windows programmieren.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

dezipaitor hat geschrieben:Ach Unsinn. Klar ist es Windows only. Aber mit Lazarus kann man ja auch Windows programmieren.
"Windows only" ist natürlich kein Ausschlusskriterium für die Verwendung mit Lararus/FreePascal. Da aber viele Entwickler gerade wegen Linux von Delphi auf Free Pascal umsteigen, sind Plattform-unabhängige Libraries natürlich interessanter.

Schön wäre, eine Library zu haben, die einiges des hier angeboten Plattform-unabhängig realisiert. D.h. es würde eine API geschaffen, die z.B. Datei-Rechte in Betriebssystem-neutraler Form managen kann (was natürlich für Systeme zu Einschränkungen führt, die dann durch zusätzliche nicht portierbare APIs verwendet werden können).

Dann ist man in der Lage auf einfache Weise portable Programme zu schreiben, die die "gemeinamen" Features nutzen.

-Michael
Zuletzt geändert von mschnell am Do 15. Nov 2007, 11:36, insgesamt 1-mal geändert.

dezipaitor
Beiträge: 12
Registriert: Sa 10. Nov 2007, 12:12
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von dezipaitor »

Leider ist das für Linux nicht möglich. Linux ist intern ja ganz anders organisiert. Außerdem ist in Linux standardmäßig die einfachste Form der Dateirechte installiert. ACL muss immer nachträglich installiert werden.

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Hallo dezipaitor
Das ist bestimmt eine gute Sache, aber mir geht's wie hier schon beschrieben wurde. Ich boote mein Win unter VirtualBox praktisch nur noch um zu checken, ob der unter Linux entwickelte Code dort auch einwandfrei läuft.
Vielleicht kann ich deine Arbeit trotzdem mal brauchen, wenn ich etwas Windows-spezifisches machen muss. Aber der Anreiz zum mitentwickeln ist bei mir im Moment nicht so gross.

dezipaitor
Beiträge: 12
Registriert: Sa 10. Nov 2007, 12:12
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von dezipaitor »

Es geht mir größtenteils eigentlich nur darum, dass Leute kleine Programme damit schreiben. Diese werden dann als Beispiele aufgenommen. Vielleicht entwickelt sich daraus ja eine kleine Toolsammlung.
Zudem testet dies den Librarycode.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6776
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: JEDI Windows API + JEDI Windows Security Code Library

Beitrag von af0815 »

dezipaitor hat geschrieben:Hallo Delphianer,
....
dezipaitor hat geschrieben: Es gibt im Moment noch kein FreePascal-Paket oder Projekt, weil ich nocht nicht wirklich zufrieden mit der Funktionsweise unter Freepascal/Lazarus bin. Ich bin auch einfach nicht erfahren genug und habe nicht genügend Zeit, um JWA und JWSCL unter Freepascal und Delphi 5-2007 vollständig zum Laufen zu bringen.

Vielleicht finde ich hier jemand, der das übernehmen will? Es sollte etwas einfacher sein, da die Bibliotheken in FP kompilierbar sind.
Meine Ambitionen halten sich dabei extrem in Grenzen. Lazarus / FPC ist nunmal NICHT Delphi, sondern eine plattformübergreifende Sache. Das ist ein Faktum und solange der Compiler nicht zumindest 1.0 hat, wird sich keiner so wirklich ohne Grund an die Windows Spezialitäten machen.
Das einzige zu dem ich mich leicht erwärmen könnte wäre zum Thema COM & Active X. Genau das ist aber, da unter Delphi vorhanden, wahrscheinlich kein Target.

Von meiner Seite - kein Interesse.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

dezipaitor
Beiträge: 12
Registriert: Sa 10. Nov 2007, 12:12
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: JEDI Windows API + JEDI Windows Security Code Library

Beitrag von dezipaitor »

COM ist nicht das Problem. Es funktioniert auch unter FreePascal.

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: JEDI Windows API + JEDI Windows Security Code Library

Beitrag von theo »

af0815 hat geschrieben:
dezipaitor hat geschrieben:Hallo Delphianer,
....
dezipaitor meint wahrscheinlich mit Delphi "the language".
Aber seit es Delphi für PHP gibt, bin ich auch leicht verwirrt...;-)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Wozu brauch man denn die erweiterten Rechte im "Normalbetrieb" überhaupt ? Wenn man nicht gerad Viren oder Würmer schreibt die das System plattmachen sollen ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

dezipaitor
Beiträge: 12
Registriert: Sa 10. Nov 2007, 12:12
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von dezipaitor »

Christian hat geschrieben:Wozu brauch man denn die erweiterten Rechte im "Normalbetrieb" überhaupt ? Wenn man nicht gerad Viren oder Würmer schreibt die das System plattmachen sollen ?

Sorry, ich weiß nicht worauf du hinaus willst.
Aber Gegenfrage: Hast du "root", "su" und "sudo" von deinem Linux System entfernt? Weil die braucht man ja net im Normalbetrieb, außer für Viren und Würmer.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Nö, die braucht man um Software zu installieren und Systemeinstellungen vorzunehmen und das tu ich meisst auch net aus meinen Programmen heraus.

Ich will damit nichts unterstellen falls du das denkst. Ich kann mir nur wirklich keinen Verwendungszweck dafür vorstellen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

dezipaitor
Beiträge: 12
Registriert: Sa 10. Nov 2007, 12:12
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von dezipaitor »

Die Bibliothek ist dazu da, den Zugriff auf die C Funktionen von Windows, genauer gesagt der Teil, der mit Sicherheit zu tun hat, zu vereinfachen. Seitdem Vista draußen ist, gibt es eine Menge neuer Sachen zu beachten, was die Sicherheit angeht (restricted token, UAC, session splitting).
Unter Linux ist das seit Jahren kein Problem, da dort der Benutzer nie als Administrator umherläuft und die Programmierer sich an diesen Umstand angepasst haben. Ich persönlich arbeite im Geschäft und daheim nicht als Administrator unter Windows und habe schon sehr früh erfahren müssen, dass die meisten Programmierer keine Ahnung haben, was die Sicherheit angeht. (Mit Sicherheit meine ich hier die Programmierung der Windows Sicherheit, nicht die Sicherung der Anwendung vor Schädlingen!)
Im Internet gibt es tausende von Fragen, wie man z.B. die maximalen Zugriffsart auf eine Datei bestimmt, wie man Programme unter anderem Benutzer startet, wie man herausfindet, ob ein Benutzer ein Administrator ist (und da gibt es Fallstricke), wie man Adminrechte erlangen kann, damit z.b. etwas installiert werden kann und so weiter und so fort.

Wer schonmal Windows Administrator über ein Netzwerk war, der weiß wie wichtig es ist sich mit Group Policies, ACL, Vererbung usw auszukennen.

Als ich anfing die Bibiliothek zu schreiben, hatte ich nicht die Vorstellung, sie auf die aktuelle Größe zu bringen. Die ganze SicherheitsAPI ist aber ein riesiger Graph, der überall irgendwie zusammenhängt. Man muss schon wirklich eine Menge implementieren, damit man damit überhaupt etwas anfangen kann.
Wer schonmal die Funktion AccessCheck in der MSDN gesehen hat, der weiß was ich meine. Die Funktion hat 8 Parameter und die Hälfte davon ist nicht so einfach erzeugbar. (siehe http://msdn2.microsoft.com/en-us/library/aa374815.aspx" onclick="window.open(this.href);return false;).
Diese hier: pSecurityDescriptor, ClientToken, DesiredAccess, GenericMapping, PrivilegeSet.

Das Ziel der Bibliothek ist, wie schon anfangs geschrieben, den Umgang mit der Sicherheits API zu vereinfachen. Was wirklich dabei rausspringt ist das Ziel Projekte schneller und natürlich wieder einfacher zu erzeugen. Der Programmierer muss sich nicht mit der C-Pointer Arithmetik auseinanderschlagen. Er muss nicht 100% alle Fallstricke der SicherheitsAPI kennen. Das alles wrappt die Bibliothek und versteckt (wenn auch Opensource) es vor dem Benutzer. Er jongliert nur mit Klassen, sollte dabei aber etwas Verständnis über die Windows Sicherheits Architektur mitbringen. Letztendlich kann auch nur richtig Rechnen, wenn man die Grundrechenarten kennt.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Währe es nicht denkbar, das so umzuschreiben das sie auch unter Linux lauffähig ist ? dann müsste man mit Sicherheit jede Funktion noch einmal schreiben, für Linux halt.

Aber den Wahren sinn erkenne ich noch nicht ganz...
MFG
Michael Springwald

Antworten