LER E ESCREVER EM PORTA LOGICA

MARCOS 25/09/2013 15:34:12
#429273
Bom dia!
Pessoal,pesquisei na internet e encontrei alguns exemplos de
códigos em vb e VB.NET,para ler e se comunicar com a porta
serial do micro.Mas, o que preciso'para um projeto é um pouco diferente:
Se algum colega souber e puder me dar uma dica,fico grato:

1.) Preciso de algum utilitário,ou código,etc.. que me liste quais portas
lógicas estão sendo usadas pelos aplicativos com acesso a internet,que estiverem abertos
no meu computador.

2.) Um exemplo em VB,ou .NET de código que permita ler/escrever numa porta lógica qualquer
do micro. Pesquisando,encontrei exemplo,para ler/Escrever na porta serial e paralela,Mas o
que preciso é ler/Escrever em uma porta lógica.


Agradeço qualquer ajuda.
OCELOT 25/09/2013 15:57:11
#429276
Resposta escolhida
E o que seria uma porta lógica? Sinceramente nunca ouvi este termo antes em programação.
MARCOS 26/09/2013 09:25:56
#429289
Ocelot,
Portas são posições na memória,onde o sistema operacional armazena/lê dados,com o intuito de se comunicar com
um dispositivo externo qualquer. Uma Balança,outra aplicação,etc...
As portas seriais e paralela do computador,são chamadas de portas fisicas.O Framework do .NET tem classes especificas
para lidar com a poprta serial,por exemplo.Mas,o que preciso é ler /escrever em outras portas do micro.

Algum colega,pode ajudar???????
OCELOT 26/09/2013 14:21:29
#429302
Eu entendo o que são portas, sei como funcionam portas seriais e paralelas, sejam elas físicas ou virtuais.

A questão é que você falou de porta lógica e não sei o que você se refere a isso, pois eu posso por exemplo parear um dispositivo bluetooth que tenha suporte a rfcomm e ele vai aparecer para mim no PC como se fosse uma porta serial, porém ela não é física, ela é virtual, mas funciona exatamente como a porta física.

Agora você diz porta lógica, mas o que é uma porta lógica? Você se refere a por exemplo o que é usado na hora que se abre um site? Se for isso é uma porta TCP/IP, neste caso se usa Sockets para se enviar e receber dados, porém você tem que passar por todo o processo de conexão para poder fazer isso, e não tem como escrever e ler uma porta que foi aberta por outro programa, sem explicar melhor o que você pretende fazer na sua segunda pergunta não tem muito como ajudar.

E se na sua primeira pergunta você quer apenas um utilitário o próprio Windows tem um para listar todas as portas TCP e UDP que estão abertas, inclusive pode mostrar o nome do programa que abriu ela.

é só abrir o prompt de comando do windows e usar o comando [Ô]netstat[Ô] sem as aspas que ele mostra todas as conexões estabelecidas em seu PC, mostrando o endereço e a porta local (do seu PC) e externa (do PC remoto) que está sendo usada.

Você ainda pode usar alguns parâmetros para mostrar outras informações como por exemplo

netstat -a

Isso vai mostrar todas as portas que estão abertas e esperando conexão no seu PC

O comando pode demorar um pouco por que por padrão ele tenta resolver o endereço IP para um nome, para impedir isso e sempre mostrar o IP você pode usar o parâmetro -n, e para mostrar qual programa pertence aquela conexão você pode usar o -b, porém isso requer que seja executado como administrador, ou o -o que exibe apenas o PID do processo, porém esse não requer permissões de administrador, então

netstat -a -b -n -o

Com isso mostraria todas as portas abertas no seu pc, mostrando apenas IPs e não nomes, mostrando o nome do exe e o PID
MARCOS 26/09/2013 15:52:16
#429307
Boa tarde,Ocelot!
Muito obrigado,por suas respostas.

1.) Com relação a listar as portas que estão sendo usadas por aplicativos na minha máquina,
sua sugestão funcionou perfeitamente! Obrigado.


Obs: Tem uma pergunta importante,que esqueci de fazer, e se não for abuzar de sua boa vontade.
é o seguinte:

Eu li,num artigo sobre Hardware,que na prática,estas [Ô]Portas[Ô] usadas para comunicação entre um micro
e outro remoto (Via TCP/IP), são simples posições de memória.é possível,por meio de algum comando
windows ou código, saber que endereço de posição de memória a porta esta usando?????


Motivo: é que no caso do meu aplicativo,preciso ler esta informação colocada na porta,ao mesmo tempo
que não posso atrapalhar o programa que esta usando ela. (é que é um programa,que tem de ficar
aberto,eu só fecho em último caso.Você explicou ,que não dá para ler,com outro programa usando
a porta.Por isto,queria saber se é possível ler da posição de memória,correspondente a porta.
OCELOT 27/09/2013 10:20:40
#429333
Estas conexões não são tão simples assim, a implementação de como funciona realmente pode até ser que seja algum endereço na memória, mas você não vai de forma alguma conseguir acessar isso pela memória.

O Windows possui funções próprias para este tipo de comunicação, que é através do winsock (mas não o winsock do VB6), ele possui certas funções para criar um socket, conectar, receber e enviar dados, entre outras. Sem o socket você não faz nada, e não é nada simples interceptar o que está sendo enviado por outro programa, menos ainda se você precisar enviar informações como se fosse o programa.

Existem duas técnicas que conheço que são usadas geralmente quando se precisa fazer isso, as duas são basicamente do tipo [Ô]man in the middle[Ô], onde basicamente você vai colocar o seu programa entre o outro programa e o que ele conecta.

Se você consegue redirecionar o outro programa para conectar em qualquer lugar a primeira alternativa é você criar um programa que fica esperando o outro se conectar em você e então você se conecta no servidor que ele normalmente conectaria, assim tudo que ele envia chega pra você e você repassa para o servidor, e o que o servidor mandar chega pra você e você repassa para o cliente, o que seria mais ou menos o funcionamento de um proxy.

A outra alternativa é mais complexa e acredito que não é possível com o .Net puro, precisaria ser feita em C/C++ ou alguma outra linguagem nativa, que seria interceptar as chamadas das funções do winsock trocando por funções falsas suas, como por exemplo as funções socket, connect, recv, send e select, pois assim quando o programa chamasse estas funções o que seria executado na verdade seriam as suas funções falsas, e ai você mesmo chamaria as funções verdadeiras de forma que você já saberia o que ele está enviando e quando chegasse algo você já saberia o que chegou.

Você tem que ver que por mais que a implementação do hardware use acesso direto a memória (DMA) não significa que um programa possa se comunicar com o hardware dessa forma, e como os sistemas operacionais modernos rodam em modo protegido, com os programas rodando em ring 3 e cada um com seu próprio espaço de memória virtual você nem mesmo consegue ler a memória de outro programa simplesmente pelo endereço, pois o seu programa pode ter um valor em um endereço e outro programa pode ter um valor totalmente diferente neste mesmo endereço, afinal o endereçamento é virtual.
MARCOS 27/09/2013 13:29:10
#429343
Boa tarde,Ocelot!
Desnecessário, concluir que você tem um vasto conhecimento sobre o tema.
Fico muito grato,por se dispor a me esclarecer tudo isto.Não se trata de mera
curiosidade minha.Estou de fato,tentando verificar se resolvo um problema que
tenho.Das duas alternativas que citou:

- A segunda de fato é muito complexa
- A primeira,embora igualmente dificil me pareceu ser ao menos possível....

Você pode me indicar algum material que eu possa estudar e correr atrás.
Por exemplo, Winsock, já é de cara um tópico a ser estudado por mim.
Mas,quanto a esta técnica [Ô]man in the middle[Ô], Existe algum local onde
posso encontrar material para estudar ???

OCELOT 27/09/2013 14:06:03
#429347
Man in the middle na verdade é uma técnica de ataque usada para se interceptar comunicações, não tem muito o que ler sobre ela já que é basicamente o que eu disse, você colocar seu software no meio para interceptar e repassar as informações entre o cliente e servidor sem que eles saibam disso, o como implementar ele depende do que está tentando interceptar.

E realmente não sei te indicar nenhum material bom sobre o assunto, eu aprendi basicamente lendo a documentação do Winsock e fazendo testes na prática, porém a documentação é mais voltada para o C, e no caso de se usar outras linguagens geralmente se tem classes que vão encapsular o Winsock como por exemplo no .Net se tem o namespace System.Net.Sockets e a classe Socket, entre outras.

Sobre a segunda alternativa o máximo que posso te passar é este link: http://www.codeproject.com/Articles/5178/DLL-Injection-and-function-interception-tutorial
Este é um exemplo em C de como interceptar funções, inclusive me parece q nesse exemplo ele trata exatamente das funções do Winsock, só que um detalhe que não te passei é que para você interceptar uma função o seu código tem de rodar no mesmo processo que o programa que abre a conexão, então isso é feito geralmente [Ô]injetando[Ô] uma dll no outro processo, e este exemplo faz isso também, ele tem um exe e uma dll, o exe injeta a dll em outro processo e a dll então intercepta as funções do winsock, mas já fique avisado que não é nada simples fazer isso.
MARCOS 27/09/2013 15:34:29
#429353
Muito obrigado,Ocelot!
Creio que o que vou ter de fazer agora,é avaliar a relação custo beneficio, e analisar se vale
a pena se debruçar sobre estes temas complexos,para concluir o projeto, ou se colocoo projeto na pasta
de projetos [Ô]Inviáveis[Ô] na prática.

Novamente,muito obrigado pelos esclarecimentos.
Tópico encerrado , respostas não são mais permitidas