Home › Forums › Discussions › Support › HTTP Redirection
- This topic has 5 replies, 2 voices, and was last updated 18 years, 4 months ago by Vadim Smirnov.
-
AuthorPosts
-
July 28, 2006 at 3:30 pm #5045
Subject is to catch client request to http://www.google.com for example and redirect it to another site. I detect if ip is google.com and change it, then I recalculate checksum of IP header and send packet to adapter. And it does not works. I have tried to indicate modified packet to MCTCP instead of sending to adapter – same result. The trick is that ping redirects normally and HTTP not 🙁 And Ethreal does not even indicate that packet is going out. But SendPacketToAdapter(MSTCP) returns true. As for MAC it does not need to be changed.
July 29, 2006 at 8:16 am #6106When you change IP address in the TCP packet you must also recalculate TCP checksum (IP address is included in the pseudo header). Other things are similar to ICMP if you have managed to get it working already.
July 29, 2006 at 1:24 pm #6107I have recalculated TCP checksum also. When sending packet I change desination IP and when recieving I change source IP(as was described in some topic here). Redirection of telnet, ping works fine and http redirection is not(( here is code
void filter()
{
WaitForSingleObject ( hEvent, INFINITE );
ResetEvent(hEvent);
while (api->ReadPacket(request))
{
if (buffer->m_dwDeviceFlags == PACKET_FLAG_ON_SEND)
{
printf("Attemp to send...n");
parsePacketHeaders(buffer);
api->SendPacketToAdapter(request);
}
if (buffer->m_dwDeviceFlags == PACKET_FLAG_ON_RECEIVE)
{
printf("Recieved...n");
parsePacketHeaders(buffer);
api->SendPacketToMstcp(request);
}
}
}
PINTERMEDIATE_BUFFER parsePacketHeaders ( PINTERMEDIATE_BUFFER pBuffer )
{
ether_header_ptr pEthernet = (ether_header_ptr)&pBuffer->m_IBuffer;
if(ntohs(pEthernet->h_proto) == ETH_P_IP)
{
iphdr_ptr pIp = NULL;
tcphdr_ptr pTcp = NULL;
pIp = (iphdr_ptr)&pBuffer->m_IBuffer[sizeof(ether_header)];
UCHAR IpProto = pIp->ip_p;
if(IpProto == IPPROTO_TCP)
{
//pTcp = (tcphdr_ptr)(((PUCHAR)pIp) + sizeof(DWORD)*pIp->ip_hl);
}//tcp??
//redirection here
if ((pIp->ip_dst.S_un.S_un_b.s_b3 == 32) & (pIp->ip_dst.S_un.S_un_b.s_b4 == 14))
{
pIp->ip_dst.S_un.S_un_b.s_b4 = 9;
pIp->ip_dst.S_un.S_un_b.s_b3 = 32;
recalculateIPChecksum(pBuffer);
recalculateTCPChecksum(pBuffer);
}
if ((pIp->ip_src.S_un.S_un_b.s_b3 == 32) & (pIp->ip_src.S_un.S_un_b.s_b4 == 9))
{
pIp->ip_src.S_un.S_un_b.s_b4 = 14;
pIp->ip_src.S_un.S_un_b.s_b3 = 32;
recalculateIPChecksum(pBuffer);
recalculateTCPChecksum(pBuffer);
}
}
return pBuffer;
}
SerpentFly – ты русский? Если да – то пиши по-русски)) А то я думал тут все из-за бугра.
Еще ethreal ом посмотрел – модифицированные http пакеты не выходят(( просто Ip(ping) telnet – нормально.August 1, 2006 at 5:41 am #6108SerpentFly – ты русский? Если да – то пиши по-русски)) А то я думал тут все из-за бугра.
Еще ethreal ом посмотрел – модифицированные http пакеты не выходят(( просто Ip(ping) telnet – нормально.Странно это все, разницы между телнетом и HTTP на этом уровне нет никакой, ты например можешь телнетом приконектится на 80 порт. Единственное, в HTTP GET запросе по хорошему нужно править еще и имя хоста, иначе сервер может не ответить.
Сам пакет разумеется никуда деться сам по себе не может. В сеть можно полный мусор слать при желании. Может быть стоит что-то (типа фаервола) что пакеты режет по каким-то своим таинственным критериям, в общем так посоветовать что-то сложно, нужно разбираться с данной конкретной системой. Могу посоветовать только попробовать все на чистой системе и сравнить.
August 1, 2006 at 11:38 am #6109Ну все – разобрался)) Outpost резал – воспринимал подмену как атаку. Еще один вопрос – не подскажешь где найти простенький алгоритм NAT на С++?
August 1, 2006 at 1:02 pm #6110На WinpkFilter здесь есть http://www.ntkernel.com/w&p.php?id=31
-
AuthorPosts
- You must be logged in to reply to this topic.