Oficina
Gerenciador Remoto
Dom 28 Mai 2006 09:01 |
- Detalhes
- Categoria: Ferramentas de Rede
- Atualização: Domingo, 14 Junho 2009 17:20
- Autor: T.J.Nogueira
- Acessos: 17213
1.0 O que é o Gerenciador Remoto?
O Gerenciador Remoto é um aplicativo cliente/servidor que permite a um usuário controlar uma máquina na sua rede, seja ela local ou remota. Mas como assim cliente/servidor? Bem, entendemos por servidor a parte do programa que deve ser executada na máquina que se deseja manipular a partir de outro computador. A outra parte da aplicação, o lado cliente, deve ser executado na máquina que irá manipular a que estiver com o lado servidor em execução. E qual o fundamento disto? Simples. Com um aplicativo deste nível, o usuário pode ter total controle em uma máquina como, por exemplo, desligar o monitor da máquina, executar programas, criar pastas e arquivos, desligar o computador, etc. Um programa deste nível é o NetBus, um programa razoavelmente antigo e muito utilizado por crackers para efetuar invasões em sistemas alheios. É claro que o nosso gerenciador remoto será muito mais simples que o famoso NetBus, mas vale lembrar que a construção é praticamente a mesma.
Como estamos criando este aplicativo com intuitos totalmente educacionais, o nosso humilde gerenciador remoto contará apenas com funções muito simples, apenas para se demonstrar a funcionalidade do projeto.
1.1 Como ele funciona?
O funcionamento do Gerenciador Remoto é muito simples. Por uma lado, o módulo servidor será ativado no computador que se deseja manipular. Uma vez ativado, o módulo servidor ficará escutando e esperando comandos em uma porta TCP. Quando um comando chegar por esta porta para o módulo servidor, ele o verificará e, dependendo do comando, o executará. Do outro lado, o módulo cliente apenas terá a função de se conectar com o lado servidor e enviar os comandos desejados para que o servidor os execute.
1.2 Um Gerenciador Remoto no Delphi
O desenvolvimento de um Gerenciador Remoto no Delphi é fácil, prático e muito interessante de se fazer. Digo interessante, pois quando você entender como é feito, não irá ter problema nenhum em adicionar inúmeras funcionalidades nele, assim como implementá-lo para outras versões do Windows, tornando assim o seu desenvolvimento muito legal pois é bastante motivador saber que é plenamente possível melhorá-lo e desenvolve-lo por conta própria.
No Gerenciador Remoto teremos dois trabalhos: o primeiro é codificar o módulo servidor, que é o responsável por nos permitir controlar o computador de uma máquina remota. O segundo trabalho é a codificação do módulo cliente, que manterá uma comunicação com o módulo servidor, assim como também enviar os comandos a serem executados.
Para a criação do módulo servidor utilizaremos um componente do Delphi chamado ServerSocket que fica localizado na paleta Internet. Este componente é responsável por permitir ao Delphi a criação de servidores para o protocolo TCP. No caso do módulo servidor, utilizaremos o componente ClientSocket, também localizado na paleta Internet. Este é o componente responsável por se conectar com o ServerSocket do módulo servidor.
1.3 As funções do servidor
Funções do Gerenciador |
---|
Abrir o Internet Explorer |
Abrir a Proteção de Tela |
Abrir o MSN Messenger |
Encerrar o Servidor |
Como já disse antes, a construção do Gerenciador Remoto é simples, mas isto depende da quantidade de funções que ele irá permitir ao usuário remoto executar. No caso do nosso programa, como tem efeito totalmente educacional e visa simplesmente mostrar a idéia de como ele é feito, iremos limitar o número de funções para as que seguem na tabela ao lado:
Com estas funções ao lado, você já irá poder ter uma ótima noção de como a criação do gerenciador funciona e poderá progredir na criaçãoo de um utilitário muito mais completo e grandioso.
1.4 Construindo o módulo Servidor e a sua codificação
Componente | Propriedade | Conteúdo |
---|---|---|
TButton | Caption | Ativar |
TLabel | Caption | Status do Servidor |
TLabel | Caption | ? |
Abra o Delphi e inicie um novo projeto. Salve o mesmo como serv.dpr e a sua unit como u_serv.pas. No formulário que abrir, altere a propriedade caption do Form1 para "Módulo Servidor". Depois, insira o componente ServerSocket, que fica localizado na paleta Internet. Insira também um Tbutton e dois Tlabel. Altere a propriedade destes itens para as que seguem na tabela:
Após estes passos, seu formulário deverá se apresentar desta forma:
Agora vamos adicionar a sua codificação. Dê um duplo clique no botão Ativar. Feito isto, digite o seguinte código responsável por todo o funcionamento:
ServerSocket1.port:=31300; ServerSocket1.Active:=true;
Agora, selecione o componente ServerSocket e, no Object Inspector, selecione a sua propriedade OnListen, na paleta Events. Neste evento, insira o código:
Label2.caption:= 'Ativado!';Feito isto, ainda selecionando o componente ServerSocket, vá no Object Inspector, selecione a propriedade OnClientRead e insira o seguinte código:
var texto: string; begin label2.Caption:='Servidor em uso.'; texto:=socket.ReceiveText; if texto='PROTECAO' then begin SendMessage(Application.Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0); end; if texto='NAVEGAR' then begin WinExec('c:\Arquivos de Programas\Internet Explorer\iexplore.exe', SW_SHOW); end; if texto='MSN' then begin WinExec('c:\Arquivos de Programas\MSN Messenger\msnmsgr.exe', SW_SHOW); end; if texto='QUIT' then begin ServerSocket1.Active:=false; form1.close; end; end;
Pronto pessoal! Vocês devem estar se perguntando: Ué! Só isso? Sim! O nosso módulo servidor já está pronto para ser usado. Mais pra frente neste capítulo, nós iremos analisar o código deste módulo para que todos entendam sua programação. Vamos agora construir o módulo Cliente.
1.5 Construindo o módulo Cliente e a sua codificação
Quantidade | Componente |
---|---|
4 | TLabel |
1 | TEdit |
1 | TComboBox |
2 | TButton |
O módulo Cliente consiste em um programa que envia para o módulo Servidor os comandos que o usuário deseja executar na máquina remota. Sem dúvida, é mais fácil desenvolver o módulo cliente do que o servidor, mesmo tendo o módulo cliente um pouco mais de componentes. E isto é o que veremos agora.
Inicie um novo projeto no Delphi. Salve a unit como u_cliente.pas e o projeto como cliente.dpr. No formulário que se iniciar, altere a propriedade Caption para "Módulo Cliente". Insira um componente ClienteSocket, localizado na paleta Internet. Insira também os seguintes componentes listados na tabela ao lado:
Agora, vamos alterar algumas propriedades destes componentes adicionados ao nosso formulário.
Componente | Propriedade | Conteúdo |
---|---|---|
Label1 | Caption | IP do Servidor: |
Label2 | Caption | Comando a Enviar: |
Label3 | Caption | Status: |
Label4 | Caption | ? |
Edit1 | Text | |
Button1 | Caption | CONECTAR |
Button2 | Caption | ENVIAR! |
Vamos agora alterar duas propriedades do componente ComboBox1, separadamente, para que você não se perca no decorrer da construção. Altere conforme a tabela da direita:
Componente | Propriedade | Conteúdo |
---|---|---|
ComboBox1 | Text | Escolha o Comando!!! |
ComboBox1 | Items | PROTECAO NAVEGAR MSN QUIT |
Após estas alterações, arrume os componentes no formulário para que fique parecido com o que segue abaixo:
Beleza! Agora vamos inserir o código no nosso programa Cliente. Dê um duplo clique no nosso botão CONECTAR e insira o código abaixo:
ClientSocket1.Host:=edit1.text; ClientSocket1.Port:=31300; ClientSocket1.Active:=True;
Agora selecione o componente ClientSocket e no Object Inspector, na paleta Events, escolha a ação OnConnect e insira o código que segue:
Label4.Caption:= ' Conectado ao Servidor ';
Continuando, dê agora um duplo clique no botão ENVIAR! e insira o código:
ClientSocket1.Socket.SendText(ComboBox1.Text); Label4.Caption:='Comando Enviado.';
Prontinho. Já está terminado! Claro que não é uma super aplicação comercial que envolveu uma equipe de 13 programadores e um investimento de R$260.000,00 de uma multinacional, mas é o nosso simples programa Cliente que serve totalmente para o aprendizado sobre a construção do nosso Gerenciador Remoto. E por falar em aprender, chegou a tão esperada hora de entender o código.
2.0 Entendendo o Código
2.1 Servidor
Bom, como o primeiro módulo que criamos foi o Servidor, nada mais justo do que começar por ele, não é? Então vamos lá. O primeiro ponto que codificamos no nosso módulo Servidor foi o botão Ativar.
O código para este botão é:
ServerSocket1.port:=31300; ServerSocket1.Active:=true;
No código acima definimos o valor da porta a ser usada pelo ServerSocket para 31300 e, logo depois, mudamos o estado do ServerSocket para Ativo, como mostra a linha ServerSocket1.Active:=true;
O segundo ponto que codificamos no nosso Servidor foi a propriedade OnListen do ServerSocket. O código responsável é:
Label2.caption:= 'Ativado!';
O código acima inserido na propriedade OnListen do nosso ServerSocket faz com que, quando um usuário se conecte com a porta 31300 ativa do nosso módulo Servidor, a Label2 tenha sua propriedade Caption alterada para Ativado.
Agora veremos a parte mais interessante do nosso código, que é a parte referente ao evento OnClientRead do nosso módulo Servidor. O código é:
var texto: string; begin label2.Caption:='Servidor em uso.'; texto:=socket.ReceiveText; if texto='PROTECAO' then begin SendMessage(Application.Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0); end; if texto='NAVEGAR' then begin WinExec('c:\Arquivos de Programas\Internet Explorer\iexplore.exe', SW_SHOW); end; if texto='MSN' then begin WinExec('c:\Arquivos de Programas\MSN Messenger\msnmsgr.exe', SW_SHOW); end; if texto='QUIT' then begin ServerSocket1.Active:=false; form1.close; end; end;
Na parte
var texto: string;
iniciamos a variável texto que irá conter o comando repassado pelo módulo Cliente a ser executado pelo módulo Servidor. Em seguida temos:
label2.Caption:='Servidor em uso.'; texto:=socket.ReceiveText;
onde em label2.caption:='Servidor em uso'; definimos para a label2 a sua propriedade caption como 'Servidor em uso'. Depois repassamos o texto recebido do modulo Cliente em Socket.ReceiveText para a nossa variável texto.
A seguir, temos o bloco de código responsável pela execução dos comandos:
if texto='PROTECAO' then begin SendMessage(Application.Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0); end; if texto='NAVEGAR' then begin WinExec('c:\Arquivos de Programas\Internet Explorer\iexplore.exe', SW_SHOW); end; if texto='MSN' then begin WinExec('c:\Arquivos de Programas\MSN Messenger\msnmsgr.exe', SW_SHOW); end; if texto='QUIT' then begin ServerSocket1.Active:=false; form1.close; end;
No trecho
if texto='PROTECAO' then begin SendMessage(Application.Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0); end;
fazemos na linha que contém
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
Após este bloco de código acima, temos o que segue:
if texto='NAVEGAR' then begin WinExec('c:\Arquivos de Programas\Internet Explorer\iexplore.exe', SW_SHOW); end;
Aqui fazemos novamente a comparação da variável texto com uma palavra, que desta vez é NAVEGAR. Caso o que se tenha na variável texto seja igual à palavra comparada, então é executado o Internet Explorer na máquina do módulo Servidor. O código responsável por essa execução é:
WinExec('c:\Arquivos de Programas\Internet Explorer\iexplore.exe', SW_SHOW);
Por padrão, o caminho c:\Arquivos de Programas\Internet Explorer\ é o que contém o executável do Internet Explorer, mas isto poderá mudar e cabe a você na hora de programar o seu módulo Servidor checar se é realmente este o caminho na máquina em que o servidor será executado.
Prosseguindo com o código temos:
if texto='MSN' then begin WinExec('c:\Arquivos de Programas\MSN Messenger\msnmsgr.exe', SW_SHOW); end;
Mais uma vez comparamos o conteúdo da variável texto com outra palavra e, caso seja positivo, executamos uma ação. No caso, esta palavra é MSN e se for esta a palavra repassada, executaremos o MSN, o programinha de bate-papo mais famoso do mundo da nossa amiga Microsoft. O código para execução do MSN é:
WinExec('c:\Arquivos de Programas\MSN Messenger\msnmsgr.exe', SW_SHOW);
Mais uma vez vale lembrar que é possível que o caminho correto do MSN não seja este em todas as máquinas, cabendo novamente a você verificar o caminho correto na hora de construir o seu módulo Servidor.
Por fim, no código do nosso módulo Servidor temos o seguinte:
if texto='QUIT' then begin ServerSocket1.Active:=false; form1.close; end;
Novamente comparamos a variável texto com outra palavra, que no caso é QUIT. Se a comparação for positiva, executaremos uma ação, que no caso é a finalização da execução do módulo servidor cujo código responsável por isto é:
ServerSocket1.Active:=false;
Em outras palavras, desativamos o nosso ServerSocket. E para finalizar, fechamos o Módulo Servidor de uma vez com o comando:
form1.close;
E pronto! Agora você já sabe por que o módulo Servidor é capaz de funcionar. Vamos agora para o módulo Cliente!
2.2 Cliente
É fato que a codificação do nosso módulo Cliente é bem mais tranqüila do que a do módulo Servidor. Iremos começar a entender a codificação do módulo Cliente a partir da nosso botão CONECTAR.
O código do nosso botão CONECTAR é:
ClientSocket1.Host:=edit1.text; ClientSocket1.Port:=31300; ClientSocket1.Active:=True;
onde em
ClientSocket1.Host:=edit1.text;
definimos para a propriedade Host do nosso ClientSocket o endereço repassado pelo usuário no Edit1.text.
Em seguida temos:
ClientSocket1.Port:=31300;
Aqui repassamos para a propriedade Port do nosso ClientSocket o valor 31300, que será a porta pela qual nos conectaremos com o módulo Servidor.
E finalizando temos
ClientSocket1.Active:=True;
ou seja, o código responsável por ativar a conexão do módulo Cliente com o módulo Servidor. O código acima faz com que o nosso ClientSocket tente se conectar com o endereço definido na propriedade Host utilizando a porta definida na propriedade Port do ClientSocket.
Em seguida temos o código referente ao evento OnConnect do nosso ClientSocket. O código é:
Label4.Caption:= ' Conectado ao Servidor ';
O código consiste em alterar a propriedade Caption do label4 para ' Conectado ao Servidor '. Em outras palavras, caso o módulo Cliente se conecte com o Servidor, será mostrada na interface do módulo Cliente a mensagem Conectado ao Servidor para que o usuário saiba do sucesso da conexão.
E por fim, o código mais importante do nosso módulo Cliente, que é o do botão ENVIAR!. Este é o código responsável por enviar o comando desejado para ser executado pelo módulo Servidor.
O código do botão ENVIAR! é:
ClientSocket1.Socket.SendText(ComboBox1.Text); Label4.Caption:='Comando Enviado.';
Nele temos a linha:
ClientSocket1.Socket.SendText(ComboBox1.Text);
Nesta linha enviamos o texto escolhido no nosso ComboBox1 para o Host definido nas propriedades do nosso ClientSocket. No caso em questão, o Host será o do módulo Servidor, pois é para ele que queremos enviar o comando. A parte do comando .SendText(ComboBox1.Text); é a designada e responsável pelo envio do texto para o módulo Servidor, ou para qualquer outro lugar, dependendo do que se queira fazer, mas isto não vem ao caso agora né!
E finalizando, temos:
Label4.Caption:='Comando Enviado.';
Esta linha simplesmente altera a propriedade Caption do Label4 para 'Comando Enviado', alertando o usuário e mostrando que o texto já foi enviado. Com isto, finalizamos o nosso projeto.
Concluindo
Pronto, pessoal, este é o código do nosso humilde Gerenciador Remoto totalmente funcional em relação ao que ele se propõe a fazer, o que no caso é simplesmente explicar como funciona a execução e manipulação remota. Agora cabe a você incrementá-lo e adicionar funções que você ache interessantes, melhorar a sua interface e tudo mais que você quiser! No nosso livro temos um capítulo com uma série de funções bem legais e interessantes que você poderá utilizar na implementação do seu Gerenciador Remoto. Vale a pena tentar!