Results 1 to 11 of 11

Thread: Iemand al gewerkt met FWPUCLNT.DLL?

  1. #1
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046

    Iemand al gewerkt met FWPUCLNT.DLL?

    Ik dacht van ik kijk eindelijk eens verder hoe het zit met SSL/TLS. Ik heb intussen al door dat het echt niet is aangewezen om daar veel zelf te liggen gaan klooien, want je zet gegarandeerd ongewenst en onbewust achterpoortjes open tenzij je precies weet wat je doet...

    Maar ik blijf me wel nog altijd vragen stellen aan dingen zoals INDY en Synapse Ararat waarom daar zoveel onnodige troep bij zit...

    En dan kwam ik plots langs deze: WSASetSocketSecurity of met anderre woorden, Windows moet toch zelf ook al iets aanbieden in die zin, zodat ik niet zelf moet liggen gaan klooien met OpenSSL/LibreSSL? Blijkt deze in een obscure FWPUCLNT.DLL te zitten die mijn tdump niet wil slikken...

    Dus: al iemand mee gewerkt? (Is er hoegenaamd iemand die nog kan volgen waar ik het over heb?) Zou dit een relatief aanvaardbare manier zijn om TLS te gaan doen?

  2. #2
    Quote Originally Posted by develyoy View Post
    Maar ik blijf me wel nog altijd vragen stellen aan dingen zoals INDY en Synapse Ararat waarom daar zoveel onnodige troep bij zit..
    Die opmerking kan ik me wel voorstellen voor Indy maar kan hem eigenlijk helemaal niet plaatsen voor Synapse.

    War wil je precies doen want misschien kun je "hogere" functies uit Windows gebruiken die de TLS al intern gebruiken

  3. #3
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    Concreet zou het al voor TMongoWire zijn want er zijn mongodb-hosting-providers die alles achter TLS zetten voor de veiligheid, maar mijn super-simpele winsock-wrapper kan dat niet aan natuurlijk. Als het er echt snel in moet ziet het er voorlopig inderdaad naar uit dat dit me het snelst gaat lukken met Synapse inderdaad. Daarna waarschijnlijk in nog dingen (zoals xxmHttp)

  4. #4
    Ja, als je echt low-level wilt gaan zul je inderdaad het een en ander zelf moeten doen.
    Ik weet niet of WSASetSocketSecurity ook gelijk alles zelf afhandelt maar voor Delphi zijn daar totaal geen voorbeelden van te vinden.

    Als je het toch wilt maken zul je uit moeten gaan van voorbeelden van C++.
    Bijvoorbeeld: https://social.msdn.microsoft.com/Fo...orum=vcgeneral
    https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

    Als de servers waar je het afhaalt alleen TLS toestaan dan kun je zelf niet zoveel achterpoortjes openzetten. Dat is meer aan de serverkant. En als je met deze code goede gegevens binnen krijgt, en de server ook echt alleen TLS toestaat, dan weet je dat het dus werkt.

    De functies die je overigens zoekt zijn voor Indy gedefinieerd in .\Embarcadero\Studio\18.0\source\Indy10\System\IdW ship6.pas.
    Dus je kunt daar al stukjes code van pakken om zelf de functies uit hfwpuclntDll te halen.

    Delphi Code:
    1. if hfwpuclntDll <> 0 then
    2. begin
    3.   WSASetSocketSecurity := GetProcAddress(hfwpuclntDll, 'WSASetSocketSecurity');
    4.   WSAQuerySocketSecurity := GetProcAddress(hfwpuclntDll, 'WSAQuerySocketSecurity'); {Do not localize}
    5.   WSASetSocketPeerTargetName := GetProcAddress(hfwpuclntDll, 'WSASetSocketPeerTargetName'); {Do not localize}
    6.   WSADeleteSocketPeerTargetName := GetProcAddress(hfwpuclntDll, 'WSADeleteSocketPeerTargetName');  {Do not localize}
    7.   WSAImpersonateSocketPeer := GetProcAddress(hfwpuclntDll, 'WSAImpersonateSocketPeer'); {Do not localize}
    8.   WSARevertImpersonation := GetProcAddress(hfwpuclntDll, 'WSARevertImpersonation'); {Do not localize}
    9. end;

    Je zult verder wel nog heel wat types en constants moeten kopiëren uit de source.
    (kan wat gestript worden maar dit is in ieder geval alles (of meer) dat je nodig hebt)
    Delphi Code:
    1. uses windows;
    2.  
    3. const
    4.   _SS_MAXSIZE = 128;
    5.   _SS_ALIGNSIZE = SizeOf(Int64);
    6.   _SS_PAD1SIZE = _SS_ALIGNSIZE - SizeOf(short);
    7.   _SS_PAD2SIZE = _SS_MAXSIZE - (SizeOf(short) + _SS_PAD1SIZE + _SS_ALIGNSIZE);
    8.  
    9. type
    10.   POverlapped = ^TOverlapped;
    11.  
    12.   _OVERLAPPED = record
    13.     Internal: ULONG_PTR;
    14.     InternalHigh: ULONG_PTR;
    15.     Offset: DWORD;
    16.     OffsetHigh: DWORD;
    17.     hEvent: THandle;
    18.   end;
    19.  
    20.   TOverlapped = _OVERLAPPED;
    21.   OVERLAPPED = _OVERLAPPED;
    22.  
    23.   WSAOVERLAPPED = TOverlapped;
    24.   TWSAOverlapped = WSAOVERLAPPED;
    25.   PWSAOverlapped = ^TWSAOverlapped;
    26.   LPWSAOVERLAPPED = PWSAOverlapped;
    27.   WSC_PROVIDER_INFO_TYPE = (ProviderInfoLspCategories, ProviderInfoAudit);
    28.  
    29.   SOCKADDR_STORAGE = record
    30.     ss_family: short; // Address family.
    31.     __ss_pad1: array [0 .. _SS_PAD1SIZE - 1] of AnsiChar; // 6 byte pad, this is to make
    32.     // implementation specific pad up to
    33.     // alignment field that follows explicit
    34.     // in the data structure.
    35.     __ss_align: Int64; // Field to force desired structure.
    36.     __ss_pad2: array [0 .. _SS_PAD2SIZE - 1] of AnsiChar; // 112 byte pad to achieve desired size;
    37.     // _SS_MAXSIZE value minus size of
    38.     // ss_family, __ss_pad1, and
    39.     // __ss_align fields is 112.
    40.   end;
    41.  
    42.   SOCKET_SECURITY_PROTOCOL = (
    43.     SOCKET_SECURITY_PROTOCOL_DEFAULT, SOCKET_SECURITY_PROTOCOL_IPSEC, SOCKET_SECURITY_PROTOCOL_INVALID
    44.     );
    45.  
    46.   SOCKET_SECURITY_SETTINGS_IPSEC = record
    47.     SecurityProtocol: SOCKET_SECURITY_PROTOCOL;
    48.     SecurityFlags: ULONG;
    49.     IpsecFlags: ULONG;
    50.     AuthipMMPolicyKey: TGUID;
    51.     AuthipQMPolicyKey: TGUID;
    52.     Reserved: TGUID;
    53.     Reserved2: UINT64;
    54.     UserNameStringLen: ULONG;
    55.     DomainNameStringLen: ULONG;
    56.     PasswordStringLen: ULONG;
    57.     // wchar_t AllStrings[0];
    58.   end;
    59.  
    60.   PSOCKET_SECURITY_SETTINGS_IPSEC = ^SOCKET_SECURITY_SETTINGS_IPSEC;
    61.  
    62.   SOCKET_SECURITY_SETTINGS = record
    63.     SecurityProtocol: SOCKET_SECURITY_PROTOCOL;
    64.     SecurityFlags: ULONG;
    65.   end;
    66.  
    67.   PSOCKET_SECURITY_SETTINGS = ^SOCKET_SECURITY_SETTINGS;
    68.  
    69.   SOCKET_PEER_TARGET_NAME = record
    70.     SecurityProtocol: SOCKET_SECURITY_PROTOCOL;
    71.     PeerAddress: SOCKADDR_STORAGE;
    72.     PeerTargetNameStringLen: ULONG;
    73.     // wchar_t AllStrings[0];
    74.   end;
    75.  
    76.   PSOCKET_PEER_TARGET_NAME = ^SOCKET_PEER_TARGET_NAME;
    77.  
    78.   SOCKET_SECURITY_QUERY_INFO = record
    79.     SecurityProtocol: SOCKET_SECURITY_PROTOCOL;
    80.     Flags: ULONG;
    81.     PeerApplicationAccessTokenHandle: UINT64;
    82.     PeerMachineAccessTokenHandle: UINT64;
    83.   end;
    84.  
    85.   PSOCKET_SECURITY_QUERY_INFO = ^SOCKET_SECURITY_QUERY_INFO;
    86.  
    87.   SOCKET_SECURITY_QUERY_TEMPLATE = record
    88.     SecurityProtocol: SOCKET_SECURITY_PROTOCOL;
    89.     PeerAddress: SOCKADDR_STORAGE;
    90.     PeerTokenAccessMask: ULONG;
    91.   end;
    92.  
    93.   PSOCKET_SECURITY_QUERY_TEMPLATE = ^SOCKET_SECURITY_QUERY_TEMPLATE;
    94.  
    95.   LPWSAOVERLAPPED_COMPLETION_ROUTINE = procedure(dwError, cbTransferred: DWORD;
    96.     lpOverlapped: LPWSAOVERLAPPED; dwFlags: DWORD); stdcall;
    97.  
    98.   SunB = record
    99.     s_b1, s_b2, s_b3, s_b4: byte;
    100.   end;
    101.  
    102.   SunW = record
    103.     s_w1, s_w2: word;
    104.   end;
    105.  
    106.   in_addr = record
    107.     case integer of
    108.       0: (S_un_b: SunB);
    109.       1: (S_un_w: SunW);
    110.       2: (S_addr: DWORD);
    111.   end;
    112.  
    113.   TInAddr = in_addr;
    114.   PInAddr = ^TInAddr;
    115.  
    116.   sockaddr_in = record
    117.     case integer of
    118.       0: (sin_family: word;
    119.           sin_port: word;
    120.           sin_addr: TInAddr;
    121.           sin_zero: array [0 .. 7] of AnsiChar);
    122.       1: (sa_family: word;
    123.           sa_data: array [0 .. 13] of AnsiChar)
    124.   end;
    125.  
    126.   TSockAddrIn = sockaddr_in;
    127.   PSockAddrIn = ^TSockAddrIn;
    128.   PSockAddr_In = PSockAddrIn;
    129.   TSockAddr = TSockAddrIn;
    130.   SOCKADDR = TSockAddr;
    131.   PSOCKADDR = ^TSockAddr;
    132.   LPSOCKADDR = PSOCKADDR;
    133.  
    134.   TSocket = NativeUInt;
    135.  
    136.   // Fwpuclnt.dll - API
    137.   LPFN_WSASetSocketSecurity = function(socket: TSocket;
    138.     SecuritySettings: PSOCKET_SECURITY_SETTINGS; const SecuritySettingsLen: ULONG;
    139.     OVERLAPPED: LPWSAOVERLAPPED; CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): integer; stdcall;
    140.   LPFN_WSADELETESOCKETPEERTARGETNAME = function(socket: TSocket;
    141.     PeerAddr: PSOCKADDR; PeerAddrLen: ULONG;
    142.     OVERLAPPED: LPWSAOVERLAPPED; CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): integer; stdcall;
    143.   LPFN_WSASETSOCKETPEERTARGETNAME = function(socket: TSocket;
    144.     PeerTargetName: PSOCKET_PEER_TARGET_NAME; PeerTargetNameLen: ULONG;
    145.     OVERLAPPED: LPWSAOVERLAPPED; CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): integer; stdcall;
    146.   LPFN_WSAIMPERSONATESOCKETPEER = function(socket: TSocket;
    147.     PeerAddress: PSOCKADDR; peerAddressLen: ULONG): integer; stdcall;
    148.   LPFN_WSAQUERYSOCKETSECURITY = function(socket: TSocket;
    149.     SecurityQueryTemplate: PSOCKET_SECURITY_QUERY_TEMPLATE; const SecurityQueryTemplateLen: ULONG;
    150.     SecurityQueryInfo: PSOCKET_SECURITY_QUERY_INFO; var SecurityQueryInfoLen: ULONG;
    151.     OVERLAPPED: LPWSAOVERLAPPED; CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): integer; stdcall;
    152.   LPFN_WSAREVERTIMPERSONATION = function: integer; stdcall;
    153.  
    154. const
    155.   fwpuclnt_dll = 'Fwpuclnt.dll'; { Do not localize }
    156.  
    157. var
    158.   hfwpuclntDll: THandle = 0;
    159.  
    160. var
    161.   WSASetSocketSecurity: LPFN_WSASetSocketSecurity = nil;
    162.   WSASetSocketPeerTargetName: LPFN_WSASETSOCKETPEERTARGETNAME = nil;
    163.   WSADeleteSocketPeerTargetName: LPFN_WSADELETESOCKETPEERTARGETNAME = nil;
    164.   WSAImpersonateSocketPeer: LPFN_WSAIMPERSONATESOCKETPEER = nil;
    165.   WSAQUERYSOCKETSECURITY: LPFN_WSAQUERYSOCKETSECURITY = nil;
    166.   WSARevertImpersonation: LPFN_WSAREVERTIMPERSONATION = nil;
    167.  
    168. procedure InitLibrary_Fwpuclnt;
    169. begin
    170.   hfwpuclntDll := SafeLoadLibrary(fwpuclnt_dll);
    171.   if hfwpuclntDll <> 0 then
    172.   begin
    173.     WSASetSocketSecurity := GetProcAddress(hfwpuclntDll, 'WSASetSocketSecurity');
    174.     WSAQUERYSOCKETSECURITY := GetProcAddress(hfwpuclntDll, 'WSAQuerySocketSecurity'); { Do not localize }
    175.     WSASetSocketPeerTargetName := GetProcAddress(hfwpuclntDll, 'WSASetSocketPeerTargetName'); { Do not localize }
    176.     WSADeleteSocketPeerTargetName := GetProcAddress(hfwpuclntDll, 'WSADeleteSocketPeerTargetName'); { Do not localize }
    177.     WSAImpersonateSocketPeer := GetProcAddress(hfwpuclntDll, 'WSAImpersonateSocketPeer'); { Do not localize }
    178.     WSARevertImpersonation := GetProcAddress(hfwpuclntDll, 'WSARevertImpersonation'); { Do not localize }
    179.   end;
    180. end;

  5. #5
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    Zie, altijd die GetProcAddress'en zelf willen doen, dat heb ik nu nooit echt goed begrepen. Als je gewoon met external in de implementation werkt, dan doet Windows dat braaf netjes voor jou? Ja, er draait dan nog helemaal geen code van jezelf en heb je geen kans om al iets te doen of te loggen, of misschien dan zonder een stuk van je programma verder te doen. En heel misschien zet je de deur open voor mensen met slechte bedoelingen, zodat ze met aangepaste DLL's binnen in je programma kunnen kijken. Maar als die twee zich helemaal niet stellen, dan vind ik toch het extra stuk code dat er bij komt kijken behoorlijk uitgebreid...

  6. #6
    Ja, maar let op met die externals. Als de dll niet bestaat op het systeem dan crasht je programma (bijvoorbeeld op XP). Met de loadlibrary heb je in de hand of je wel of niet die dll wilt laden.

    En ja, het is een heel stuk meer code. Maar je wilt TLS of je wilt het niet. Daarom wordt er gewerkt met libraries als indy en Synapse die veel uit je handen nemen. Maar die werken vrijwel allemaal met openssl.

    Verder zie ik niet zozeer het "openzetten" van een deur in je programma als je alleen maar dingen ophaalt/uitleest, dus als client. Als je een server maakt die https moet doen, dan is het wat anders.

  7. #7
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    Bij mijn eerste probeersel geeft WSASetSocketPeerTargetName consistent error 10040 (WSAEMSGSIZE) terug, ik doe waarschijnlijk iets fout, maar ik vind het niet direct... Is er nu echt niets anders echt puur-Microsoft eigen aan Windows waar je SSL/TLS mee kan laten toevoegen aan een connectie? Gezien alle andere op OpenSSL zitten zal ik dat moeten uitzoeken zeker? Ik vond ook nog s2n, maar ik weet niet of die hoegenaamd wel voorzien is voor op Windows...

  8. #8
    Quote Originally Posted by develyoy View Post
    Bij mijn eerste probeersel geeft WSASetSocketPeerTargetName consistent error 10040 (WSAEMSGSIZE) terug, ik doe waarschijnlijk iets fout, maar ik vind het niet direct...
    Dat lijkt mij dat je gewoon een buffer aan die functie geeft die te klein is:
    https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
    WSAEMSGSIZE = A buffer passed was too small.
    Is er nu echt niets anders echt puur-Microsoft eigen aan Windows waar je SSL/TLS mee kan laten toevoegen aan een connectie?
    In dat voorbeeld hebben ze het over dat je daarna gewoon een secure verbinding zou moeten hebben. Of je daarnaast nog iets moet doen voor TLS e.d. weet ik niet.
    (Kan dus best zijn dat je daarna nog met allerlei certificaten moet klungelen om een goede verbinding te krijgen: https://www.codeproject.com/Articles...erver-With-SSL)

    Die s2n maakt ook gebruik van libcrypto, OpenSSL, LibreSSL of BoringSSL. Maar lijkt inderdaad alleen voor Linux te zijn.
    Last edited by rvk; 21-Nov-17 at 13:04.

  9. #9
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    In een vorig avontuur met HTTPAPI weet ik gewoon dat Windows zelfs met TLS overweg kan, want daar is het zo eenvoudig als "https" opgeven. Dus moet het stuk wel zo diep in het systeem zitten als http.sys zelf, toch? Dan zou ik het vreemd vinden dat je er niet zelf aan kan. Maar als het inderdaad met die WSASetSocketSecurity moet, dan heeft het de nodige voeten in de aarde. Vreemd is wel dat ze melding maken van WSAIoctl "SIO_SET_SECURITY", maar ik daar verder niets over vind...

  10. #10
    Q.
    How can I program TCP/IP security on Windows?

    A.
    If you just want to make a https connection you can use Wininet which is easy.
    (Also works for ftps and gopher)

    If you want to do IPSEC use WSASetSocketSecurity() on a socket.
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    If you want to do STARTTLS / SSL (other than https) use SChannel.
    Or you can leave the Microsoft world and use OpenSSL.
    Dus volgens mij is WSASetSocketSecurity() ook niet de juiste (want die is voor IPSec) maar moet je met SChannel gaan werken.

    Afgezien van dit alles... denk je dat het op low-level werken (zoals Microsoft doet) je geen gaten prikt in je beveiliging?

  11. #11
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    Ja, precies. Ik wil wel iets dat overal werkt (of toch zou moeten werken), maar als ik er verder nog aan werk, zal ik toch eerst in detail eens debug-steppen over hoe Indy en/of synapse het doen...

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •