<?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; Análise de Binário</title>
	<atom:link href="http://blog.hacknroll.com/category/seguranca/analise-de-binario/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>
		<item>
		<title>Vacina Tiny.H</title>
		<link>http://blog.hacknroll.com/2009/03/21/vacina-tinyh/</link>
		<comments>http://blog.hacknroll.com/2009/03/21/vacina-tinyh/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 04:20:07 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Análise de Binário]]></category>
		<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=153</guid>
		<description><![CDATA[A arte da engenharia reversa realmente é tão fantastica quanto ampla. Muitas pessoas só conhecem engenharia reversa como o método utilizado para criar cracks, keygens entre outras ferramentas do gênero. Porém, a engenharia reversa é utilizada amplamente para migração de código entre plataformas (geralmente drivers para hardware sem documentação), análise de vulnerabilidades em ferramentas de [...]]]></description>
			<content:encoded><![CDATA[<p>A arte da engenharia reversa realmente é tão fantastica quanto ampla. Muitas pessoas só conhecem engenharia reversa como o método utilizado para criar cracks, keygens entre outras ferramentas do gênero. Porém, a engenharia reversa é utilizada amplamente para migração de código entre  plataformas (geralmente drivers para hardware sem documentação), análise de vulnerabilidades em ferramentas de código fechado e para análise de malwares para criação de vacina.</p>
<p>Das criações de vacinas, pude fazer minha primeira vacina para um virus denominado TINY.H que estava disseminado nos laboratórios da faculdade. Ele se auto-copiava para dispositivos removíveis (pen-drivers), criando dois arquivos executáveis e um autorun, todos com permissões ocultas e de arquivos de sistema. </p>
<p>O problema é que, como o usuário disponível não tinha permissão para nada, não era permitido matar os processos do virus e, consequentemente, apagar os arquivos do pen-drive.</p>
<p>Para solucionar o problema, desenvolvi uma pseudo vacina em VBS que remove os processos e limpa o pen-driver, segue algumas rotinas necessárias. Basicamente foram utilizados dois objetos: o FileSystemObject e o Windows Management Instrumentation (WMI) como segue:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #151B8D; font-weight: bold;">Set</span> objWMIService = <span style="color: #E56717; font-weight: bold;">GetObject</span>(<span style="color: #800000;">&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot;</span> &amp; strComputer &amp; <span style="color: #800000;">&quot;\root\cimv2&quot;</span>)
<span style="color: #151B8D; font-weight: bold;">Set</span> objFSO = <span style="color: #E56717; font-weight: bold;">CreateObject</span>(<span style="color: #800000;">&quot;Scripting.FileSystemObject&quot;</span>)</pre></td></tr></table></div>

<p>Tendo os objetos no escopo global, criei a seguinte rotina que remove as permissões de um dado arquivo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #008000;">'----------------------------------------------------------------------
</span><span style="color: #008000;">' Esta função restaura as permissões dos arquivos de infecção para a
</span><span style="color: #008000;">' NORMAL, pois os mesmo ficam com as permições SYSTEM, HIDDEN e ARCHIVE
</span><span style="color: #008000;">'----------------------------------------------------------------------
</span>Const FILE_ATTRIBUTE_NORMAL   = 128
&nbsp;
<span style="color: #E56717; font-weight: bold;">sub</span> RemovePermicoes(cArquivo)
    Wscript.Echo <span style="color: #800000;">&quot;  &gt; &quot;</span> &amp; cArquivo
    <span style="color: #151B8D; font-weight: bold;">Set</span> ObjFile = objFSO.GetFile(cArquivo)
    objFile.Attributes = FILE_ATTRIBUTE_NORMAL
<span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #E56717; font-weight: bold;">sub</span></pre></td></tr></table></div>

<p>Juntamente com ela, criei a seguinte função responsável pela remoção de um dado arquivo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #008000;">'----------------------------------------------------------------
</span><span style="color: #008000;">' Esta função remove um arquivo ( no caso virótico ) passado como
</span><span style="color: #008000;">' parametro
</span><span style="color: #008000;">'----------------------------------------------------------------
</span><span style="color: #E56717; font-weight: bold;">sub</span> RemoveArquivo(cArquivo)
	objFSO.DeleteFile(cArquivo)
	<span style="color: #8D38C9; font-weight: bold;">if</span> objFSO.FileExists(cArquivo) <span style="color: #8D38C9; font-weight: bold;">then</span>
	    Wscript.Echo <span style="color: #800000;">&quot;  &gt; Arquivo [&quot;</span> &amp; cArquivo &amp; <span style="color: #800000;">&quot;] NÃO removido&quot;</span>
    <span style="color: #8D38C9; font-weight: bold;">else</span>
	    Wscript.Echo <span style="color: #800000;">&quot;  &gt; Arquivo [&quot;</span> &amp; cArquivo &amp; <span style="color: #800000;">&quot;] removido&quot;</span>
	<span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #8D38C9; font-weight: bold;">if</span>
<span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #E56717; font-weight: bold;">sub</span></pre></td></tr></table></div>

<p>Antes de remover as permissões e apagar o &#8216;dito cujo&#8217;, foi necessário remover todos os processos com origem no arquivo, para isto escrevi a seguinte função:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #008000;">'----------------------------------------------------------------------
</span><span style="color: #008000;">' Esta função é responsável por remover os processos relacionados aos
</span><span style="color: #008000;">' arquivos que identificam os virus
</span><span style="color: #008000;">'----------------------------------------------------------------------
</span><span style="color: #E56717; font-weight: bold;">sub</span> RemoveProcessos(cCaminho)
    Wscript.Echo <span style="color: #800000;">&quot;  &gt; Caminho: &quot;</span> &amp; cCaminho
    <span style="color: #151B8D; font-weight: bold;">Set</span> colProcessList = objWMIService.ExecQuery (<span style="color: #800000;">&quot;SELECT * FROM Win32_Process&quot;</span>)
    <span style="color: #8D38C9; font-weight: bold;">For</span> <span style="color: #8D38C9; font-weight: bold;">Each</span> objProcess <span style="color: #8D38C9; font-weight: bold;">in</span> colProcessList
        <span style="color: #8D38C9; font-weight: bold;">if</span> objProcess.ExecutablePath = cCaminho <span style="color: #8D38C9; font-weight: bold;">then</span>
            objProcess.Terminate()
            Wscript.Echo <span style="color: #800000;">&quot;    &gt; PID: &quot;</span> &amp; objProcess.ProcessId &amp; <span style="color: #800000;">&quot; morto&quot;</span>
        <span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #8D38C9; font-weight: bold;">if</span>
    <span style="color: #8D38C9; font-weight: bold;">next</span>
<span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #E56717; font-weight: bold;">sub</span></pre></td></tr></table></div>

<p>Estas três funções podem ser reutilizadas em quaisquer vacinas que precise destas funcionalidades. Agora iremos partir para as tarefas específicas do virus TINY.H.</p>
<p>Primeiro precisamos identificar a presença do virus. Para isto peguei o nome dos arquivos que ele gera, chamados autorun.inf, explorer.exe e fooool.exe. Com isto, escrevi a seguinte função que verifica se um determinado dispositivo (H:, i:, etc) esta infectado:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #008000;">'---------------------------------------------------------------------
</span><span style="color: #008000;">' Verifica a possivel infecção em um dispositivo, tendo como parametro
</span><span style="color: #008000;">' a letra do dispositivo e verificando através da existencia dos
</span><span style="color: #008000;">' arquivos deixados pela infecção
</span><span style="color: #008000;">'---------------------------------------------------------------------
</span><span style="color: #E56717; font-weight: bold;">function</span> DispositivoInfectado(cDispositivo)
    DispositivoInfectado = objFSO.FileExists(cDispositivo + <span style="color: #800000;">&quot;\autorun.inf&quot;</span>) <span style="color: #8D38C9; font-weight: bold;">AND</span> _
                           objFSO.FileExists(cDispositivo + <span style="color: #800000;">&quot;\explorer.exe&quot;</span>) <span style="color: #8D38C9; font-weight: bold;">AND</span> _
                           objFSO.FileExists(cDispositivo + <span style="color: #800000;">&quot;\fooool.exe&quot;</span>)
<span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #E56717; font-weight: bold;">function</span></pre></td></tr></table></div>

<p>Sabendo que um determinado dispositivo esta infectado, basta utilizar as rotinas já vistas para restaurar as permissões dos arquivos (remover o SYSTEM, HIDDEN e ARCHIVE), matar os respectivos processos e remover os arquivos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #008000;">'------------------------------------------------
</span><span style="color: #008000;">' Função responsável pelo processo de desinfecção
</span><span style="color: #008000;">'------------------------------------------------
</span><span style="color: #E56717; font-weight: bold;">function</span> Desinfecta(cDispositivo)
    Wscript.Echo <span style="color: #800000;">&quot;----------------------------------&quot;</span>
    Wscript.Echo <span style="color: #800000;">&quot;======= Aplicando Recovery =======&quot;</span>
    Wscript.Echo <span style="color: #800000;">&quot;----------------------------------&quot;</span>
&nbsp;
    Wscript.Echo <span style="color: #800000;">&quot;&gt; Restaurando Permições para Original&quot;</span>
    RemovePermicoes cDispositivo &amp; <span style="color: #800000;">&quot;\autorun.inf&quot;</span>
    RemovePermicoes cDispositivo &amp; <span style="color: #800000;">&quot;\explorer.exe&quot;</span>
    RemovePermicoes cDispositivo &amp; <span style="color: #800000;">&quot;\fooool.exe&quot;</span>
    Wscript.Echo <span style="color: #800000;">&quot;&quot;</span>
&nbsp;
    Wscript.Echo <span style="color: #800000;">&quot;&gt; Finalizando Processos Dependentes&quot;</span>    
    RemoveProcessos cDispositivo + <span style="color: #800000;">&quot;\explorer.exe&quot;</span>
    RemoveProcessos cDispositivo + <span style="color: #800000;">&quot;\fooool.exe&quot;</span>
    Wscript.Echo <span style="color: #800000;">&quot;&quot;</span>
&nbsp;
    Wscript.Echo <span style="color: #800000;">&quot;&gt; Apagando Arquivos&quot;</span>    
    RemoveArquivo cDispositivo + <span style="color: #800000;">&quot;\explorer.exe&quot;</span>
    RemoveArquivo cDispositivo + <span style="color: #800000;">&quot;\fooool.exe&quot;</span>
    Wscript.Echo <span style="color: #800000;">&quot;&quot;</span>
&nbsp;
<span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #E56717; font-weight: bold;">function</span></pre></td></tr></table></div>

<p>E para nossa (pseudo-)vacina esta quase completa basta varrer todos os dispositivoes removíveis a procura de algum infectado:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #008000;">'-------------------------------------------------------------
</span><span style="color: #008000;">' Busca todos os dispositivos removiveis a procura da infeccao
</span><span style="color: #008000;">'-------------------------------------------------------------
</span><span style="color: #151B8D; font-weight: bold;">Set</span> colDisks = objWMIService.ExecQuery(<span style="color: #800000;">&quot;Select * from Win32_LogicalDisk Where DriveType = &quot;</span> &amp; REMOVABLE_DRIVER &amp; <span style="color: #800000;">&quot;&quot;</span>)
&nbsp;
&nbsp;
Wscript.Echo <span style="color: #800000;">&quot;----------------------------------&quot;</span>
Wscript.Echo <span style="color: #800000;">&quot;====== Verificando Infecção ======&quot;</span>
Wscript.Echo <span style="color: #800000;">&quot;----------------------------------&quot;</span>
&nbsp;
&nbsp;
boolInfected = <span style="color: #00C2FF; font-weight: bold;">False</span>
<span style="color: #8D38C9; font-weight: bold;">For</span> <span style="color: #8D38C9; font-weight: bold;">Each</span> objDisk <span style="color: #8D38C9; font-weight: bold;">in</span> colDisks
&nbsp;
    <span style="color: #8D38C9; font-weight: bold;">if</span> objDisk.DeviceID  <span style="color: #800000;">&quot;A:&quot;</span> <span style="color: #8D38C9; font-weight: bold;">then</span> <span style="color: #008000;">' Não vale disquete :P
</span>
        <span style="color: #008000;">'----------------------------------------------
</span>        <span style="color: #008000;">' Verifica a existencia da infeccao nos drivers
</span>        <span style="color: #008000;">'----------------------------------------------
</span>        <span style="color: #8D38C9; font-weight: bold;">if</span> DispositivoInfectado(objDisk.DeviceID) <span style="color: #8D38C9; font-weight: bold;">then</span>
&nbsp;
            Wscript.Echo <span style="color: #800000;">&quot;&gt; Possível infecção TINY/H em (&quot;</span> + objDisk.DeviceID + <span style="color: #800000;">&quot;)&quot;</span>
            Wscript.Echo <span style="color: #800000;">&quot;  &gt; &quot;</span> + objDisk.DeviceID + <span style="color: #800000;">&quot;\autorun.inf&quot;</span>
            Wscript.Echo <span style="color: #800000;">&quot;  &gt; &quot;</span> + objDisk.DeviceID + <span style="color: #800000;">&quot;\explorer.exe&quot;</span>
            Wscript.Echo <span style="color: #800000;">&quot;  &gt; &quot;</span> + objDisk.DeviceID + <span style="color: #800000;">&quot;\fooool.exe&quot;</span>
            Wscript.Echo <span style="color: #800000;">&quot;&quot;</span>
&nbsp;
            Desinfecta objDisk.DeviceID
            boolInfected = <span style="color: #00C2FF; font-weight: bold;">True</span>
        <span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #8D38C9; font-weight: bold;">if</span>
    <span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #8D38C9; font-weight: bold;">if</span>
<span style="color: #8D38C9; font-weight: bold;">Next</span></pre></td></tr></table></div>

<p>Bem. Isto foi só um básico de escrita de vacinas contra malwares. O código completo esta disponível para download <a href="http://maycon.hacknroll.com/?p=codes&amp;down=vacina-TINI.H&amp;ext=vbs">aqui</a>, porém o mais interessante seria disponibilizar minha análise (pra quem gosta de assembly). Ela esta um pouco bagunçada, portanto se tiver um tempinho extra irei organizar e posta a análise de meu primeira malware.</p>
<p>Maycon Maia Vitali ( 0ut0fBound )</p>
<p>http://maycon.hacknroll.com</p>
<p>Hack&#8217;n Roll</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2009/03/21/vacina-tinyh/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Serial Fishing</title>
		<link>http://blog.hacknroll.com/2009/03/03/serial-fishing/</link>
		<comments>http://blog.hacknroll.com/2009/03/03/serial-fishing/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 23:42:50 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Análise de Binário]]></category>
		<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=147</guid>
		<description><![CDATA[Estava procurando rever algumas coisas de engenharia reversa e fui 'brincar' com serial Fishing. Serial fishing é possível quando a aplicação, ao tentar verificar se o serial digitado foi fornecido corretamente, gera o serial original para fazer uma comparação. Vamos ver como podemos tirar proveito disto.]]></description>
			<content:encoded><![CDATA[<p>Estava procurando rever algumas coisas de engenharia reversa e fui &#8216;brincar&#8217; com serial Fishing. Serial fishing é possível quando a aplicação, ao tentar verificar se o serial digitado foi fornecido corretamente, gera o serial original para fazer uma comparação. Vamos ver como podemos tirar proveito disto.</p>
<p>Como o serial gerado pela aplicação esta residente na memória, basta abrir o processo e pegar ele bonitinho na memória. A parte mais emocionante é encontrar o serial na memória (isto se ele estiver lá). Para fins de <del datetime="2009-03-03T23:36:01+00:00">uso pessoal</del> estudo, achando tendo o serial na memória já basta, porém como bons nerds <del datetime="2009-03-03T23:36:01+00:00">atoas</del> que somos, nós escrevemos um código que pegue e exiba o serial na tela.</p>
<p>O programa que estava testar é o jogo Xadrez Master na versão 5.8.6.0, ao abri-lo no OllyDbg e digitar qualquer nome e serial, é exibida uma mensagem informando que o serial está inválida. Sem fechar a janela, voltei para o Olly, dei pause no processo e então pude analisar o seguinte na memória:</p>
<pre>
CPU Dump:
0012EA48  |00F2F1A8  ASCII "Maycon Maia Vitali (0ut0fBound)"
0012EA4C  |00F36868  ASCII "XAD-BXLT4-TLKXJ"
0012EA50  |00F1C8A4  ASCII "XAD"
0012EA54  |00F2F18C  ASCII "AABBCCDDEEFF"
0012EA58  |00EDCB64  ASCII "AAB"
0012EA5C  |00F1CEAC  ASCII "Maycon Maia Vitali (0ut0fBound)"
0012EA60  |00F2F170  ASCII "XAD-BXLT4-TLKXJ"
0012EA64  |00F1CE90  ASCII "AABBCCDDEEFF"
0012EA68  |00ED1D64  ASCII "AABBCCDDEEFF"
0012EA6C  |00ED1D80  ASCII "AABBCCDDEEFF"
0012EA70  |00F1CE74  ASCII "AABBCCDDEEFF"
0012EA74  |00ED1D0C  ASCII "Maycon Maia Vitali (0ut0fBound)"
0012EA78  |00ED1D38  ASCII "Maycon Maia Vitali (0ut0fBound)"
</pre>
<p>Estes dados foram obtidos da pilha, e podemos notar o serial XAD-BXLT4-TLKXJ para o nome &#8220;Maycon Maia Vitali (0ut0fBound)&#8221; em diversos endereços diferentes. Vamos pegar só um exemplo:</p>
<pre>
0012EA48  |00F2F1A8  ASCII "Maycon Maia Vitali (0ut0fBound)"
0012EA4C  |00F36868  ASCII "XAD-BXLT4-TLKXJ"
</pre>
<p>Neste caso, nos endereços 0012EA48 e 0012EA4C temos respectivamente os endereços de memória onde estão o nome e serial válidos. Portanto nosso &#8220;Serial Fisher&#8221; deve obter antes os endereços das strings na memória para depois le-las em sí.</p>
<p>Sem muitas firulas, segue um código-rápido que fiz para fazer Serial Fishing desse software. Lembrando que é necessário digitar um serial qualquer e pressionar o botão de registrar e, sem fechar a caixa da mensagem informando serial inválido, rodar o fisher(pescador):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/**
 * Serial fisher para RKSoft Xadrez Master 5.8.6.0
 * Por Maycon M. Vitali (0ut0fBound)
 *
 * ATENÇÃO: Este código foi criado para fins de estudo, caso deseje
 * obter o software é necessário que se page a licensa estipulada
 * pelo fabricante.
 */</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #339933;">#include &lt;windows.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define NAME_PTR_ADDR   0x0012EA48</span>
<span style="color: #339933;">#define SERIAL_PTR_ADDR 0x0012EA4C</span>
&nbsp;
<span style="color: #339933;">#define TITULO_JANELA &quot;Xadrez Master&quot;</span>
&nbsp;
<span style="color: #339933;">#define MAX_SIZE 100</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    HWND cmeHandle<span style="color: #339933;">;</span>                <span style="color: #666666; font-style: italic;">// Handle da janela do processo</span>
    DWORD cmePid<span style="color: #339933;">;</span>                  <span style="color: #666666; font-style: italic;">// PID do processo crackme</span>
    HANDLE cmdProcHandle<span style="color: #339933;">;</span>          <span style="color: #666666; font-style: italic;">// Handle do processo ( depois de aberto )</span>
&nbsp;
    <span style="color: #993333;">long</span> lngAddrNome<span style="color: #339933;">,</span> lngAddrSerial<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> strNome<span style="color: #009900;">&#91;</span>MAX_SIZE<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> strSerial<span style="color: #009900;">&#91;</span>MAX_SIZE<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #993333;">char</span> strMensagem<span style="color: #009900;">&#91;</span>MAX_SIZE<span style="color: #339933;">*</span><span style="color: #0000dd;">2</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">20</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Procuramos pela janela do crackme</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>cmeHandle <span style="color: #339933;">=</span> FindWindow<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> TITULO_JANELA<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        MessageBoxA<span style="color: #009900;">&#40;</span>
            <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>
            <span style="color: #ff0000;">&quot;Execute o xadrez.exe e tente registrar com qualquer serial antes.&quot;</span><span style="color: #339933;">,</span>
            <span style="color: #ff0000;">&quot;Serial Fishing&quot;</span><span style="color: #339933;">,</span>
            <span style="color: #0000dd;">0</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        exit<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Pega e abre processo</span>
    GetWindowThreadProcessId<span style="color: #009900;">&#40;</span>cmeHandle<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>cmePid<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    cmdProcHandle <span style="color: #339933;">=</span> OpenProcess<span style="color: #009900;">&#40;</span>PROCESS_ALL_ACCESS<span style="color: #339933;">,</span> FALSE<span style="color: #339933;">,</span> cmePid<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Obtém os endereços das informações na pilha</span>
    ReadProcessMemory<span style="color: #009900;">&#40;</span>cmdProcHandle<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>NAME_PTR_ADDR<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>lngAddrNome<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>lngAddrNome<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ReadProcessMemory<span style="color: #009900;">&#40;</span>cmdProcHandle<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>SERIAL_PTR_ADDR<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>lngAddrSerial<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>lngAddrSerial<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Pega os valores nos endereços obtidos</span>
    ReadProcessMemory<span style="color: #009900;">&#40;</span>cmdProcHandle<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>lngAddrNome<span style="color: #339933;">,</span> strNome<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>strNome<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ReadProcessMemory<span style="color: #009900;">&#40;</span>cmdProcHandle<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>lngAddrSerial<span style="color: #339933;">,</span> strSerial<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>strSerial<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    snprintf <span style="color: #009900;">&#40;</span>strMensagem<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>strMensagem<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Nome: %s<span style="color: #000099; font-weight: bold;">\n</span>Serial: %s&quot;</span><span style="color: #339933;">,</span> strNome<span style="color: #339933;">,</span> strSerial<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    MessageBoxA<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> strMensagem<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Enjoy!&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Nome ...: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> strNome<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Serial .: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> strSerial<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Como dito no comentário, não forneci esse código com fins de prejudicar a equipe que desenvolve a ferramenta. Tentarei futuramente disponibilizar análise de malwares e afins para não ter problemas futuros.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2009/03/03/serial-fishing/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

