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 (http://three.fsphost.com/darkside/exemplo_exe.rar)
Bye.