|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Программа-перехватчик (перехват траффика через выбранный порт)
Хочу написать программу на Delphi 2007: программа должна устанавливаться на компьютере и перехватывать весь трафик идущий в сеть/из сети через выбранный порт, а также иметь возможность модифицировать этот трафик.
Вопрос в том как лучше всего это реализовать, какие функции и библиотеки использовать, сам принцип перехвата? Буду рад любой помощи P.S. любителей посылать на гугл, прошу не беспокоить. |
#2
|
|||
|
|||
Сам уже неделю бьюсь головой в гугл (безуспешно), перечитав гору материала, понял что нужно делать хук wsock32.dll, там функции перехвата пакетов send и recv, затем нужно выделить первый заголовок пакета, он как раз будет нести информацию о сайте с которого пришёл или куда отправлен пакет и метод отправки, POST\GET. Если появиться информация, прошу отписаться, а то форумы превратились непонятно во что, авторы находят решение и сваливают. Некрасиво, можно было и кодом поделиться.
|
#3
|
||||
|
||||
Вот тут у Розыча есть пример сниффера.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#4
|
||||
|
||||
|
#5
|
|||
|
|||
Это всё не то, смотрите, получаем пакет, смотрим именно заголовок, куда он пошёл. Если запрещённый url. Пакет отсекаем, именно так. Потому что вот эти сниферы показывают на какой IP пакет пошёл, а если я работаю через прокси, то этими сниферами ничего кроме проксика не видно. Поправьте если ошибаюсь.
|
#6
|
|||
|
|||
Почитал книгу Михаила Флёнова "Delphi в шутку и в серьез что умеют хакеры". Там был пример фаерволла, основанного на Paket Filtering (система фильтрация пакетов от мелкомягких), который доступен начиная с Windows 2000. Так вот, я взял его пример, откомпилил, добавил в фильтр IP начал пинговать, он один фиг пингуеться... Я в печали
Вот исходник его юнита: Код:
unit MainUnit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, fltdefs, winsock, StdCtrls; type PIpBytes = ^TIpBytes; TIpBytes = Array [0..3] of Byte; type TFirewallForm = class(TForm) btStartFilter: TButton; btStopFilter: TButton; procedure btStartFilterClick(Sender: TObject); procedure btStopFilterClick(Sender: TObject); private { Private declarations } public { Public declarations } hIF : INTERFACE_HANDLE; ipLocal : TIpBytes; function StrToIp(lpszIP: PChar; lpipAddr: PIpBytes): PIpBytes; function GetLocalIPAddr(lpipAddr: PIpBytes): Boolean; procedure AddFilter(inP: Boolean; lpszRemote: PChar; protoType: DWORD; lpszPort: PChar); end; var FirewallForm: TFirewallForm; implementation {$R *.dfm} function TFirewallForm.StrToIp(lpszIP: PChar; lpipAddr: PIpBytes): PIpBytes; var lpszStr : Array [0..63] of Char; dwPos : Integer; lpPos : PChar; begin StrLCopy(@lpszStr, lpszIP, SizeOf(lpszStr)); lpszStr[Pred(SizeOf(lpszStr))]:=#0; ZeroMemory(lpipAddr, SizeOf(TIpBytes)); dwPos:=Pred(SizeOf(TIpBytes)); lpPos:=StrRScan(lpszStr, '.'); while Assigned(lpPos) do begin lpPos^:=#0; Inc(lpPos); lpipAddr^[dwPos]:=StrToIntDef(lpPos, 0); Dec(dwPos); if (dwPos = 0) then break; lpPos:=StrRScan(lpszStr, '.'); end; lpipAddr^[dwPos]:=StrToIntDef(lpszStr, 0); result:=lpipAddr; end; function TFirewallForm.GetLocalIPAddr(lpipAddr: PIpBytes): Boolean; var lpszLocal: Array [0..255] of Char; pheAddr: PHostEnt; begin if (gethostname(lpszLocal, SizeOf(lpszLocal)) = 0) then begin pheAddr:=gethostbyname(lpszLocal); if Assigned(pheAddr) then begin Move(pheAddr^.h_addr_list^^, lpipAddr^, 4); result:=True; end else result:=False; end else result:=False; end; procedure TFirewallForm.AddFilter(inP: Boolean; lpszRemote: PChar; protoType: DWORD; lpszPort: PChar); var ipFlt : PF_FILTER_DESCRIPTOR; dwPort : Integer; ipDest : TIpBytes; ipSrcMask : TIpBytes; ipDstMask :TIpBytes; begin ZeroMemory(@ipFlt, SizeOf(ipFlt)); ipFlt.dwFilterFlags:=FD_FLAGS_NOSYN; ipFlt.dwRule:=0; ipFlt.pfatType:=PF_IPV4; ipFlt.fLateBound:=0; ipFlt.dwProtocol:=protoType; if Assigned(lpszPort) then dwPort:=StrToIntDef(lpszPort, FILTER_TCPUDP_PORT_ANY) else dwPort:=FILTER_TCPUDP_PORT_ANY; if inP then begin ipFlt.wDstPort:=FILTER_TCPUDP_PORT_ANY; ipFlt.wDstPortHighRange:=FILTER_TCPUDP_PORT_ANY; ipFlt.wSrcPort:=dwPort; ipFlt.wSrcPortHighRange:=dwPort; end else begin ipFlt.wDstPort:=dwPort; ipFlt.wDstPortHighRange:=dwPort; ipFlt.wSrcPort:=FILTER_TCPUDP_PORT_ANY; ipFlt.wSrcPortHighRange:=FILTER_TCPUDP_PORT_ANY; end; StrToIP('255.255.255.0', @ipSrcMask); StrToIP('255.255.255.0', @ipDstMask); if inP then begin if Assigned(lpszRemote) then begin ipFlt.SrcAddr:=PByteArray(StrToIp(lpszRemote, @ipDest)); ipFlt.SrcMask:=@ipSrcMask; end else begin ipFlt.SrcAddr:=PByteArray(StrToIp('0.0.0.0', @ipDest)); StrToIP('0.0.0.0', @ipSrcMask); ipFlt.SrcMask:=@ipSrcMask; end; ipFlt.DstAddr:=@ipLocal; ipFlt.DstMask:=@ipDstMask; PfAddFiltersToInterface(hIF, 1, @ipFlt, 0, nil, nil); end else begin ipFlt.SrcAddr:=@ipLocal; ipFlt.SrcMask:=@ipSrcMask; if Assigned(lpszRemote) then begin ipFlt.DstAddr:=PByteArray(StrToIp(lpszRemote, @ipDest)); ipFlt.DstMask:=@ipDstMask; end else begin ipFlt.DstAddr:=PByteArray(StrToIp('0.0.0.0', @ipDest)); StrToIP('0.0.0.0', @ipDstMask); ipFlt.DstMask:=@ipDstMask; end; PfAddFiltersToInterface(hIF, 0, nil, 1, @ipFlt, nil); end; end; procedure TFirewallForm.btStartFilterClick(Sender: TObject); var wsaData: TWSAData; begin if (WSAStartup(MakeWord(1, 1), wsaData) <> 0) then begin ShowMessage('Îøèáêà Winsock'); exit; end; if not GetLocalIPAddr(@ipLocal) then exit; //Ñîçäàíèå èíòåðôåéñà PfCreateInterface(0, PF_ACTION_FORWARD, PF_ACTION_FORWARD, False, True, hIF); // Äîáàâëåíèå íåñêîëüêèõ ôèëüòðîâ AddFilter(true, '192.168.1.1', FILTER_PROTO_TCP, nil); AddFilter(true, '192.168.8.57', FILTER_PROTO_TCP, '21'); AddFilter(false, '192.168.1.3', FILTER_PROTO_ANY, '7'); AddFilter(true, '192.168.1.4', FILTER_PROTO_UDP, '1024'); // Áëîêèðîâêà ëþáûõ èñõîäÿùèõ îáðàùåíèé ê 80-ìó ïîðòó AddFilter(false, nil, FILTER_PROTO_TCP, '21'); // Ïðèâÿçàòü èíòåðôåéñ ê ëîêàëüíîìó àäðåñó PfBindInterfaceToIPAddress(hIF, PF_IPV4, @ipLocal); btStopFilter.Enabled:=true; end; procedure TFirewallForm.btStopFilterClick(Sender: TObject); begin PfUnBindInterface(hIF); PfDeleteInterface(hIF); WSACleanup; btStopFilter.Enabled:=false; end; end. |
#7
|
|||
|
|||
и fltdefs.pas
Код:
unit fltdefs; interface uses Windows; const IPHLPAPI = 'IPHLPAPI.DLL'; // Byte array type TByteArray = Array [0..Pred(MaxInt)] of Byte; PByteArray = ^TByteArray; // Data types type FILTER_HANDLE = Pointer; PFILTER_HANDLE = ^FILTER_HANDLE; INTERFACE_HANDLE = Pointer; PINTERFACE_HANDLE = ^INTERFACE_HANDLE; const GF_FRAGMENTS = 2; GF_STRONGHOST = 8; GF_FRAGCACHE = 9; type GLOBAL_FILTER = Integer; PGLOBAL_FILTER = ^GLOBAL_FILTER; const PF_IPV4 = 0; PF_IPV6 = 1; type PFADDRESSTYPE = Integer; PPFADDRESSTYPE = ^PFADDRESSTYPE; const PF_ACTION_FORWARD = 0; PF_ACTION_DROP = 1; type PFFORWARD_ACTION = Integer; PPFFORWARD_ACTION = ^PPFFORWARD_ACTION; // PFFrameType enumeration const PFFT_FILTER = 1; PFFT_FRAG = 2; PFFT_SPOOF = 3; type PFFRAMETYPE = Integer; PPFFRAMETYPE = ^PFFRAMETYPE; type _PF_FILTER_DESCRIPTOR = packed record dwFilterFlags: DWORD; dwRule: DWORD; pfatType: PFADDRESSTYPE; SrcAddr: PByteArray; SrcMask: PByteArray; DstAddr: PByteArray; DstMask: PByteArray; dwProtocol: DWORD; fLateBound: DWORD; wSrcPort: Word; wDstPort: Word; wSrcPortHighRange: Word; wDstPortHighRange: Word; end; PF_FILTER_DESCRIPTOR = _PF_FILTER_DESCRIPTOR; PPF_FILTER_DESCRIPTOR = ^PF_FILTER_DESCRIPTOR; type _PF_FILTER_STATS = packed record dwNumPacketsFiltered:DWORD; info: PF_FILTER_DESCRIPTOR; end; PF_FILTER_STATS = _PF_FILTER_STATS; PPF_FILTER_STATS = ^PF_FILTER_STATS; type _PF_INTERFACE_STATS = packed record pvDriverContext: Pointer; dwFlags: DWORD; dwInDrops: DWORD; dwOutDrops: DWORD; eaInAction: PFFORWARD_ACTION; eaOutAction: PFFORWARD_ACTION; dwNumInFilters: DWORD; dwNumOutFilters: DWORD; dwFrag: DWORD; dwSpoof: DWORD; dwReserved1: DWORD; dwReserved2: DWORD; liSyn: LARGE_INTEGER; liTotalLogged: LARGE_INTEGER; dwLostLogEntries: DWORD; FilterInfo: Array [0..0] of PF_FILTER_STATS; end; PF_INTERFACE_STATS = _PF_INTERFACE_STATS; PPF_INTERFACE_STATS = ^PF_INTERFACE_STATS; type _PF_LATEBIND_INFO = packed record SrcAddr: PByteArray; DstAddr: PByteArray; Mask: PByteArray; end; PF_LATEBIND_INFO = _PF_LATEBIND_INFO; PPF_LATEBIND_INFO = ^PF_LATEBIND_INFO; type _PFLOGFRAME = packed record Timestamp: LARGE_INTEGER; pfeTypeOfFrame: PFFRAMETYPE; dwTotalSizeUsed: DWORD; dwFilterRule: DWORD; wSizeOfAdditionalData:Word; wSizeOfIpHeader: Word; dwInterfaceName: DWORD; dwIPIndex: DWORD; bPacketData: Array [0..0] of Byte; end; PFLOGFRAME = _PFLOGFRAME; PPFLOGFRAME = ^PFLOGFRAME; const FILTER_PROTO_ANY = $00; FILTER_PROTO_ICMP = $01; FILTER_PROTO_TCP = $06; FILTER_PROTO_UDP = $11; FILTER_TCPUDP_PORT_ANY = $00; const FILTER_ICMP_TYPE_ANY = $FF; FILTER_ICMP_CODE_ANY = $FF; const FD_FLAGS_NOSYN = $01; FD_FLAGS_ALLFLAGS = FD_FLAGS_NOSYN; const LB_SRC_ADDR_USE_SRCADDR_FLAG = $00000001; LB_SRC_ADDR_USE_DSTADDR_FLAG = $00000002; LB_DST_ADDR_USE_SRCADDR_FLAG = $00000004; LB_DST_ADDR_USE_DSTADDR_FLAG = $00000008; LB_SRC_MASK_LATE_FLAG = $00000010; LB_DST_MASK_LATE_FLAG = $00000020; const ERROR_BASE = 23000; PFERROR_NO_PF_INTERFACE = (ERROR_BASE + 0); // never returned. PFERROR_NO_FILTERS_GIVEN = (ERROR_BASE + 1); PFERROR_BUFFER_TOO_SMALL = (ERROR_BASE + 2); ERROR_IPV6_NOT_IMPLEMENTED = (ERROR_BASE + 3); function PfCreateInterface( dwName: DWORD; inAction: PFFORWARD_ACTION; outAction: PFFORWARD_ACTION; bUseLog: BOOL; bMustBeUnique: BOOL; var ppInterface: INTERFACE_HANDLE): DWORD; stdcall; external IPHLPAPI name '_PfCreateInterface@24'; function PfDeleteInterface( pInterface: INTERFACE_HANDLE): DWORD; stdcall; external IPHLPAPI name '_PfDeleteInterface@4'; function PfAddFiltersToInterface( ih: INTERFACE_HANDLE; cInFilters: DWORD; pfiltIn: PPF_FILTER_DESCRIPTOR; cOutFilters: DWORD; pfiltOut: PPF_FILTER_DESCRIPTOR; pfHandle: PFILTER_HANDLE): DWORD; stdcall; external IPHLPAPI name '_PfAddFiltersToInterface@24'; function PfRemoveFiltersFromInterface( ih: INTERFACE_HANDLE; cInFilters: DWORD; pfiltIn: PPF_FILTER_DESCRIPTOR; cOutFilters: DWORD; pfiltOut: PPF_FILTER_DESCRIPTOR): DWORD; stdcall; external IPHLPAPI name '_PfRemoveFiltersFromInterface@20'; function PfRemoveFilterHandles( pInterface: INTERFACE_HANDLE; cFilters: DWORD; pvHandles: PFILTER_HANDLE): DWORD; stdcall; external IPHLPAPI name '_PfRemoveFilterHandles@12'; function PfUnBindInterface( pInterface: INTERFACE_HANDLE): DWORD; stdcall; external IPHLPAPI name '_PfUnBindInterface@4'; function PfBindInterfaceToIndex( pInterface: INTERFACE_HANDLE; dwIndex: DWORD; pfatLinkType: PFADDRESSTYPE; LinkIPAddress: PByteArray): DWORD; stdcall; external IPHLPAPI name '_PfBindInterfaceToIndex@16'; function PfBindInterfaceToIPAddress( pInterface: INTERFACE_HANDLE; pfatLinkType: PFADDRESSTYPE; IPAddress: PByteArray): DWORD; stdcall; external IPHLPAPI name '_PfBindInterfaceToIPAddress@12'; function PfRebindFilters( pInterface: INTERFACE_HANDLE; pLateBindInfo: PPF_LATEBIND_INFO): DWORD; stdcall; external IPHLPAPI name '_PfRebindFilters@8'; function PfAddGlobalFilterToInterface( pInterface: INTERFACE_HANDLE; gfFilter: GLOBAL_FILTER): DWORD; stdcall; external IPHLPAPI name '_PfAddGlobalFilterToInterface@8'; function PfRemoveGlobalFilterFromInterface( pInterface: INTERFACE_HANDLE; gfFilter: GLOBAL_FILTER): DWORD; stdcall; external IPHLPAPI name '_PfRemoveGlobalFilterFromInterface@8'; function PfMakeLog( hEvent: THandle): DWORD; stdcall; external IPHLPAPI name '_PfMakeLog@4'; function PfSetLogBuffer( pbBuffer: PByteArray; dwSize: DWORD; dwThreshold: DWORD; dwEntries: DWORD; pdwLoggedEntries: PDWORD; pdwLostEntries: PDWORD; pdwSizeUsed: PDWORD): DWORD; stdcall; external IPHLPAPI name '_PfSetLogBuffer@28'; function PfDeleteLog( ): DWORD; stdcall; external IPHLPAPI name '_PfDeleteLog@0'; function PfGetInterfaceStatistics( pInterface: INTERFACE_HANDLE; ppfStats: PPF_INTERFACE_STATS; pdwBufferSize: PDWORD; fResetCounters: BOOL): DWORD; stdcall; external IPHLPAPI name '_PfGetInterfaceStatistics@16'; function PfTestPacket( pInInterface: INTERFACE_HANDLE; pOutInterface: INTERFACE_HANDLE; cBytes: DWORD; pbPacket: PByteArray; ppAction: PPFFORWARD_ACTION): DWORD; stdcall; external IPHLPAPI name '_PfTestPacket@20'; implementation end. |
#8
|
|||
|
|||
Ну кто нибудь пробовал, нет, может кто разобрался? что все такие безучастные.
|
#9
|
|||
|
|||
Привет dr.5y51em ! Есть такая штука ip packet logger называется.Исходник для дельфи, скачивал с этого сайта.Ищи в разделе "программы".Тока как она порты сканит я пока не знаю.
|
#10
|
||||
|
||||
Способов перехвата, всё зависит от того, что ты конкретно хочешь получить. Если нужно что-то простое, то используй перехват ВинСокетов. Если нужен перехват для защитных механизмов пиши драйвер NDIS или TDI(последний стандарт умер, но поддерживается МС, на его смену пришел другой, начиная с висты).
|