busca o caminho da variavel deambiente TEMP atraves da GetEnvironmentVariableA, comopodemos ver no codigo abaixo.A stringTEMP esta criptografada mas logo abaixo ha a funcao dedescriptografia, com o debugger foi facil obter o retorno. Esse tipode criptografia de strings ja e bemconhecido do blog.E depoisela obtem o caminho do executavel com o uso da GetCommandLineW.Feito isso ela compara os dois caminhos e retorna:0 seforem diferentes1 seforem iguaisApos achamada da funcao FilePathInfo ha o teste do retorno noMain Code:callFilePathInfotest al,aljnz shortContinueJump ifNot Zero (jnz), se forem iguais pule para o bloco de codigo quedenominei Continue. Em outras palavras, testou se o malwareesta sendo executado dentro do diretorio TEMP. Como nao esta, vaiexecutar o bloco de codigo logo abaixo, apontado pela seta vermelha.Uso deMutexA proximainstrucao e a chamada para a funcao TestMutex (nomeadapor mim). Aqui teremos os uso do mutex. Mutex e um objeto criado nokernel do Windows, esse objeto pode-se entender como uma string. Essastring e utilizada por um programa (processo) para sinalizar a outro(programa) alguma coisa.Sabemosque cada processo em user-mode tem seu espaco de memoria reservadoe isolado dos demais, justamente para evitar que um interfira nooutro. Criar o mutex no kernel permite que todos os processos tenhamacesso a ele. Essatecnica e muito utilizada por malwares para garantir que somenteuma instancia do processo esteja em execucao, para evitar erros deexecucao por exemplo. O processo antes de executar completamentesempre verifica se o mutex ja existe e se existir finaliza oprocesso, sinal que ja ha outra instancia do malware em execucao.Isso eexatamente o que nosso artefato faz, dentro da funcao TestMutexha o trecho de codigo abaixo.Ha o usode outra string criptografada que em texto simples significa"SFIheg72". Esse sera o nome do mutex. Depois ha achamada a funcao CreateMutex da API do Windows. Seconsultarmos na MSDN o que essa funcao faz, diz o seguinte:Createsor opens a named or unnamed mutex object.Entao epassado o nome do mutex para a funcao, se o mutex "SFIheg72"nao existir e criado um mutex com esse nome, caso contrario eaberto o mutex ja existente.Como oprograma sabe se foi criado um novo ou se ja existia? Buscando ocodigo de erro gerado pela funcao atraves da GetLastError.Ha uma tabela padrao no Windows com todosos codigos de erros. Nessa tabela ha: Codigo Constante Descricao 0 (0x0) ERROR_SUCCESS A operacao foi realizada com sucesso. 183 (0xB7) ERROR_ALREADY_EXISTS Nao e possivel criar o arquivo quando ele ja existe. No codigovemos que e feita uma comparacao com o valor 0xB7, isso paradescobrir se o mutex ja existe ou nao. Baseado nessa comparacao,a funcao TestMutex ira retornar:0 se omutex nao existir (e criara o mutex)1 se omutex existir (e retornara um handle para o mutex)Note queapos a chamada da funcao no Main Code, e feita uma comparacaocom o retorno no registrador AL. Jump if Zero (jz) Continue. Ese o valor nao for zero, ou seja, o mutex ja existe, o que querdizer que outra instancia do malware ja esta sendo executada.Nesse caso e chamada uma funcao que finaliza o processo comExitProcess.Prosseguindocom a execucao, agora no bloco Continue, ha novamente achamada para a funcao TestMutex. Dessa vez ela retornara 1pois o