Ir para conteúdo
Fórum Script Brasil
  • 0

Interagindo Em Rede


renatodex

Pergunta

Olá pessoal, a minha dúvida é a seguinte:

Imaginem um projeto do VB. Um formulário e ele funcionaria da seguinte maneira:

Quando alguém, tivesse o programa (o projeto do VB) enviasse um login e uma senha a partir de um formulário em VB, essa senha e login seriam enviados para o programa em VB que escutaria pela pora 666 e, se o login fosse "Admin" e a senha "acessar", apareceria uma mensagem em vermelho no programa dizendo que a senha digitada pelo usuario do ip xxx.xxx.xxx.xxx está correta.

Não sei se eu expliquei direito, mais é possível fazer isso em VB? Como?

Eu queria muito saber como fazer isso!! xD

Vlw pelo suporte! rolleyes.gif

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

Hmm..gramaykin você que me parece um cara sabido do assunto (xD).

Conhece um NMMORPG chamado Ragnarok? Como em todo jogo online, existe uma tela para se logar...tibia, ragnarok, lineage...o que eu queria fazer essa fazer o visual basic interpretar esses campos de login e senha e transforma-los em variaveis para que eu pudesse manipula-los no meu projeto. Existe um modo de fazer isso?

Vlw pela ajuda, os sockets foram muito uteis!

Exemplo:

Vamo supor que eu to na tela de login do jogo, ai eu digito o login fulano e uma senha qualquer Ai lá no meu form do vb ele imprime:

Fulano se conectou no jogo!

smile.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Hmm..gramaykin você que me parece um cara sabido do assunto (xD).

Nem tanto... biggrin.gif

Conhece um NMMORPG chamado Ragnarok? Como em todo jogo online, existe uma tela para se logar...tibia, ragnarok, lineage...o que eu queria fazer essa fazer o visual basic interpretar esses campos de login e senha e transforma-los em variaveis para que eu pudesse manipula-los no meu projeto. Existe um modo de fazer isso?

Então você quer o contrário do que você disse no primeiro post, certo? Bom, dependendo de como é a tela de login é possível obter os valores dos campos utilizando funções da API Win32 (como FindWindow, FindWindowEx e GetWindowText). Não conheço nenhum desses citados (Tíbia, Ragnarok, Lineage...), por não conhecer nenhum NMMORPG.

Vlw pela ajuda, os sockets foram muito uteis!

biggrin.gif

Exemplo:

Vamo supor que eu to na tela de login do jogo, ai eu digito o login fulano e uma senha qualquer Ai lá no meu form do vb ele imprime:

Fulano se conectou no jogo!

Se sua idéia é realmente pegar os dados do formulário e saber se o cara "tentou" se conectar, acho que a idéia seria a que expus acima. Todavia, se sua intenção é "captar" os dados enviados e a resposta do servidor, para realmente confirmar que o cara entrou, então a idéia é bem diferente e vai envolver a criação de uma espécie de "filtro" de rede, no qual você vai poder "ver" o que está sendo enviado e recebido. Nesse caso, acho que o WinPcap é que lhe vai ser útil: http://www.winpcap.org/default.htm. Infelizmente só conheço de nome e nunca realmente o utilizei.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Umm interessante mais eu só estou vendo códigos em C, arquivos e mais arquivos em C. Até o manual explica como usar em C, mais e em VB, ninguém sabe não?

Acontece que na verdade eu estou involvido na criação de um emulador legal para jogos do tipo MMORPG onde um computador remoto 'emula' o servidor como se ele fosse o oficial. E eu estava me concentrando na montagem da sessão de login, quando me apareceu esse problema. Porque quando o cara digita o login e senha, eu não tenho como saber quais são os nomes desses campos e como eles podem ser passados de um formulario (no caso o jogo) para outro (no caso o form do VB).

Mais acho que estou começando a entender.

Link para o comentário
Compartilhar em outros sites

  • 0
Umm interessante mais eu só estou vendo códigos em C, arquivos e mais arquivos em C. Até o manual explica como usar em C, mais e em VB, ninguém sabe não?

Aqui você encontra programas e bibliotecas baseadas no WinPcap (e existem alguns projetos que produziram componentes ActiveX, que podem ser utilizados no VB):

http://www.winpcap.org/misc/links.htm

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Hehehehe é que o projeto se chama Hades e 666 é o numero da besta por isso combinou!!! xDDDD

Então Gramaykin eu já tinha visto esse Winpcap mais eu não sei como usar ele, eu vi o manual e etc mais ele num especifica muita coisa. Ainda é um grande mistério pra mim fazer essa filtração (bom, não me parece ser facil eu vi pra C e fiocu um código digamos, grandinho!!)

É facil de usar isso? Eu até cheguei a adicionar o componente no visual básic mais não consegui usa-lo de jeito manero xD

Como eu vou fazer pra passar os campos que vem do jogo (que não tem nada haver com o formulario do vb) para o meu formulario? Ainda está meio nebuloso nessa parte pra mim XD

Eu sei que você nunca usou o programa e eu não quero te forçar mais é que eu não entendo muito de sockets ainda, já até dei uma busca no google mais não achei nada interessante (só uma propaganda do mercado livre de um cara vendendo meia, 1 real cada!! Baratao!!) xD

Se você puder me ajudar nesta ultima dúvida eu ficarei eternamente agradecido xD

Link para o comentário
Compartilhar em outros sites

  • 0

Existe ainda a outra possibilidade, ou seja, de pegar os dados via API do Windows. Como é essa tela de login do jogo? Se for uma janela normal experimente pegar esse programa: http://www.graymalkin.globalhosts.com.br/stuff/Fww.zip. Ele gera o código, em VB, necessário para encontrar uma determinada janela ("janela", nesse caso, é um termo mais amplo e abrange também caixas de texto, botões, etc.). Para tanto, basta arrastar a mira (um ícone com uma "mira" que existe no programa) para cima do campo desejado e depois clicar no botão "Write Source". Se ele for capaz de gerar o código, talvez seja mais fácil do que utilizar sockets.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
A tela de login está em um ambiente gráfico, quando eu arrasto a crosshair nada acontece, digo, não aparece o nome do campo em cima =/

Hmm eu acho que esse filtro vai ser necessário mesmo, só não sei como fazer =/

http://packetvb.sourceforge.net/ - Você viu isso aqui? Não parece ser difícil de se utilizar. Tente aí e qualquer coisa, dê um grito que a gente tenta ajudar.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

-- EDIT --

Ops, desculpa o double post, foi sem querer, deu um erro ai quando eu cliquei de novo já tinha mandado uma vez...mals xD

-- EDIT --

Gramalkyn vlw pela ajuda, ve se me ajuda nessa dúvida olha:

Você postou um link ai que tinha um tuto de como usar Sockets, dae eu fui seguindo o tuto e consegui até fazer bem. Na verdade ficou ótimo. Mais ai tipu quando o Servidro enviava uma mensagem aparecia no cliente assim:

Servidor: Mensagem

E quando o Cliente mandava uma mensagem pro servidor, aparecia no servidor:

Cliente: Mensagem

Claro que isso foi padronizado nos códigos mais eu queria fazer com que o 'nick' (no caso "Servidor:" ou "Cliente:") pudesse ser estipulado e mandado junto com a mensagem.

Mais quando eu tentei definir duas variaveis, uma com a mensagem e outra com o nick que ia ser mandado, ficou assim o resultado:

MensagemNick

Ou seja, parece que ele concatenou tudo. A minha dúvida era saber como mandar esses dados separados, pra eles serem interpretados separadamente porque ai eu ia poder manipular eles mais facilmente. Eu até pensei em um tipo de substring mais fiquei com preguiça de tentar pensando que havia outro jeito mais conveniente. rolleyes.gif

Se puder ajudar vlw ae!! tongue.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Gramalkyn vlw pela ajuda, ve se me ajuda nessa dúvida olha:

Você postou um link ai que tinha um tuto de como usar Sockets, dae eu fui seguindo o tuto e consegui até fazer bem. Na verdade ficou ótimo. Mais ai tipu quando o Servidro enviava uma mensagem aparecia no cliente assim:

Servidor: Mensagem

E quando o Cliente mandava uma mensagem pro servidor, aparecia no servidor:

Cliente: Mensagem

Claro que isso foi padronizado nos códigos mais eu queria fazer com que o 'nick' (no caso "Servidor:" ou "Cliente:") pudesse ser estipulado e mandado junto com a mensagem.

Mais quando eu tentei definir duas variaveis, uma com a mensagem e outra com o nick que ia ser mandado, ficou assim o resultado:

MensagemNick

Ou seja, parece que ele concatenou tudo. A minha dúvida era saber como mandar esses dados separados, pra eles serem interpretados separadamente porque ai eu ia poder manipular eles mais facilmente. Eu até pensei em um tipo de substring mais fiquei com preguiça de tentar pensando que havia outro jeito mais conveniente. rolleyes.gif

Se puder ajudar vlw ae!! tongue.gif

Link para o comentário
Compartilhar em outros sites

  • 0
Gramalkyn vlw pela ajuda, ve se me ajuda nessa dúvida olha:

Você postou um link ai que tinha um tuto de como usar Sockets, dae eu fui seguindo o tuto e consegui até fazer bem. Na verdade ficou ótimo. Mais ai tipu quando o Servidro enviava uma mensagem aparecia no cliente assim:

Servidor: Mensagem

E quando o Cliente mandava uma mensagem pro servidor, aparecia no servidor:

Cliente: Mensagem

Claro que isso foi padronizado nos códigos mais eu queria fazer com que o 'nick' (no caso "Servidor:" ou "Cliente:") pudesse ser estipulado e mandado junto com a mensagem.

Mais quando eu tentei definir duas variaveis, uma com a mensagem e outra com o nick que ia ser mandado, ficou assim o resultado:

MensagemNick

Ou seja, parece que ele concatenou tudo. A minha dúvida era saber como mandar esses dados separados, pra eles serem interpretados separadamente porque ai eu ia poder manipular eles mais facilmente. Eu até pensei em um tipo de substring mais fiquei com preguiça de tentar pensando que havia outro jeito mais conveniente. rolleyes.gif

Se puder ajudar vlw ae!! tongue.gif

Sim, você poderia mandá-los juntos e separar os dados na hora. Esse outro tutorial ensina como enviar dados que tem significação para nós:

http://www.desenvolvedores.net/modules.php...=article&sid=26

Dê uma lida nele e veja se você tem uma idéia do que é necessário.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Umm to entendendo, oh eu usei o a função Mid pra separar os pedaços da string. Olha o que aconteceu.

Primeiro eu mandei tudo junto e ficou Assim:

MensagemNick4

Onde:

Mensagem -> Mensagem enviada

Nick -> Nick escolhido

4 -> Comprimento (Len) da variavel Nick

Eu usei esse 4 pra ter referencia na hora de separar as strings.

Ai lá nas strings do outro código:

Supondo que o nick pode ter no máximo 9 caracteres (por enquanto):

tamanhonick = Mid(dados, Len(dados), Len(dados))

nick = Mid(dados, Len(dados) - tamanhonick, Len(dados) - tamanhonick - 1)

message = Mid(dados, 1, Len(dados) - tamanhonick - 1)

Lembrando que: tamanhonick -> Comprimento da variavel nick (4)

Ai aconteceu o seguinte:

A primeira linha da variavel tamanhonick funcinou perfeitamente, ele retornou 4 como valor (supondo que o nick é igual a 'Nick')

A segunda linha e a terceira linha parecem não ter funcionado direito. No começo tinha funcionado mais depois quando eu alterei o comprimento da variavel de Nick ele ficou pegando o 4 junto. Eu passei uns 30 minutos fazendo testes mais não consegui desvendar o erro. Você pode me ajudar a descobrir o que eu fiz de errado?

Vlw ae!

Link para o comentário
Compartilhar em outros sites

  • 0

Aqui está o certo:

'dados = "MensagemNick4"
dados = "MensagemOutro5"

tamanhonick = Mid(dados, Len(dados), Len(dados))
nick = Mid(dados, Len(dados) - tamanhonick, tamanhonick)
message = Mid(dados, 1, Len(dados) - tamanhonick - 1)

Debug.Print tamanhonick
Debug.Print nick
Debug.Print message
Você precisava do tamanho do nick, mas não o estava utilizando para informar o tamanho que Mid() deveria pegar (na linha [nick = Mid(...]). Sendo que você pode fazer isso de forma mais fácil e prática, sem ter limitação de tamanho e sem ter que informar o mesmo. Exemplo:
separador = Chr(0) & "\*\" & Chr(0)

'dados = "Nick" & separador & "Mensagem"
'dados = "Graymalkin" & separador & "Outra mensagem"
dados = "renatodex" & separador & "E mais outra mensagem"

info = Split(dados, separador)
nick = info(0)
message = info(1)

Debug.Print nick
Debug.Print message

Veja que "separador" contém caracteres que não poderão estar na mensagem ou no nick (ninguém consegue digitar um chr(0) em uma textbox ou qualquer controle do tipo). E a função Split() divide uma string para um vetor.

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Hmm legal, bom ... essa parte então ficou ok!

Agora meu outro problema é a conexão com o Socket.

Então Gramaylkin, eu tava tentando conectar com sockets mais de fato eu não consegui.

Ai eu instalei o PacketX (que alias achei muito interessante) e usei os códigos mais ai me surgiu uma dúvida:

Naquele endereço que você me mandou com as funções e eventos que o componente possui existe o seguinte:

PacketReceived(numerofbytes As Long) - This events is raised when the activex dll has a packet ready. Use GetRawPacketData method to get the bytes of the packet.

Ai tipo, Ta, ele vai receber o packet...mais de onde? Tipo, como o VB vai saber que eu quero receber exclusivamente as informações que vem da tela de login do jogo.

No jogo é o seguinte, tem um campo pra digitar Login, um pra digitar Senha e o botão de Submit. Quando você clica ele tenta conectar com o servidor, mais eu queria que ele conectasse ao meu servidor, e para isso eu precisaria interceder pelas funções desse PacketX (eu acho xD).

Como eu poderia estar procedendo? (pô desculpa estar tomando o seu tempo assim e sendo tão chato, é que essas dúvidas me perturbam mesmo sabe sad.gif)

Vlw ae!

Link para o comentário
Compartilhar em outros sites

  • 0

Hmm legal, bom ... essa parte então ficou ok!

Agora meu outro problema é a conexão com o Socket.

Então Gramaylkin, eu tava tentando conectar com sockets mais de fato eu não consegui.

Talvez realmente não seja possível, se o jogo não estiver esperando por isso.

Ai eu instalei o PacketX (que alias achei muito interessante) e usei os códigos mais ai me surgiu uma dúvida:

Naquele endereço que você me mandou com as funções e eventos que o componente possui existe o seguinte:

PacketReceived(numerofbytes As Long) - This events is raised when the activex dll has a packet ready. Use GetRawPacketData method to get the bytes of the packet.

Ai tipo, Ta, ele vai receber o packet...mais de onde? Tipo, como o VB vai saber que eu quero receber exclusivamente as informações que vem da tela de login do jogo.

Ele não sabe, e nem o PacketX. Veja mais abaixo.

No jogo é o seguinte, tem um campo pra digitar Login, um pra digitar Senha e o botão de Submit. Quando você clica ele tenta conectar com o servidor, mais eu queria que ele conectasse ao meu servidor, e para isso eu precisaria interceder pelas funções desse PacketX (eu acho xD).

Como eu poderia estar procedendo? (pô desculpa estar tomando o seu tempo assim e sendo tão chato, é que essas dúvidas me perturbam mesmo sabe sad.gif)

A idéia do PacketX é interceptar *toda* a comunicação via rede. Por isso é possível fazer um firewall, por exemplo, com ele. Não há como você especificar o que quer, já que quando um pacote é enviado de e para a placa de rede (ou modem) não existe qualquer classificação desse tipo. Os dados são empacotados e enviados para um destino. As informações são quebradas em pedaços (que são justamente os pacotes) por isso você dificilmente verá algo muito consistente. Seria necessário acumular uma certa quantidade de pacotes e juntá-los para ver se dá pra ver algo razoavelmente reconhecível. Particularmente ainda não utilizei o PacketX, mas meus conhecimentos de rede me levam a crer isso. Não estou com tempo atualmente, mas assim que puder vou dar uma olhada nesse PacketX (ele realmente parece interessante).

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Umm..entendo,

Talvez realmente não seja possível, se o jogo não estiver esperando por isso.

Na verdade, esse software que eu estou tentando criar para receber as informações do jogo não é uma tentativa pioneira, digo que já existem diversos softwares parecidos que conseguem fazer a conexão com o servidor, e conseguem inclusive "funcionar" como o server oficial, isso a partir de um projeto OpenSource e legalizado (por se tratar de uma operação idependente).

Dae após determinada maturidade com esses programas eu resolvi junto com alguns colegas tentar desenvolver um software novo, na verdade um 'emulador' e me deparei com esse problema oficial.

Como os outros programas são open source eu também já dei uma olhada no código deles para tentar entender como a rotina de conexão jogo-servidor funciona, porém, o código desses emuladores é em C. Até existe um programado em Delphi mais eu não tenho ele instalado aqui por isso não consegui visualizar xD

Vlw Graymalkin, você me ajudou muito vou ver o que eu posso fazer aqui ^^

smile.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Hummm... entendi melhor agora. Não existe um "protocolo" (oficial ou criado) que descreva como deve ser a comunicação entre o servidor e o cliente? Se existisse algo assim, seria apenas uma questão de implementar o protocolo em uma determinada linguagem.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Hmm vou tentar te explicar. É assim:

O Servidor oficial só exige que você tenha o cliente atualizado, com os itens monstros e coisas do tipo. Para se conectar ao servidor existe um arquivo, chamado sclientinfo.xml (isso falando de ragnarok, que é o meu objetivo)

Então esse arquivo funciona da seguinte maneira, de uma olhada:

<?xml version="1.0" encoding="euc-kr" ?>
<clientinfo>
	<desc>Ragnarok Client Information - Taiwan Version</desc>
	<servicetype>korea</servicetype>
	<servertype>sakray</servertype>
	<connection>
  <display>Nome do Servidor</display>
  <desc>Descrição do Servidor</desc>
  <address>IP DO COMPUTADOR (no caso o server que hosteia)</address>
  <port>6900</port>
  <version>18</version>
  <langtype>1</langtype>
  <registrationweb>Site do Servidor</registrationweb>
	</connection>
</clientinfo>
Então, esse ai é o estilão do sclientinfo do ragnarok. Ele faz a conexão do Ragnarok com o Emulador (qualquer que seja, existem varios no mercado, como eAthena, omniAthena, jAthena, Freya, Vidar, Fusion...). Para isso você só precisa dizer qual é o ip do servidor e a porta pela qual o jogo vai conectar. Dai com esse arquivo configurado e no seu devido lugar, ao se executar o jogo, digitar o login e a senha, o jogo vai tentar se conectar as informações do sclientinfo dessa maneira: IP:Porta Eu queria fazer o projeto do visual basic funcionar em sintonia com o ragnarok, fazendo com que, ao ser clicado o botão de logar (supondo que exista um ip e uma porta x configurada). Ele demonstrasse no projeto do visual basic qual login e qual senha foi utilizada para logar. Consegui explicar melhor? xD Eu não sou um bom professor kkkkkk Então, resumindo tudo, essa primeira parte do projeto é que ta complicada porque a gente não consegue conectar..=( Bom, eu dei uma olhada no emulador que o eAthena criou, mais é em C. PEguei uma versão simplificada mais eu entendo visual basic 1000 vezes melhor que C ehhehehe então ficou embaçado pra mim ^^. Da uma olhada nesse código (ou função sei la kkkkk):
#define AUTH_FIFO_SIZE 256
struct {
  int account_id,login_id1,login_id2;
  int sex,delflag;
} auth_fifo[AUTH_FIFO_SIZE];
int auth_fifo_pos=0;

struct {
	int account_id,sex;
	char userid[24],pass[24],lastlogin[24];
	int logincount;
	int state;
	int account_reg2_num;
	struct global_reg account_reg2[ACCOUNT_REG2_NUM];
} *auth_dat;

int auth_num=0,auth_max=0;

char admin_pass[64]="";
char gm_pass[64]="";
const int gm_start=704554,gm_last=704583;


static struct dbt *gm_account_db;

int login_log(char *fmt,...)
{
	FILE *logfp;
	va_list ap;
	va_start(ap,fmt);

	logfp=fopen(login_log_filename,"a");
	if(logfp){
  vfprintf(logfp,fmt,ap);
  fclose(logfp);
	}

	va_end(ap);
	return 0;
}

Então, é assim que o emulador de ragnarok feito em C funciona para conectar.

Sei lá se você entende C mais você deve saber um pouco xD

Eu analisei analisei analisei e cai num tão de FIFO FOFO sei la, não entendi bulufas do código (quer dizer, eu não a parte principal, a que conecta!)

Vlw ae ^^

XD

Link para o comentário
Compartilhar em outros sites

  • 0

Entendi, mas realmente esse código aí em C não ajuda muito... sad.gif. De qualquer forma, acho que um "protocolo" oficial do jogo seria a melhor e mais correta maneira de se fazer isso. Esses outros programas semelhantes que você cita devem ter tido alguma fonte de informação sobre como é a transmissão e recepção (a "conversa") entre o cliente e o servidor, não acha?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, como você flaou sobre os protocolos eu fiquei intrigado e resolvi da uma pesquisada melhor. Dai uma das minhas fontes me falou sobre um arquivo que existe num outro emulador feito em C. De acordo com ele esse arquivo foi um 'modelo' para a programação e ajudou os programadores quando enviar ou usar tal packet.

Esse arquivo que eu to falando tem um monte de packets naquele modelito 0123x4

Da uma olhada se você puder por favor xD

Link: Lista Packets

[Ta em .txt]

Então, será que essa lista de packets ajuda em alguma coisa? Existe algum código pra trabalhar com esses números de packets? Eu acredito que esse seja aquele protocolo que você me disse xD

Vlw Graymalkin tamo quase chegando lá smile.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Isso, é disso que eu estava falando. Só olhei o primeiro pacote que deve ser enviado...

S 0064 <version>.l <account name>.24B <password>.24B <version2>.B

... mas seguindo aquela legenda que tem lá, deu pra chegar a isso aqui:

S = significa que isso vai ser enviado pelo cliente

0064 = acredito que seja o identificador da mensagem, devendo ser enviado os bytes correspondentes a 0x00 e 0x64.

<version>.l = 4 bytes para descrever a versão

<account name>.24B = 24 bytes para definir o nome da conta

<password>.24B = 24 bytes para definir a senha

<version2>.B = 1 byte para definir a segunda versão (talvez outro pedaço da versão)

Entendeu? wink.gif Acho que a partir daquele documento você vai poder fazer o que quer.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...