Executáveis personalizados

Started by Dark_Side, 25 de November , 2006, 12:44:14 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dark_Side

Hi,

Há algum tempo, alguém havia me perguntado sobre como alguns programas maliciosos, como trojans e keyloggers, por exemplo, procediam para gerar executáveis aleatórios, de acordo com informações fornecidas pelo usuário. Um exemplo seria um keylogger onde temos a configuração do email para onde os logs seriam enviados, gerando um executável próprio. Cheguei a pensar que, talvez, estes programas contassem com compiladores inclusos. No entanto, achei que uma maneira mais fácil seria escrever estas tais informações dentro do próprio programa e acessá-las assim que o programa é carregado na memória.

Veja o esquema:

Quote[ARQUIVO.EXE]

{ código do arquivo }
{ informações personalizadas }

Dentro do código do ARQUIVO.EXE, iríamos incluir um trecho responsável por obter essas informações personalizadas. O problema maior não é esse, mas sim como saber onde as informações estão localizadas. Podemos estabelecer uma marca dentro do código antes de inserir tais dados. Vamos ver um exemplo em que o programa obtém um nome, escreve-o no arquivo fazendo com que este, ao ser executado, mostre-o.

» Crie um projeto EXE padrão;
» Inclua um TextBox chamado "nome" no form principal;
» Inclua um CommandButton chamado "gerar_exe".

Vamos ao código:

Private Sub Form_Initialize()
Dim buffer As String
Dim i As Long
Dim nome_msg As String

Open App.EXEName + ".exe" For Binary As 1
buffer = Input(LOF(1), #1)
Close 1

i = InStr(1, buffer, "***")
If i > 0 Then
nome_msg = Mid(buffer, i + 3)
MsgBox "Seu nome é: " + nome_msg
End
End If

End Sub

Private Sub gerar_exe_Click()
FileCopy App.EXEName + ".exe", "TESTE.EXE"
Open "TESTE.EXE" For Binary As 1
Seek #1, LOF(1)
Put #1, , "***"
Put #1, , nome.Text
Close 1
End Sub

Entendo  o código:

Private Sub Form_Initialize()

No Sub Initialize(), as funções são executadas na criação da instância do programa, antes do formulário ser criado.

Dim buffer As String
Dim nome_msg As String
Dim i As Long

Declaramos as variáveis:

buffer: string que irá armazenar o conteúdo do próprio executável;
nome_msg: seria o nome digitado pelo usuário, incluso no código do programa;
i: variável que irá verificar se a marca "***" existe dentro do conteúdo do arquivo.


Vamos ver o seguinte trecho:

Open App.EXEName + ".exe" For Binary As 1
buffer = Input(LOF(1), #1)
Close 1 ' Fecha o arquivo

O programa tenta abrir seu próprio executável com acesso binário.
Quando utilizamos "APP.EXEName" o programa nos retorna o nome do executável, entretanto, não retorna a extensão ".exe", por isso, a adicionamos manualmente.

Todo o conteúdo do arquivo é lido através da linha:

buffer = Input(LOF(1), #1)

A linha abaixo é responsável por verificar se código do executável possui a marca "***" o que indica que dados personalizados forão inseridos nele.

i = InStr(1, buffer, "***") ' Verificamos a posição de "***" no código do arquivo
If i > 0 Then ' Se for ZERO, não existe esta marca, do contrário, armazena-a em "i"
nome_msg = Mid(buffer, i + 3) ' Obtém os dados que constam após 3 caracteres após "***"
MsgBox "Seu nome é: " + nome_msg ' Mostra estes dados
End ' Finaliza o programa
End If

Note que se o programa encontrar os dados personalizados, após executar determinadas instruções, ele é finalizado. Com essa atitude, o formulário não seria mostrado =).

Contudo, se a marca não for encontrada, o programa exibe o formulário com a opção de gerar o executável com o nome digitado.

Observe o trecho responsável por gerar o EXE:

Private Sub gerar_exe_Click()
FileCopy App.EXEName + ".exe", "TESTE.EXE"
Open "TESTE.EXE" For Binary As 1
Seek #1, LOF(1) ' Muda a posição de leitura/escrita para o fim
Put #1, , "***" ' Insere a marca
Put #1, , nome.Text ' Insere o que foi digitado no textbox
Close 1 ' Fecha o arquivo
End Sub

Copiamos o próprio executável para "TESTE.EXE" através da linha abaixo:

FileCopy App.EXEName + ".exe", "TESTE.EXE"
A cópia do arquivo é aberta, a posição read/write é alterada para o fim do código do arquivo, a marca é inserida e, finalmente, escrevemos o nome digitado.

Execute o arquivo "TESTE.EXE" para ver os resultados =)

Basicamente seria isso. Ciente da lógica, podemos adaptar e utilizar a técnica de acordo com nossa intenção =)

Segue o código do projeto:

http://three.fsphost.com/darkside/exemplo_exe.rar

Bye.