PSMFireW.dpr
上传用户:xiuanze55
上传日期:2017-08-03
资源大小:1080k
文件大小:32k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {
  2. Injected DLL for PSM Firewall.
  3. (C) 2003 PSMKorea, http://www.psmkorea.co.kr
  4. Written by DoDucTruong, Truong2D@Yahoo.com
  5. }
  6. Library PSMFireW;
  7. uses
  8.   SysUtils,
  9.   Windows,
  10.   Classes,
  11.   Registry,
  12.   Messages,
  13.   madCodeHook,
  14.   madRemote,
  15.   StrUtils,
  16.   WinSock,
  17.   InitAndFina in 'InitAndFina.pas';
  18. {$R *.res}
  19. Const
  20.   PSM_REG_KEY=HKEY_LOCAL_MACHINE;
  21.   //PSM_REG_KEY=HKEY_CURRENT_USER;
  22.   PSM_REG_FIREWALL_PATH='SOFTWAREPSMFirewall';
  23.   REQUEST_TIMEOUT = 100;
  24.   MAX_HIS = 20;
  25.   MAX_DOMAIN_HIS=20;
  26. Var
  27.   acceptNext: function(s: TSocket; addr: PSockAddr; addrlen: PInteger): TSocket; stdcall;
  28.   connectNext: function(s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
  29.   recvNext: function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  30.   recvfromNext: function(s: TSocket; var Buf; len, flags: Integer; var from: TSockAddr; var fromlen: Integer): Integer; stdcall;
  31.   sendNext: function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  32.   sendtoNext: function(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr; tolen: Integer): Integer; stdcall;
  33.   AcceptExNext: function(sListenSocket, sAcceptSocket: TSocket;
  34.   lpOutputBuffer: Pointer; dwReceiveDataLength, dwLocalAddressLength,
  35.   dwRemoteAddressLength: DWORD; var lpdwBytesReceived: DWORD;
  36.   lpOverlapped: POverlapped): BOOL; stdcall;
  37.   (*DeviceIoControlNext: function(hDevice: THandle; dwIoControlCode: DWORD; lpInBuffer: Pointer;
  38.   nInBufferSize: DWORD; lpOutBuffer: Pointer; nOutBufferSize: DWORD;
  39.   var lpBytesReturned: DWORD; lpOverlapped: POverlapped): BOOL; stdcall;
  40.   *)
  41.   gethostbynameNext:function (name: PChar): PHostEnt; stdcall;
  42.   //f:textfile;
  43.   Level: Byte=1;
  44.   PermitPath: Byte=2;
  45.   //Idea for Speed
  46.   Allow: Array[0..MAX_HIS] of string[30];
  47.   Deny: Array[0..MAX_HIS] of string[30];
  48.   iAllow: Byte=0;
  49.   iDeny: Byte=0;
  50.   //Idea for AntiRepeated
  51.   oldIPPort: String[30]='';
  52.   oldTime: Cardinal=0;
  53.   //Total Bytes Received/Sent
  54.   bRec: DWORD=0;
  55.   bSen: DWORD=0;
  56.   bTotal: DWORD=0;
  57.   //DoMainName<->IPs
  58.   DomainName:array[0..MAX_DOMAIN_HIS] of shortstring;
  59.   DomainIP:array[0..MAX_DOMAIN_HIS] of string[30];
  60.   iDomain: Byte=0;
  61.   //AntiQ
  62.   dT: Cardinal=0;
  63.   dM: WORD=0;
  64.   stopT: Cardinal=0;
  65. //Registry**********************************************************************
  66. (*
  67. function GetSettings(myKey: HKEY;RegPath:string;Key:string):string;
  68. var
  69.   reg: Tregistry;
  70. begin
  71.   result:='';
  72.   Reg:=TRegistry.Create;
  73.   try
  74.     Reg.RootKey:=myKey;
  75.     try
  76.       if Reg.OpenKey(RegPath,False) then
  77.         result:=Reg.ReadString(Key);
  78.     finally
  79.     end;
  80.   finally
  81.     Reg.Free;
  82.   end;{try}
  83. end;
  84. function SaveSettings(myKey: HKEY;RegPath:string;Key:string;Value:string):Boolean;
  85. var
  86.   reg: Tregistry;
  87. begin
  88.   result:=false;
  89.   Reg:=TRegistry.Create;
  90.   try
  91.     Reg.RootKey:=myKey;
  92.     try
  93.       if Reg.OpenKey(RegPath,True) then
  94.       begin
  95.         Reg.WriteString(Key,Value);
  96.         result:=true;
  97.         Reg.CloseKey;
  98.       end;
  99.     finally
  100.     end;
  101.   finally
  102.     Reg.Free;
  103.   end;{try}
  104. end;
  105. *)
  106. //******************************************************************************
  107. Procedure GetIPAndPort(s: TSocket;var ip: string; var port: integer; var localport: integer);
  108. Var
  109.   name: TSockAddr;
  110.   namelen: Integer;
  111. Begin
  112.   try
  113.   namelen:=sizeof(name);
  114.   getpeername(s,name,namelen);
  115.   ip:=inet_ntoa(name.sin_addr);
  116.   port:=ntohs(name.sin_port);
  117.   getsockname(s,name,namelen);
  118.   localport:=ntohs(name.sin_port);
  119.   except
  120.     SendIpcMessage('PSMFirewall', Pchar(' Error at GetIPAndPort()'#0),length(' Error at GetIPAndPort()'#0),nil,0);
  121.     SysUtils.Beep;
  122.   end;
  123. End;
  124. Function CheckPermission(ip: string; port: integer): Byte;
  125. {
  126. 0:Permit
  127. 1:Not Permit
  128. 2:Default;
  129. }
  130. Var
  131.   //I, j, pos1, pos2: Integer;
  132.   I, j: Integer;
  133.   FromIP, ToIP, st: String;
  134.   FromPort, ToPort: Integer;
  135.   MyIP: String;
  136. Begin
  137.   //12345678911234567892123456789312345678941234567890
  138.   //211.233.011.101|211.233.011.101|00080|00080|0|0
  139.   Result:=2;
  140.   Try
  141.   if PermitPath=0 then
  142.     Result:=0
  143.   else
  144.   Begin
  145.     MyIP:='000.000.000.000';
  146.     j:=Length(ip);
  147.     For i:=15 downto 1 do
  148.     Begin
  149.       if j<1 then break;
  150.       if (ip[j]<>'.') then
  151.       begin
  152.         MyIP[i]:=ip[j];
  153.         j:=j-1;
  154.       end
  155.       else if MyIP[i]='.' then j:=j-1;
  156.     End;
  157.     //MessageBox(0,Pchar(MyIP),'MyIP',MB_OK);
  158.     for I:=0 to Rules.Count-1 do
  159.     begin
  160.       st:=Rules.Strings[I];
  161.       FromIP:=copy(st,1,15);
  162.       ToIP:=copy(st,17,15);
  163.       FromPort:=StrToInt(copy(st,33,5));
  164.       ToPort:=StrToint(copy(st,39,5));
  165.       //MessageBox(0,Pchar(FromIP + #9 + ToIP + #9 + IntToStr(FromPort) + #9 + IntToStr(ToPort)),'Rule',MB_OK);
  166.       if (myip>=FromIP)and(myip<=ToIP)and(port>=FromPort)and(port<=ToPort)then
  167.       Begin
  168.         if st[47]='0' then Result:=0
  169.         else Result:=1;
  170.         Break;
  171.       End;
  172.     {
  173.     pos2:=0;
  174.     for j:= 1 to length(st) do if st[j]='|' then
  175.     begin
  176.       pos1:=pos2+1;
  177.       pos2:=j;
  178.     end;
  179.     pos2:=pos('|',st);if pos2< 1 then continue;
  180.     FromIP:=copy(st,pos1,pos2-pos1);
  181.     }
  182.     End;
  183.     if (Result=2)and(PermitPath=1) then Result:=1;
  184.   End;
  185.   Except
  186.     //SendIpcMessage('PSMFirewall', Pchar(' Error at CheckPermission(): ' + IntToStr(GetLastError()) + #0),Length(' Error at CheckPermission(): ' + IntToStr(GetLastError()) + #0),nil,0,IGNORE, TRUE);
  187.     SendIpcMessage('PSMFirewall', Pchar(' Error at CheckPermission(): ' + IntToStr(GetLastError()) + #0),Length(' Error at CheckPermission(): ' + IntToStr(GetLastError()) + #0),nil,0);
  188.     SysUtils.Beep;
  189.   End;
  190. End;
  191. Procedure LoadRules();
  192. Var
  193.   I: Integer;
  194.   reg: Tregistry;
  195.   regPath:string;
  196.   Rules1 :TStringList;
  197. Begin
  198.   Try
  199.   //Next Version, rules will be loaded to share memory by Application. This procedure will open this map file for use only.
  200.   iAllow:=0;
  201.   iDeny:=0;
  202.   Level:=1;
  203.   PermitPath:=2;
  204.   oldIPPort:='';
  205.   FillChar(Allow,SizeOf(Allow),' ');
  206.   FillChar(Deny,SizeOf(Allow),' ');
  207.   {
  208.   dT:=0;
  209.   dM:=0;
  210.   oldTime:=0;
  211.   stopT:=GetTickCount;
  212.   }
  213.   {
  214.   for i:=0 to MAX_HIS do begin
  215.     Allow[i]:='!';
  216.     Deny[i]:='!';
  217.   end;
  218.   }
  219.   //SendIpcMessage('PSMFirewall', Pchar(' Loading Rules: ' + DLLPath + #0),Length(' Loading Rules: ' + DLLPath + #0),nil,0,IGNORE, TRUE);
  220.   SendIpcMessage('PSMFirewall', Pchar(' Loading Rules: ' + DLLPath + #0),Length(' Loading Rules: ' + DLLPath + #0),nil,0);
  221.   regPath:=PSM_REG_FIREWALL_PATH + 'Rules';
  222.   Reg:=TRegistry.Create;
  223.   try
  224.     Reg.RootKey:=PSM_REG_KEY;
  225.     if Reg.OpenKey(PSM_REG_FIREWALL_PATH,False) then
  226.     begin
  227.       try
  228.         Level:=Reg.ReadInteger('Level');
  229.       except
  230.         Level:=1;//Default
  231.       end;
  232.     end
  233.     else
  234.       //SendIpcMessage('PSMFirewall', Pchar(' Error OpenKey(1): ' + PSM_REG_FIREWALL_PATH + #0),length(' Error OpenKey(1): ' + PSM_REG_FIREWALL_PATH + #0),nil,0,IGNORE, TRUE);;//Error trap
  235.       SendIpcMessage('PSMFirewall', Pchar(' Error OpenKey(1): ' + PSM_REG_FIREWALL_PATH + #0),length(' Error OpenKey(1): ' + PSM_REG_FIREWALL_PATH + #0),nil,0);;//Error trap
  236.     Reg.CloseKey;
  237.     if Reg.OpenKey(regPath,False) then
  238.     begin
  239.       if Rules<>nil then Rules.Free;
  240.       Rules:=TStringList.Create;
  241.       Reg.GetValueNames(Rules);
  242.       for I:=0 to Rules.Count-1 do
  243.         //SendIpcMessage('PSMFirewall', Pchar(' ' + IntToStr(Level) + '     ' + Rules.Strings[I]  + '     ' + DllPath + #0),strlen(Pchar(' ' + IntToStr(Level) + '     ' + Rules.Strings[I] + '     ' + DllPath + #0)),nil,0);
  244.     end
  245.     else
  246.       //SendIpcMessage('PSMFirewall', Pchar(' Error OpenKey(2): ' + regPath + #0),length(' Error OpenKey(2): ' + regPath + #0),nil,0,IGNORE, TRUE);;//Error trap
  247.       SendIpcMessage('PSMFirewall', Pchar(' Error OpenKey(2): ' + regPath + #0),length(' Error OpenKey(2): ' + regPath + #0),nil,0);;//Error trap
  248.     Reg.CloseKey;
  249.     PermitPath:=2;
  250.     regPath:=PSM_REG_FIREWALL_PATH + 'Rules1';
  251.     if Reg.OpenKey(regPath,False) then
  252.     begin
  253.       Rules1:=TStringList.Create;
  254.       Reg.GetValueNames(Rules1);
  255.       for I:=0 to Rules1.Count-1 do
  256.       begin
  257.         if (pos(DllPath,Rules1.Strings[I])>0)then
  258.           if (Rules1.Strings[I][Length(Rules1.Strings[I])]='0') then
  259.             PermitPath:=0
  260.           else
  261.             PermitPath:=1;
  262.         //SendIpcMessage('PSMFirewall', Pchar(' ' + IntToStr(Level) + '     ' + Rules1.Strings[I]  + '     ' + DllPath),strlen(Pchar(' ' + IntToStr(Level) + '     ' + Rules1.Strings[I] + '     ' + DllPath)),nil,0);
  263.       end;
  264.       Rules1.Free;
  265.     end
  266.     else
  267.       //SendIpcMessage('PSMFirewall', Pchar(' Error OpenKey(3): ' + regPath),length(' Error OpenKey(3): ' + regPath),nil,0,IGNORE, TRUE);;//Error trap
  268.       SendIpcMessage('PSMFirewall', Pchar(' Error OpenKey(3): ' + regPath + #0),length(' Error OpenKey(3): ' + regPath + #0),nil,0);;//Error trap
  269.     Reg.CloseKey;
  270.   finally
  271.     Reg.Free;
  272.   end;
  273.   Except
  274.     //SendIpcMessage('PSMFirewall', Pchar(' Error at LoadRules(): ' + IntToStr(GetLastError())),Length(' Error at LoadRules(): ' + IntToStr(GetLastError())),nil,0,IGNORE, TRUE);
  275.     SendIpcMessage('PSMFirewall', Pchar(' Error at LoadRules(): ' + IntToStr(GetLastError()) + #0),Length(' Error at LoadRules(): ' + IntToStr(GetLastError()) + #0),nil,0);
  276.     SysUtils.Beep;
  277.   End;
  278. End;
  279. Function WriteLog(const s: Tsocket; const Direction: string; const ip: string; const port: integer; const localport: Integer): BOOL;
  280. var
  281.   t:SYSTEMTIME;
  282.   //fn: array[0..MAX_PATH-1] of char;
  283.   msg:string;
  284.   Permit,i: Byte;
  285.   strPermit: String;
  286.   inRecent: BOOL;
  287.   IPPort:String;
  288.   CurrentTick: Cardinal;
  289.   HMapMutex: THandle;
  290.   tmpTotal: DWORD;
  291.   strDomain: ShortString;
  292. Begin
  293.   Result:=True;
  294.   try
  295.   if (PMapData=nil) and not MapOpened then Openmap;
  296.   if (PMapData=nil) or (PMapData^.boNewRule[MyProcessID]=2) then exit;//FW is stopped
  297.   if (PMapData<>nil) and (PMapData^.boNewRule[MyProcessID]=1) then begin
  298.     PMapData^.boNewRule[MyProcessID]:=0;
  299.     LoadRules;
  300.   end;
  301.   inRecent:=False;
  302.   IPPort:=ip+':'+IntToStr(Port);
  303.   For i:=0 to MAX_HIS do
  304.   Begin
  305.     if IPPort = Allow[i] then
  306.     Begin
  307.       Result:=True;
  308.       inRecent:=True;
  309.       Break;
  310.     End
  311.     else if IPPort=Deny[i] then
  312.     Begin
  313.       Result:=False;
  314.       inRecent:=True;
  315.       Break;
  316.     End;
  317.   End;
  318.   if not inRecent then
  319.   Begin
  320.     //SendIpcMessage('PSMFirewall', Pchar(' New IP/Port'),Length(' New IP/Port'),nil,0,IGNORE, TRUE);
  321.     SendIpcMessage('PSMFirewall', Pchar(' New IP/Port'#0),Length(' New IP/Port'#0),nil,0);
  322.     Permit:=CheckPermission(ip,port);
  323.     Case Level of
  324.       0:Begin
  325.           if Permit=0 then Result:=False;
  326.         End;
  327. {
  328.       1:Begin
  329.           if Permit=1 then Result:=True
  330.           else if Permit=0 then result:=False
  331.           else if (port<>34223) then Result:=True
  332.           else Result:=False;
  333.         End;
  334. }
  335.       1:Begin
  336.           if Permit=1 then Result:=True
  337.           else if Permit=0 then result:=False
  338.           else if (ip='127.0.0.1')
  339.             or (ip='0.0.0.0')//service.exe
  340.             or (ip='0.0.7.0')//service.exe
  341.             or (port<140)//Major port such as FTP, Telnet, HTTP, etc.
  342.             or (port=443)//ssl(for yessign certificate)
  343.             or (port=444)//snpp, Simple Network Paging Protocol
  344.             or (port=520)//RIP (Routing Information Protocol)
  345.             or (port=545)//QuickTime
  346.             or (port=554)//Real Time Streaming Protocol
  347.             or (port=563)//NNTP over SSL
  348.             or (port=631)//IPP (Internet Printing Protocol)
  349.             or (port=1352)//Lotus Notes
  350.             or (port=1433)//Microsoft SQL Server
  351.             or (port=1434)//Microsoft SQL Monitor
  352.             or (port=1521)//Oracle SQL
  353.             or (port=1755)//Windows Media .asf
  354.             or (port=1863)//MSM Messenger
  355.             or (port=2048)//Printer
  356.             or (port=3306)//mySQL
  357.             or (port=3389)//RDP Protocol (Terminal Server)
  358.             or (port=4000)//icq, command-n-conquer
  359.             or (port=4098)//SignKorea Cer.
  360.             or (port=4333)//mSQL
  361.             or (port=4608)//icq
  362.             or (port=5050)//Yahoo Messenger
  363.             or (port=5120)//Woori Bank Cer. Manager - Client SM
  364.             or (port=5190)//icq
  365.             or (port=5631)//PCAnywhere data
  366.             or (port=5632)//PCAnywhere
  367.             or (port=7007)//MSBD, Windows Media encoder
  368.             or (port=7070)//RealServer/QuickTime
  369.             or (port=8080)//HTTP
  370.             or (port=8181)//HTTP
  371.             or (port=8383)//IMail WWW
  372.             or (port=35072)////Woori Bank Cer. Manager - Client SM (When disconnecting)
  373.             or (port=63860)//Yahoo Pops
  374.             or (pos('inetinfo.exe',DllPath)>0)//Web Server
  375.             or (pos('services.exe',DllPath)>0)//services
  376.             or (pos('rpcss.exe',DllPath)>0)//RPC
  377.             or (pos('spoolsv.exe',DllPath)>0)//NetPrinter
  378.             or (pos('isaferupdate.exe',DllPath)>0)//iSaferUpdate.exe
  379.           then Result:=True
  380.           else Result:=False;
  381.         End;
  382.       2:Begin
  383.           if Permit<>1 then Result:=False;
  384.         End;
  385.     end;
  386.     if Result then
  387.     Begin
  388.       Allow[iAllow]:=IPPort;//ip + ':' + IntToStr(Port);
  389.       iAllow:=(iAllow + 1) mod (MAX_HIS+1);
  390.     end
  391.     else
  392.     Begin
  393.       Deny[iDeny]:=IPPort;//ip + ':' + IntToStr(Port);
  394.       iDeny:=(iDeny + 1) mod (MAX_HIS+1);
  395.     End;
  396.   End;
  397.   if Result then strPermit:='ALLOW'
  398.   else Begin strPermit:= 'DENY'; End;//SysUtils.Beep;
  399.   CurrentTick:=GetTickCount();
  400.   if ((IPPort <> oldIPPort) or ((CurrentTick-oldTime)>1000)) and ((CurrentTick-stopT)>2000) and (ip<>'0.0.0.0')  and (ip<>'127.0.0.1') and (Port<>0) then// 1000 ms// or (Direction='IN') or (Direction='OUT')
  401.   Begin
  402.     dT:=dT+(CurrentTick-oldTime);
  403.     inc(dM);
  404.     if (dT>10) and ((dM/dT)>(5/1000)) then stopT:=CurrentTick;
  405.     if (dT>1000)or(stopT=CurrentTick) then begin dT:=0; dM:=0; end;
  406.     oldTime:=CurrentTick;
  407.     oldIPPort:=IPPort;
  408.     tmpTotal:=0;
  409.     HMapMutex := CreateMutex(nil, false, pchar('PSMFirewallDLLShareMemMutex'));
  410.     if HMapMutex <> 0 then begin
  411.       if WaitForSingleObject(HMapMutex,REQUEST_TIMEOUT) = WAIT_OBJECT_0 then begin
  412.         if (PMapData<>nil) then begin
  413.           PMapData^.dwTotalBytes:=PMapData^.dwTotalBytes + (bSen + bRec - bTotal);
  414.           tmpTotal:=PMapData^.dwTotalBytes;
  415.           bTotal:=bSen + bRec;
  416.         end;
  417.       end;
  418.       ReleaseMutex(HMapMutex);
  419.       CloseHandle(HMapMutex);
  420.     end;
  421.     GetLocalTime(t);
  422.     strDomain:=ip;
  423.     for i:=0 to MAX_DOMAIN_HIS do if ip=DomainIP[i] then begin
  424.       strDomain:=DomainName[i];
  425.       break;
  426.     end;
  427.     msg:=AnsiReplaceStr(Format('%2d:%2d:%2d:%3d', [t.wHour, t.wMinute, t.wSecond, t.wMilliseconds]),' ','0') + #9 + Direction + #9 + strPermit + #9 + ip + #9 + IntToStr(port) + #9 + DllPath + #9 + IntToStr(bRec) + #9 + IntToStr(bSen) + #9 + IntToStr(tmpTotal) + #9 + IntToStr(s) + #9 + strDomain + #9 + IntToStr(LocalPort);
  428.     //SendIpcMessage('PSMFirewall', Pchar(msg),strlen(Pchar(msg)),nil,0,IGNORE, TRUE);
  429.     SendIpcMessage('PSMFirewall', Pchar(msg + #0),Length(msg + #0),nil,0);
  430.   End;
  431.   {
  432.   GetSystemDirectory(fn,MAX_PATH);
  433.   strcat(fn,'LogFilesPSMFireW');
  434.   if not DirectoryExists(fn) then MkDir(fn);
  435.   StrCat(fn,Pchar('' + AnsiReplaceStr(Format('%4d%2d%2d%s', [t.wYear, t.wMonth, t.wDay, '.log']),' ','0')));
  436.   AssignFile(f,fn);
  437.   if FileExists(fn) then
  438.     Append(f)
  439.   else
  440.     Rewrite(f);
  441.   writeln(f,AnsiReplaceStr(Format('%2d:%2d:%2d', [t.wHour, t.wMinute, t.wSecond]),' ','0') + #9 + name + #9 + Permission + #9 + ip + #9 + ':' + IntToStr(port) + #9 + DllPath);
  442.   Flush(f);
  443.   CloseFile(f);
  444.   }
  445.   Except
  446.     //SendIpcMessage('PSMFirewall', Pchar(' Error at WriteLog(): ' + IntToStr(GetLastError())),Length(' Error at WriteLog(): ' + IntToStr(GetLastError())),nil,0,IGNORE, TRUE);
  447.     SendIpcMessage('PSMFirewall', Pchar(' Error at WriteLog(): ' + IntToStr(GetLastError()) + #0),Length(' Error at WriteLog(): ' + IntToStr(GetLastError()) + #0),nil,0);
  448.     SysUtils.Beep;
  449.   End;
  450. End;
  451. Function acceptCallback(s: TSocket; addr: PSockAddr; addrlen: PInteger): TSocket; stdcall;
  452. Var
  453.   myresult: TSocket;
  454.   ip: string;
  455.   port: integer;
  456.   localport: integer;
  457. Begin
  458.   try
  459.   if addr<>nil then begin
  460.     ip:=inet_ntoa(addr^.sin_addr);
  461.     port:=ntohs(addr^.sin_port);
  462.   end
  463.   else
  464.     GetIPAndPort(s,ip,port,localport);
  465.   if WriteLog(s, 'IN',ip,port, localport) then
  466.   Begin
  467.     if @acceptNext<>nil then
  468.       myresult:=acceptNext(s, addr, addrlen)
  469.     else
  470.       myresult:=accept(s, addr, addrlen);    
  471.     result:=myresult;
  472.   end
  473.   else
  474.   begin
  475.     WSASetLastError(WSAENETDOWN);
  476.     result:= INVALID_SOCKET;
  477.   end;
  478.   if @acceptNext<>nil then RenewHook(@acceptNext);
  479.   except
  480.     SendIpcMessage('PSMFirewall', Pchar(' Error at accept()'#0),length(' Error at accept()'#0) ,nil,0);
  481.     SysUtils.Beep;
  482.     WSASetLastError(WSAENETDOWN);
  483.     result:= INVALID_SOCKET;
  484.   end;
  485. End;
  486. Function connectCallback(s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
  487. Var
  488.   myresult: Integer;
  489.   ip: string;
  490.   port: integer;
  491.   localport: Integer;
  492. Begin
  493.   try
  494.   GetIPAndPort(s,ip,port,localport);
  495.   ip:=inet_ntoa(name.sin_addr);
  496.   port:=ntohs(name.sin_port);
  497.   if WriteLog(s,'OUT',ip,port,localport) then
  498.   Begin
  499.     if @connectNext<>nil then
  500.       myresult:=connectNext(s, name, namelen)
  501.     else
  502.       myresult:=connect(s, name, namelen);    
  503.     result:=myresult;
  504.   end
  505.   else
  506.   begin
  507.     WSASetLastError(WSAENETDOWN);
  508.     result:= SOCKET_ERROR;
  509.   end;
  510.   if @connectNext<>nil then RenewHook(@connectNext);
  511.   except
  512.     SendIpcMessage('PSMFirewall', Pchar(' Error at connect()'#0),length(' Error at connect()'#0) ,nil,0);
  513.     SysUtils.Beep;
  514.     WSASetLastError(WSAENETDOWN);
  515.     result:= SOCKET_ERROR;
  516.   end;
  517. End;
  518. Function recvCallback(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  519. Var
  520.   myresult: Integer;
  521.   ip: string;
  522.   port: integer;
  523.   localport: Integer;
  524.   //HMapMutex: THandle;
  525. Begin
  526.   try
  527.   GetIPAndPort(s,ip,port,localport);
  528.   bRec := bRec + DWORD(len);
  529.   {
  530.   if LockMap then if (PMapData <> nil) then
  531.   Begin
  532.       PMapData^:=PMapData^ + DWORD(len);
  533.       UnlockMap;
  534.   End;
  535.   }
  536.   {
  537.   HMapMutex := CreateMutex(nil, false, pchar('PSMFirewallShareMemMutex'));
  538.   if HMapMutex <> 0 then begin
  539.     if WaitForSingleObject(HMapMutex,REQUEST_TIMEOUT) <> WAIT_FAILED then begin
  540.       PMapData^:=PMapData^ + DWORD(len);
  541.     end;
  542.     ReleaseMutex(HMapMutex);
  543.     CloseHandle(HMapMutex);
  544.   end;
  545.   }
  546.   if WriteLog(s, 'IN',ip,port,localport)then//REC
  547.   begin
  548.     if @recvNext<>nil then myresult:=recvNext(s,Buf,len, flags)
  549.     else myresult:=recv(s,Buf,len, flags);
  550.     result:=myresult;
  551.   end
  552.   else
  553.   begin
  554.     //s:=INVALID_SOCKET; (must change Var s)
  555.     closesocket(s);
  556.     WSASetLastError(WSAENETDOWN);
  557.     result:= SOCKET_ERROR;
  558.   end;
  559.   if @recvNext <> nil then RenewHook(@recvNext);  
  560.   except
  561.     SendIpcMessage('PSMFirewall', Pchar(' Error at recv()'#0),length(' Error at recv()'#0) ,nil,0);
  562.     SysUtils.Beep;
  563.     WSASetLastError(WSAENETDOWN);
  564.     result:= SOCKET_ERROR;
  565.   end;
  566. End;
  567. Function recvfromCallback(s: TSocket; var Buf; len, flags: Integer; var from: TSockAddr; var fromlen: Integer): Integer; stdcall;
  568. Var
  569.   myresult: Integer;
  570.   ip: string;
  571.   port: integer;
  572.   localport: Integer;
  573.   //HMapMutex: THandle;
  574. Begin
  575.   try
  576.   GetIPAndPort(s,ip,port,localport);
  577.   ip:=inet_ntoa(from.sin_addr);
  578.   port:=ntohs(from.sin_port);
  579.   
  580.   bRec := bRec + DWORD(len);
  581.   {
  582.   if LockMap then if (PMapData <> nil) then
  583.   Begin
  584.       PMapData^:=PMapData^ + DWORD(len);
  585.       UnlockMap;
  586.   End;
  587.   }
  588.   {
  589.   HMapMutex := CreateMutex(nil, false, pchar('PSMFirewallShareMemMutex'));
  590.   if HMapMutex <> 0 then begin
  591.     if WaitForSingleObject(HMapMutex,REQUEST_TIMEOUT) <> WAIT_FAILED then begin
  592.       PMapData^:=PMapData^ + DWORD(len);
  593.     end;
  594.     ReleaseMutex(HMapMutex);
  595.     CloseHandle(HMapMutex);
  596.   end;
  597.   }
  598.   If WriteLog(s, 'IN',ip,port,localport) then//RECF
  599.   Begin
  600.     if @recvfromNext<>nil then
  601.       myresult:=recvfromNext(s, Buf, len, flags, from, fromlen)
  602.     else
  603.       myresult:=recvfrom(s, Buf, len, flags, from, fromlen);
  604.     result:=myresult;
  605.   end
  606.   else
  607.   begin
  608.     //s:=INVALID_SOCKET; (must change Var s)
  609.     closesocket(s);
  610.     WSASetLastError(WSAENETDOWN);
  611.     result:= SOCKET_ERROR;
  612.   end;
  613.   if @recvfromNext<>nil then RenewHook(@recvfromNext);  
  614.   except
  615.     SendIpcMessage('PSMFirewall', Pchar(' Error at recvfrom()'#0),length(' Error at recvfrom()'#0) ,nil,0);
  616.     SysUtils.Beep;
  617.     WSASetLastError(WSAENETDOWN);
  618.     result:= SOCKET_ERROR;
  619.   end;
  620. End;
  621. Function sendCallback(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  622. Var
  623.   myresult: Integer;
  624.   ip: string;
  625.   port: integer;
  626.   localport: Integer;
  627.   //HMapMutex: THandle;
  628. Begin
  629.   try
  630.   GetIPAndPort(s,ip,port,localport);
  631.   bSen := bSen + DWORD(len);
  632.   {
  633.   if LockMap then if (PMapData <> nil) then
  634.   Begin
  635.       PMapData^:=PMapData^ + DWORD(len);
  636.       UnlockMap;
  637.   End;
  638.   }
  639.   {
  640.   HMapMutex := CreateMutex(nil, false, pchar('PSMFirewallShareMemMutex'));
  641.   if HMapMutex <> 0 then begin
  642.     if WaitForSingleObject(HMapMutex,REQUEST_TIMEOUT) <> WAIT_FAILED then begin
  643.       PMapData^:=PMapData^ + DWORD(len);
  644.     end;
  645.     ReleaseMutex(HMapMutex);
  646.     CloseHandle(HMapMutex);
  647.   end;
  648.   }
  649.   if WriteLog(s, 'OUT',ip,port,localport)then//SEN
  650.   Begin
  651.     if @sendNext<>nil then myresult:=sendNext(s, Buf, len, flags)
  652.     else myresult:=send(s, Buf, len, flags);
  653.     result:=myresult;
  654.   end
  655.   else
  656.   begin
  657.     //s:=INVALID_SOCKET; (must change Var s)
  658.     closesocket(s);
  659.     WSASetLastError(WSAENETDOWN);
  660.     result:= SOCKET_ERROR;
  661.   end;
  662.   if @sendNext<>nil then RenewHook(@sendNext);  
  663.   except
  664.     SendIpcMessage('PSMFirewall', Pchar(' Error at send()'#0),length(' Error at send()'#0) ,nil,0);
  665.     SysUtils.Beep;
  666.     WSASetLastError(WSAENETDOWN);
  667.     result:= SOCKET_ERROR;
  668.   end;
  669. End;
  670. Function sendtoCallback(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr; tolen: Integer): Integer; stdcall;
  671. Var
  672.   myresult: Integer;
  673.   ip: string;
  674.   port: integer;
  675.   localport: Integer;
  676.   //HMapMutex: THandle;
  677. Begin
  678.   try
  679.   GetIPAndPort(s,ip,port,localport);
  680.   ip:=inet_ntoa(addrto.sin_addr);
  681.   port:=ntohs(addrto.sin_port);
  682.   bSen := bSen + DWORD(len);
  683.   {
  684.   if LockMap then if (PMapData <> nil) then
  685.   Begin
  686.       PMapData^:=PMapData^ + DWORD(len);
  687.       UnlockMap;
  688.   End;
  689.   }
  690.   {
  691.   HMapMutex := CreateMutex(nil, false, pchar('PSMFirewallShareMemMutex'));
  692.   if HMapMutex <> 0 then begin
  693.     if WaitForSingleObject(HMapMutex,REQUEST_TIMEOUT) <> WAIT_FAILED then begin
  694.       PMapData^:=PMapData^ + DWORD(len);
  695.     end;
  696.     ReleaseMutex(HMapMutex);
  697.     CloseHandle(HMapMutex);
  698.   end;
  699.   }
  700.   if WriteLog(s, 'OUT',ip,port,localport) then//SENT
  701.   begin
  702.     if @sendtoNext<>nil then
  703.       myresult:=sendtoNext(s, Buf, len, flags,addrto, tolen)
  704.     else
  705.       myresult:=sendto(s, Buf, len, flags,addrto, tolen);
  706.     result:=myresult;
  707.   End
  708.   else
  709.   begin
  710.     //s:=INVALID_SOCKET; (must change Var s)
  711.     closesocket(s);
  712.     WSASetLastError(WSAENETDOWN);
  713.     result:= SOCKET_ERROR;
  714.   end;
  715.   if @sendtoNext<>nil then RenewHook(@sendtoNext);
  716.   except
  717.     SendIpcMessage('PSMFirewall', Pchar(' Error at sendto()'#0),length(' Error at sendto()'#0) ,nil,0);
  718.     SysUtils.Beep;
  719.     WSASetLastError(WSAENETDOWN);
  720.     result:= SOCKET_ERROR;
  721.   end;
  722. End;
  723. Function AcceptExCallback(sListenSocket, sAcceptSocket: TSocket;
  724.   lpOutputBuffer: Pointer; dwReceiveDataLength, dwLocalAddressLength,
  725.   dwRemoteAddressLength: DWORD; var lpdwBytesReceived: DWORD;
  726.   lpOverlapped: POverlapped): BOOL; stdcall;
  727. Begin
  728.   Result:=AcceptExNext(sListenSocket, sAcceptSocket, lpOutputBuffer, dwReceiveDataLength, dwLocalAddressLength, dwRemoteAddressLength, lpdwBytesReceived, lpOverlapped);
  729.   //SendIpcMessage('PSMFirewall', Pchar(' AcceptEx'),Length(' AcceptEx'),nil,0,IGNORE, TRUE);
  730.   SendIpcMessage('PSMFirewall', Pchar(' AcceptEx'#0),Length(' AcceptEx'#0),nil,0);
  731. End;
  732. {
  733. function DeviceIoControlCallback(hDevice: THandle; dwIoControlCode: DWORD; lpInBuffer: Pointer;
  734.   nInBufferSize: DWORD; lpOutBuffer: Pointer; nOutBufferSize: DWORD;
  735.   var lpBytesReturned: DWORD; lpOverlapped: POverlapped): BOOL; stdcall;
  736. Begin
  737.   Result:=DeviceIoControlNext(hDevice, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped);
  738.   SendIpcMessage('PSMFirewall', Pchar('hDevice#9dwIoControlCode'),Length('hDevice#9dwIoControlCode'),nil,0);
  739.   SendIpcMessage('PSMFirewall', Pchar(IntToStr(hDevice) + #9 + IntToStr(dwIoControlCode) + #9 + DllPath),Length(IntToStr(hDevice) + #9 + IntToStr(dwIoControlCode) + #9 + DllPath),nil,0);
  740. End;
  741. }
  742. function gethostbynameCallback(name: PChar): PHostEnt; stdcall;
  743. type
  744.   TAPInAddr = Array[0..4] of PInAddr;
  745.   PAPInAddr = ^TAPInAddr;
  746. var
  747.   tmp:shortstring;
  748.   myHostEnt:PHostEnt;
  749.   pptr: PAPInAddr;
  750.   i: Integer;
  751. begin
  752.   try
  753.   tmp:=String(name);
  754.   if @gethostbynameNext<>nil then
  755.     myHostEnt:=gethostbynameNext(name)
  756.   else
  757.     myHostEnt:=gethostbyname(name);
  758.   if myHostEnt<>nil then begin
  759.     pptr := PAPInAddr(myHostEnt^.h_addr_list );
  760.     i:=0;
  761.     while pptr^[i] <> NIL do begin
  762.       DomainName[iDomain]:=tmp;
  763.       DomainIP[iDomain]:=inet_ntoa( pptr^[i]^ );
  764.       iDomain:=(iDomain+1) mod MAX_DOMAIN_HIS;
  765.       inc(i);
  766.       if i>4 then break;
  767.     end;
  768.   end;
  769.   result:=myHostEnt;
  770.   if @gethostbynameNext<>nil then renewhook(@gethostbynameNext);
  771.   except
  772.     SendIpcMessage('PSMFirewall', Pchar(' Error at gethostbyname()'#0),length(' Error at gethostbyname()'#0) ,nil,0);
  773.     SysUtils.Beep;
  774.     result:=nil;
  775.     WSASetLastError(WSAENETDOWN);
  776.   end;
  777. end;
  778. {
  779. procedure SafeDllProc(Reason: Integer);
  780. begin
  781.   case Reason of
  782.     DLL_PROCESS_ATTACH:
  783.       SendIpcMessage('PSMFirewall', Pchar(' DLL_PROCESS_ATTACH'),length(' DLL_PROCESS_ATTACH') ,nil,0);
  784.     DLL_THREAD_ATTACH:
  785.       SendIpcMessage('PSMFirewall', Pchar(' DLL_THREAD_ATTACH'),length(' DLL_THREAD_ATTACH') ,nil,0);
  786.     DLL_THREAD_DETACH :
  787.       SendIpcMessage('PSMFirewall', Pchar(' DLL_THREAD_DETACH'),length(' DLL_THREAD_DETACH') ,nil,0);
  788.     DLL_PROCESS_DETACH :
  789.       SendIpcMessage('PSMFirewall', Pchar(' DLL_PROCESS_DETACH'),length(' DLL_PROCESS_DETACH') ,nil,0);
  790.   end;
  791. end;
  792. }
  793. BEGIN
  794. {
  795.   if not assigned(DllProc) then
  796.     DllProc := @SafeDllProc;
  797.   SafeDllProc(DLL_PROCESS_ATTACH);
  798. }
  799.   GetModuleFileName(0,DLLPath,MAX_PATH);
  800.   //GetLongPathName(DLLPath,DLLPath,MAX_PATH);
  801.   ToLongPath(DLLPath,MAX_PATH);
  802.   StrLower(DllPath);
  803.   FillChar(DomainName,SizeOf(DomainName),' ');
  804.   FillChar(DomainIP,SizeOf(DomainIP),' ');
  805.   if not AmSystemProcess() then OpenMap else
  806.     //SendIpcMessage('PSMFirewall', Pchar(' System Process: ' + dllpath),length(' System Process: ' + dllpath),nil,0,IGNORE, TRUE);
  807.     SendIpcMessage('PSMFirewall', Pchar(' System Process: ' + dllpath + #0),length(' System Process: ' + dllpath + #0),nil,0);
  808.   //DONT_COUNT//Add to App?
  809.   LoadRules();
  810.   CollectHooks();
  811. if not HookAPI('WSOCK32.DLL', 'accept', @acceptCallback, @acceptNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: WSOCK32.dll.accept'#0),length(' Er HookAPI: WSOCK32.dll.accept'#0),nil,0);
  812.   if not HookAPI('WSOCK32.DLL', 'connect', @connectCallback, @connectNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: WSOCK32.dll.connect'#0),length(' Er HookAPI: WSOCK32.dll.connect'#0),nil,0);
  813.   if not HookAPI('WSOCK32.DLL', 'recv', @recvCallback, @recvNext)then  SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: WSOCK32.dll.recv'#0),length(' Er HookAPI: WSOCK32.dll.recv'#0),nil,0);
  814.   if not HookAPI('WSOCK32.DLL', 'recvfrom', @recvfromCallback, @recvfromNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: WSOCK32.dll.recvfrom'#0),length(' Er HookAPI: WSOCK32.dll.recvfrom'#0),nil,0);
  815.   if not HookAPI('WSOCK32.DLL', 'send', @sendCallback, @sendNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: WSOCK32.dll.send'#0),length(' Er HookAPI: WSOCK32.dll.send'#0),nil,0);
  816.   if not HookAPI('WSOCK32.DLL', 'sendto', @sendtoCallback, @sendtoNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: WSOCK32.dll.sendto'#0),length(' Er HookAPI: WSOCK32.dll.sendto'#0),nil,0);
  817.   if not HookAPI('WSOCK32.DLL', 'AcceptEx', @AcceptExCallback, @AcceptExNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: WSOCK32.dll.AcceptEx'#0),length(' Er HookAPI: WSOCK32.dll.AcceptEx'#0),nil,0);
  818.   if not HookAPI('WSOCK32.DLL', 'gethostbyname', @gethostbynameCallback, @gethostbynameNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: WSOCK32.dll.gethostbyname'#0),length(' Er HookAPI: WSOCK32.dll.gethostbyname'#0),nil,0);
  819. if not HookAPI('ws2_32.dll', 'accept', @acceptCallback, @acceptNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: ws2_32.dll.accept'#0),length(' Er HookAPI: ws2_32.dll.accept'#0),nil,0);
  820. if not HookAPI('ws2_32.dll', 'connect', @connectCallback, @connectNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: ws2_32.dll.connect'#0),length(' Er HookAPI: ws2_32.dll.connect'#0),nil,0);
  821. if not HookAPI('ws2_32.dll', 'recv', @recvCallback, @recvNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: ws2_32.dll.recv'#0),length(' Er HookAPI: ws2_32.dll.recv'#0),nil,0);
  822. if not HookAPI('ws2_32.dll', 'recvfrom', @recvfromCallback, @recvfromNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: ws2_32.dll.recvfrom'#0),length(' Er HookAPI: ws2_32.dll.recvfrom'#0),nil,0);
  823. if not HookAPI('ws2_32.dll', 'send', @sendCallback, @sendNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: ws2_32.dll.send'#0),length(' Er HookAPI: ws2_32.dll.send'#0),nil,0);
  824. if not HookAPI('ws2_32.dll', 'sendto', @sendtoCallback, @sendtoNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: ws2_32.dll.sendto'#0),length(' Er HookAPI: ws2_32.dll.sendto'#0),nil,0);
  825.   if not HookAPI('ws2_32.dll', 'AcceptEx', @AcceptExCallback, @AcceptExNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: ws2_32.dll.AcceptEx'#0),length(' Er HookAPI: ws2_32.dll.AcceptEx'#0),nil,0);
  826.   if not HookAPI('ws2_32.DLL', 'gethostbyname', @gethostbynameCallback, @gethostbynameNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: ws2_32.dll.gethostbyname'#0),length(' Er HookAPI: ws2_32.dll.gethostbyname'#0),nil,0);
  827.   {
  828. if not HookAPI('mswsock.dll', 'accept', @acceptCallback, @acceptNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: mswsock.dll.accept'#0),length(' Er HookAPI: mswsock.dll.accept'#0),nil,0);
  829. if not HookAPI('mswsock.dll', 'connect', @connectCallback, @connectNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: mswsock.dll.connect'#0),length(' Er HookAPI: mswsock.dll.connect'#0),nil,0);
  830. if not HookAPI('mswsock.dll', 'recv', @recvCallback, @recvNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: mswsock.dll.recv'#0),length(' Er HookAPI: mswsock.dll.recv'#0),nil,0);
  831. if not HookAPI('mswsock.dll', 'recvfrom', @recvfromCallback, @recvfromNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: mswsock.dll.recvfrom'#0),length(' Er HookAPI: mswsock.dll.recvfrom'#0),nil,0);
  832. if not HookAPI('mswsock.dll', 'send', @sendCallback, @sendNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: mswsock.dll.send'#0),length(' Er HookAPI: mswsock.dll.send'#0),nil,0);
  833. if not HookAPI('mswsock.dll', 'sendto', @sendtoCallback, @sendtoNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: mswsock.dll.sendto'#0),length(' Er HookAPI: mswsock.dll.sendto'#0),nil,0);
  834.   if not HookAPI('mswsock.dll', 'AcceptEx', @AcceptExCallback, @AcceptExNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: mswsock.dll.AcceptEx'#0),length(' Er HookAPI: mswsock.dll.AcceptEx'#0),nil,0);
  835.   }
  836.   //if not HookAPI('kernel32.dll', 'DeviceIoControl', @DeviceIoControlCallback, @DeviceIoControlNext) then SendIpcMessage('PSMFirewall', Pchar(' Er HookAPI: kernel32.dll.DeviceIoControl'#0),length(' Er HookAPI: kernel32.dll.DeviceIoControl'#0),nil,0);
  837.   FlushHooks();
  838. END.