Pergunta

Estou usando o SharppCap de Tamir para tentar enviar dados para o meu MSN.

Atualmente, para fins de teste, minha idéia é aguardar qualquer msg recebido por mymsn@msn.com e depois enviar o próprio pacote novamente, ou seja, fazer qualquer mensagem parecer repetida para sempre no meu MSN. Eu pensei que isso tinha que funcionar, pois estou simplesmente obtendo o pacote em si que recebo e reenviá -lo novamente.

Por alguma razão, nada aparece no meu MSN, embora eu veja impresso no console, muitos "dados capturados, renderizados". Alguma ideia? Obrigado

class Program {
    static PcapDevice device;

    static void Main(string[] args) {
        device = SharpPcap.GetAllDevices()[0];
        device.PcapOnPacketArrival +=
                new SharpPcap.PacketArrivalEvent(device_PcapOnPacketArrival2);
        device.PcapOpen(true, 1000);
        device.PcapStartCapture();

        Console.ReadKey();
    }

    static void device_PcapOnPacketArrival2(object sender, Packet packet) {
        TCPPacket tcpPacket = packet as TCPPacket;

        if (tcpPacket == null) {
            return;
        }

        string data = Encoding.Default.GetString(tcpPacket.Data);

        if (!data.StartsWith("MSG mymsn@msn.com")) {
            return;
        }

        Console.WriteLine("caught data, resending it");

        device.PcapSendPacket(tcpPacket);
    }
}
Foi útil?

Solução

Uma característica fundamental de TCP está "descartando pacotes duplicados"

Portanto, para resolver seu problema com o WinPCap, você terá que capturar todos os pacotes de uma mensagem MSN e reenvistá -la em novos pacotes. Espero que o MSN não aceite isso.

Nesse caso, aprender a lidar com o protocolo MSN poderia trazer uma solução para esse problema.

CodeProject Howto: Connect_to_msn_messenger

Talvez este C# lib MSNP-sharp de alguma forma resolve seu problema ou pelo menos lhe dá uma melhor compreensão de Protocolo de notificação da Microsoft

Outras dicas

Aqui está minha suspeita ...

Você está renderizando o pacote, que acredito que fará com que o driver da rede pense que recebeu o mesmo pacote duas vezes. Isso pode acontecer em vários casos, como a primeira ocorrência demorando um pouco para chegar, para que o remetente seja renderizado no caso de se perder.

O driver de rede (ou MSN) identificará o duplicado e o descartará - afinal, ele já viu esses dados, para que não precise da cópia redundante. Enviar explicitamente o mesmo pacote novamente basicamente não tem propósito.

Você também precisa considerar que está vendo um pacote em um fluxo De dados. Não há garantia de que esse pacote contenha exatamente Um único comando dizendo "Aqui está uma única mensagem". Pode terminar com o primeiro bit da próxima mensagem, por exemplo. Apenas inserir dados extras no fluxo não seria apenas difícil, mas também precisará entender o protocolo para fazê -lo corretamente.


Agora, quando você diz "nada aparece no meu msn", você quer dizer não extra mensagens, ou que a primeira mensagem não aparece? Se é que você não está recebendo repetição, o acima explica. Se você é efetivamente bloqueando MSN Ao executar este programa, isso é claramente um pouco diferente.

Eu diria que o MSN possui algum tipo de numeração de pacotes em nível de aplicativo, verificação de integridade e verificação de paródios. Qualquer outra coisa seria criminalmente incompetente para esse tipo de alvo de alto perfil.

Suponha que o MSN aplique a criptografia de fluxo encadeado aos pacotes que ele envia ... nesse caso, o recebimento de um pacote duplicado resultará apenas em lixo, pois o estado do algoritmo de criptografia será diferente (a descriptografia de um pacote configurar o estado de descriptografia para o próximo pacote na sequência). Assim, o pacote duplicado parecerá um pacote ruim para o MSN e será ignorado.

Portanto, a reprodução de pacotes provavelmente funcionará, mas o MSN garantirá que os ignore no nível do aplicativo. A menos que você entenda o protocolo no nível do aplicativo MSN, não poderá duplicar as mensagens de maneira simples.

Você não pode repetir um pacote TCP e esperar que o soquete o receba, existem números de pedidos em cada pacote. Se fosse UDP, talvez funcione, mas você também não pode confiar em pacotes para representar uma mensagem inteira UDP ou TCP.

Você está trabalhando em nível muito baixo, usa provedores de serviços em camadas para entrar entre a interface e o soquete, é como implementar um protocolo sobre o TCP, lá você pode repetir pacotes e, provavelmente, não haverá verificação no lado do aplicativo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top