<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Hack'n Roll Blog &#187; Malwares</title>
	<atom:link href="http://blog.hacknroll.com/category/seguranca/analise-de-binario/malwares/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.hacknroll.com</link>
	<description>Hacking as life style!</description>
	<lastBuildDate>Sun, 25 Sep 2011 03:38:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Análise do Virus TR/ATRAPS.Gen – Parte 1</title>
		<link>http://blog.hacknroll.com/2009/04/12/analise-do-virus-tratrapsgen-parte-1/</link>
		<comments>http://blog.hacknroll.com/2009/04/12/analise-do-virus-tratrapsgen-parte-1/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 22:27:06 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Análise de Binário]]></category>
		<category><![CDATA[Malwares]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=169</guid>
		<description><![CDATA[Hoje cheguei em casa umas 12h e notei que tinha uma mensagem no MSN com o seguinte: Esta foto te miras padre! http://img456.myspace-imagen.info/img456/my.php?id=MVC-IMAGEN41.jpeg Então pensei: Ou a minha tia está aprendendo espanhol e esta querendo praticar comigo, ou ela esta com um vírus de MSN. Para tirar minhas dúvidas cliquei no link e, como de [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje cheguei em casa umas 12h e notei que tinha uma mensagem no MSN com o seguinte:</p>
<blockquote><p>Esta foto te miras padre!</p>
<p>http://img456.myspace-imagen.info/img456/my.php?id=MVC-IMAGEN41.jpeg</p></blockquote>
<p>Então pensei: Ou a minha tia está aprendendo espanhol e esta querendo praticar comigo, ou ela esta com um vírus de MSN. Para tirar minhas dúvidas cliquei no link e, como de se esperar, o navegador abriu uma janela para eu efetuar download do arquivo MVC-IMAGEN41.jpeg.src. Então o salvei e comecei a fazer a análise dele.</p>
<p>Ao submeter para o VirusTotal, notei que dos 37 anti-virus com base de assinaturas registradas, somente 4 o detectaria como vírus. Para maiores detalhes da submissão do vírus acesse <a href="http://www.virustotal.com/pt/analisis/8d997936bda52f125e4f961dfd6c12b2">VirusTotal</a></p>
<p>Abri no PEiD para ver o que ele me falava do arquivo, e obtive a seguinte resposta:</p>
<p><img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura01.jpg" alt="figura01" width="422" height="243" class="aligncenter size-full wp-image-170" /></p>
<p>Pelo PEiD foi possível notar que não existe nenhum tipo de compactação nem criptografia das sessões do binário. Então bastamos abrir o binário para uma análise direta.</p>
<p>Abri o binário no OllyDbg e logo no inicio vemos a seguinte chamada:<br />
<img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura02.jpg" alt="figura02" width="692" height="463" class="aligncenter size-full wp-image-172" /></p>
<p>Inicialmente ele aloca memória na pilha e em seguida move uma constante para o registrador EAX e efetua uma chamada. Ao analisarmos a chamada temos o seguinte:</p>
<p><img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura03.jpg" alt="figura03" width="642" height="210" class="aligncenter size-full wp-image-175" /></p>
<p>Nesta chamada é salvo o parâmetro que está em EAX no registrador EBX em seguida move-se o valor 0 (zero) para a posição [44064] que representa o TLS (Thread-Local Storage) do processo, utilizada para criar um mecanismo de IPC. Por padrão, às variáveis locais de uma função são únicas para cada thread que execute a função e as variáveis globais e estáticas (static) são compartilhadas por cada processo. Com TLS, utilizando um índice global, é possível prover um dado único para cada thread que o processo pode acessar.</p>
<p>Após zerar o TLS, o processo efetua  uma chamada a API GetModuleHandleA[1] passando 0 (zero) como parâmetro. A API GetModuleHandleA() retorna o handle (ponteiro) para o módulo passado como parâmetro, o módulo no caso seria algum outro processo ou DLL carregado na mesma região de memória do processo atual. Como foi passado como parâmetro o valor 0 (zero) a API retornará o Handle do arquivo que criou o processo atual, no caso o nosso m4ware.</p>
<p>Em seguida o processo salva o  resultado nos endereço DS:[4566C] e DS:[4406C], então para facilitar o trabalho colocamos um label (rótulo) nesses endereços.</p>
<p><img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura04.jpg" alt="figura04" width="606" height="210" class="aligncenter size-full wp-image-180" /></p>
<p>Nesta sub-rotina, vemos um exemplo clássico de anti-debugger. Esse trick consiste é pegar o uptime da máquina em milissegundos (GetTrickCount[2]), em seguida efetuar uma pausa (Sleep) e pegar novamente o numero de milissegundos. Com isto verifica-se se as diferenças foram compatíveis. No exemplo, o malw4re pega o ms da máquina, da uma pause de 501ms e em seguida pega o ms novamente e então verifica se a diferença foi de 501ms. Então a sub-rotina retorna 1 (um) em EAX caso ocorra a diferença (debug detectado) ou 0 (zero) caso não tenha detectado. Após a verificação, o malw4are altera seu fluxo caso tenha sido detectado o debug, executando o salto condicional (endereço 00043616).</p>
<p>Não tenho detectado o debuger, o malw4are prossegue normalmente e em seguida executa a seguinte rotina passando o valor 6F (111 dec.) no registrador EAX:</p>
<p><img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura05.jpg" alt="figura05" width="652" height="606" class="aligncenter size-full wp-image-181" /></p>
<p>No inicio temos o prelúdio normal de uma rotina (salva pilha e separa nova pilha). Em seguida temos a alocação de uma região da pilha (variáveis locais). Salva-se o valor de EAX (parâmetro) em EBX e executa um Sleep de 50ms. Após a pausa, o m4lware soma Trick do sistema e com o parâmetro passado e executa um salto incondicional para o meio de loop (endereço 000434D4). O loop executa diversas leituras de mensagens do sistemas. A estrutura de resposta da mensagem fica armazenada na pilha no endereço SS:[EBP-1C], então o processo verifica pela mensagem de ID 12h para então sair[3].</p>
<p>Ao sair desta rotina, o m4lware passa para a seguinte rotina:</p>
<p><img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura06.jpg" alt="figura06" width="641" height="661" class="aligncenter size-full wp-image-182" /></p>
<p>Inicialmente temos o prelúdio com a alocação e inicialização (com zeros) das variáveis locais da sub-rotina. É possível notar diversas chamadas a API LoadLibraryA[4], que é responsável por carregar uma determinada biblioteca (DLL) dinamicamente, ou seja, sem estar no IMPORT_TABLE do binário. Porém, antes de cada chamada, temos a chamada a três sub-rotinas do binário. Analisando superficialmente, é possível notar que a primeira rotina carrega uma mensagem codificada, a segunda decodifica a mensagem e a terceira verifica se teve sucesso ou não. Com isto, é possível verificar que as chamadas as APIs LoadLibraryA() importam as bibliotecas kernel32.dll, advapi32.dll e ntdll.dll respectivamente. Em seguira é feito uma chamada a API GetProcAddress, que é responsável por, dado um handle de uma biblioteca (retorno da função LoadLibrary()) e um nome de API, retorna um ponteiro para a rotina da API. A chamada à GetProcAddress() busca e retorna o endereço da própria API GetProcessAddress em Kernel32.dll, armazenando seu retorno em DS:[ESI]. </p>
<p>Após a obtenção do endereço de GetProceAddres em DS:[ESI], a rotina efetua diversas rotinas como as seguintes:</p>
<p><img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura07.jpg" alt="figura07" width="620" height="133" class="aligncenter size-full wp-image-183" /></p>
<p>Com isto, o m4lware carrega as APIs RegCloseKey, RegQueryValueExA, RegOpenKeyA, EnumResourceNamesA, GetModuleHandleA, GetComputerNameA, GetUserNameA, GetFileAttributesA, FreeLibrary, FreeResource, ExitProcess, SizeofResource, LoadResource, LockResource, FindResourceA, SetThreadContext, TerminateProcess, ZwUnmapViewOfSection, VirtualAllocEx, WriteProcessMemory, CreateProcessA, GetThreadContext, ReadProcessMemory, SetThreadContext, ResumeThread e VirtualProtectEx, não necessariamente nesta ordem.</p>
<p>No final, esta rotina libera o handle das biblitecas kernel32.dll, advapi.dll e ntdll.dll carregados no inicio.</p>
<p>Bem, esta foi a primeira parte da análise do m4lware TR/ATRAPS.Gen, até então não encontramos nada de muito complicado nem ameaçador. Nos post futuros continuarei  com a análise e talvez tenha algo de mais interessante.</p>
<p>Referências:<br />
[1] GetModuleHandle Function: <a href="http://msdn.microsoft.com/en-us/library/ms683199(VS.85).aspx">http://msdn.microsoft.com/en-us/library/ms683199(VS.85).aspx</a><br />
[2] Thread-Local Storage: <a href="http://msdn.microsoft.com/en-us/library/ms686749.aspx">http://msdn.microsoft.com/en-us/library/ms686749.aspx</a><br />
[3] MSG Structure: <a href="http://msdn.microsoft.com/en-us/library/ms644958(VS.85).aspx">http://msdn.microsoft.com/en-us/library/ms644958(VS.85).aspx</a><br />
[4] LoadLibrary Function: <a href="http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx">http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2009/04/12/analise-do-virus-tratrapsgen-parte-1/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>

