![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Хочу написать программу на Delphi 2007: программа должна устанавливаться на компьютере и перехватывать весь трафик идущий в сеть/из сети через выбранный порт, а также иметь возможность модифицировать этот трафик.
Вопрос в том как лучше всего это реализовать, какие функции и библиотеки использовать, сам принцип перехвата? Буду рад любой помощи P.S. любителей посылать на гугл, прошу не беспокоить. |
|
#2
|
|||
|
|||
|
Сам уже неделю бьюсь головой в гугл (безуспешно), перечитав гору материала, понял что нужно делать хук wsock32.dll, там функции перехвата пакетов send и recv, затем нужно выделить первый заголовок пакета, он как раз будет нести информацию о сайте с которого пришёл или куда отправлен пакет и метод отправки, POST\GET. Если появиться информация, прошу отписаться, а то форумы превратились непонятно во что, авторы находят решение и сваливают. Некрасиво, можно было и кодом поделиться.
|
|
#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(последний стандарт умер, но поддерживается МС, на его смену пришел другой, начиная с висты).
|