<?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; Segurança</title>
	<atom:link href="http://blog.hacknroll.com/category/seguranca/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>Hack New Year: MD5 Chain com Rainbow Table</title>
		<link>http://blog.hacknroll.com/2010/01/02/hack-new-year-md5-chain-com-rainbow-table/</link>
		<comments>http://blog.hacknroll.com/2010/01/02/hack-new-year-md5-chain-com-rainbow-table/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 18:23:26 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Criptografia]]></category>
		<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=227</guid>
		<description><![CDATA[Antes de qualquer coisa, gostaria de desejar a todos um feliz ano novo cheio de felicidades e que seus objetivos sejam edificados em 2010. Criptografia com certeza é um assunto de interesse de muitos, porém por ser uma área tão extensa e de pré-requisitos (álgebra, geometria, trigonometria, teoria dos números, etc) que realmente não agradam [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de qualquer coisa, gostaria de desejar a todos um feliz ano novo cheio de felicidades e que seus objetivos sejam edificados em 2010.</p>
<p>Criptografia com certeza é um assunto de interesse de muitos, porém por ser uma área tão extensa e de pré-requisitos (álgebra, geometria, trigonometria, teoria dos números, etc) que realmente não agradam alguns muitas vezes não são estudadas como hobby.</p>
<p>A criptoanálise é o ramo da ciência que estuda métodos de criptografia, capacitando ao profissional fazer a análise de um algoritmo criptográfico quanto a sua complexidade, podendo definir um algoritmo como forte (de difícil quebra) ou fraco (de fácil quebra).</p>
<p>Como dito, para se estudar criptografia, geralmente tem-se a necessidade de um forte embasamento matemático. Para se ter idéia, algumas linhas da matemática pura estudados a 20 anos atrás são chave fundamental para os melhores algoritmos de criptografia da atualidade.</p>
<p>Alguns ramos de estudo de criptografia não necessitam de um embasamento profundo em matemática. Um desses ramos é o Hash Chain, base para o tão conhecido Rainbow Table (vide Project RainbowCrack), que utiliza uma técnica chamada Time-memory Tradeoff (TMTO).</p>
<p>Em um ataque de força-bruta (brute-force) convencional a um algoritmo de hash, são gerados todas as possíveis senhas com seus respectivos hash’s, e então procura-se um determinado hash para tentar obter a senha original. Porém, levando em consideração uma senha composto das letras de a à z (26 letras) e uma senha de até 7 caracteres, temos o total de:<br />
<a href="http://blog.hacknroll.com/wp-content/uploads/2010/01/hash-formula1.JPG"><img src="http://blog.hacknroll.com/wp-content/uploads/2010/01/hash-formula1.JPG" alt="Formula" width="368" height="79" class="aligncenter size-full wp-image-229" /></a></p>
<p>O maior problema não é calcular as senhas, e sim armazená-las, já que só para armazenar cada um dos 16 bytes do hash MD5 serão necessários mais que 124Gb de espaço. Se fosse até 8 (oito) caracteres esse valor iria mais que dobrar.</p>
<p>O Time-Memory Tradeoff tem por objetivo reduzir drasticamente a quantidade de memória utilizada em troca de um processamento um pouco maior, porém esse processamento poderia ser feito uma única vez e, dentro a tabela de hash bastaria apenas consultar.</p>
<p>Para se reduzir o tamanho do espaço armazenado, utiliza-se o chamado Hash Chain, que tem por finalidade armazenar uma palavra pertencente ao alfabeto e um hash não necessariamente equivalente a ela.</p>
<p>Iremos tomar como exemplo um alfabeto contendo as letras minúsculas de a à z. Com isto temos 26 letras em nosso alfabeto. Uma palavra é qualquer sequência de caracteres, todos pertencentes ao alfabeto dado e um dicionário é um conjunto de palavras.</p>
<p>O Hash Chain é formado da seguinte forma, dado uma palavra do dicionário, aplica-se uma função de hash H e em seguida aplica-se uma função R, tal que R resulte em uma palavra também pertencente ao dicionário. Faz-se essa operação uma determinada quantidade de vezes (aqui chamadas de iterações) e, ao final, armazena-se o hash resultante, por exemplo:</p>
<p>aaaaaa —H→ 281DAF40 —R→ sgfnyd —H→ 920ECF10</p>
<p>No exemplo acima fizemos apenas duas iterações com a palavra “aaaaaa”. Inicialmente aplicamos a função de hash e obtivemos o valor 281DAF40. Em seguida foi aplicação a função R resultando na palavra “sgfnyd” , pertencente ao dicionário. Por ultimo aplicou-se novamente a função de hash resultando no hash 920ECF10.</p>
<p>Dado um hash para consultar, verifica-se se ele esta contido na tabela de hash’s gerada. Caso ele seja encontrado, é provável que a partir da palavra inicial consiga-se obter a palavra equivalente ao hash. Por exemplo, se tivermos o hash 920ECF10, podemos encontrá-lo na tabela, sendo equivalente a palavra inicial aaaaaa, bastando apenas fazer as operações H e R varias vezes até encontramos a palavra que tenha o hash dado ou não encontrarmos (atingindo o máximo de iterações). Caso o hash procurado não esteja na tabela, aplica-se consecutivamente as funções R e H no hash fornecido, procurando novamente na tabela, fazendo assim com que o hash fornecido converja à um hash da tabela ou atinja o número máximo de iterações (caso não seja encontrado).</p>
<p>É importante ressaltar que a função R não pode ter qualquer aleatoriedade, ou seja, um valor de hash é sempre transformado na mesma palavra do dicionário. A diferença do Hash Chain puro para o Rainbow Table é que o segundo possui diversas funções R que transformam um hash qualquer em uma palavra do dicionário, tentando assim evitar colisões (dois hash resultarem na mesma palavra).</p>
<p>Para efeitos de ilustração escrevi um código como prova de conceito (p0c), que gera em tempo real um dicionário, faz diversas iterações e depois procura um dado hash. É importante deixar claro que esse código é somente demonstrativo, porém ele pode futuramente virar um projeto da Hack’n Roll. Algumas limitações dele é o dicionário ser fixo (letras de a à z), você tem que fornecer o tamanho da senha do hash (isso o torna completamente inútil sozinho em um ambiente real), terei que melhorar (e muito) a função que transforma o hash em uma palavra do dicionário, etc.</p>
<p><a href="http://blog.hacknroll.com/wp-content/uploads/2010/01/hash-hack1.JPG"><img src="http://blog.hacknroll.com/wp-content/uploads/2010/01/hash-hack1.JPG" alt="Quebra do hash da palavra hack" width="668" height="223" class="aligncenter size-full wp-image-231" /></a></p>
<p>A ferramenta faz o que promete, porém algumas (muitas) vezes ele não encontra a palavra solicitada. Isso se dá porque o dicionário inicial é gerado aleatóriamente, para um melhor resultado, basta executar novamente com os mesmos parâmetros até ele encontrar a palavra solicitada:<br />
<a href="http://blog.hacknroll.com/wp-content/uploads/2010/01/hash-natal1.JPG"><img src="http://blog.hacknroll.com/wp-content/uploads/2010/01/hash-natal1.JPG" alt="Quebra do hash MD5 da palavra natal" width="644" height="481" class="aligncenter size-full wp-image-233" /></a></p>
<p>Não recomendo tentar utilizar o md5-chain como ferramente de quebra de hash MD5. Ele foi escrito com o único propósito de explicar o conceito de hash chain, time-memory tradeoff e como funciona o projeto RainbowCrack. Este ultimo já possui diversas melhorias matemáticas além de ter instruções específicas para trabalhar com GPU (processadores de placas de vídeo).</p>
<p>No projeto RainbowCrack, a tabela palavra/hash é gerada e armazenada em arquivo, sempre fazendo algumas verificações. Dessa forma bastaria fazer as consultas necessárias e obter os resultados.</p>
<p>O código-fonte do md5-chain pode ser obtido <a href="http://maycon.hacknroll.com/codes/md5-chain.tar.bz2">aqui</a>. Sinta-se livre para modificá-lo e estudá-lo à vontade. Um desafio seria reescrever a função makepass() que gera uma palavra a partir de um hash, cuja execução com um dicionário inicial de 2000 palavras e 2000 iterações de uma senha de 5 caracteres não gere muitas (ou nenhuma) repetição.</p>
<p>Bom estudo e feliz hack’n roll.</p>
<p>Referências:<br />
<a href="http://en.wikipedia.org/wiki/Rainbow_table">http://en.wikipedia.org/wiki/Rainbow_table</a><br />
<a href="http://en.wikipedia.org/wiki/Space-time_tradeoff">http://en.wikipedia.org/wiki/Space-time_tradeoff</a><br />
<a href="http://www.cs.sjsu.edu/faculty/stamp/RUA/TMTO.pdf">http://www.cs.sjsu.edu/faculty/stamp/RUA/TMTO.pdf</a><br />
<a href="http://project-rainbowcrack.com/">http://project-rainbowcrack.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2010/01/02/hack-new-year-md5-chain-com-rainbow-table/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>A Verdade sobre o Apagão</title>
		<link>http://blog.hacknroll.com/2009/11/12/a-verdade-sobre-o-apagao/</link>
		<comments>http://blog.hacknroll.com/2009/11/12/a-verdade-sobre-o-apagao/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 02:57:37 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=202</guid>
		<description><![CDATA[Na noite do dia 10/11/2009, por volta das 22h00, todos os grandes centros do Brasil se viram na escuridão. Dentre eles estão o estado de São Paulo e Rio de Janeiro, juntamente com outros 15 estados. Além dos afetados no Brasil, tivemos vizinhos estrangeiros. Entre os responsáveis por isso, o mais dito, foi o fato [...]]]></description>
			<content:encoded><![CDATA[<p>Na noite do dia 10/11/2009, por volta das 22h00, todos os grandes centros do Brasil se viram na escuridão. Dentre eles estão o estado de São Paulo e Rio de Janeiro, juntamente com outros 15 estados. Além dos afetados no Brasil, tivemos vizinhos estrangeiros.</p>
<p>Entre os responsáveis por isso, o mais dito, foi o fato de o incidente ter sido causado por uma tempestade de raios. Porém boa parte de história não foi contada.</p>
<p>Há uma semana, no jornal &#8220;60 minutes&#8221; do canal americano CBS, um <strong>ex-hacker</strong> black-hat, Kevin Poulsen, afirmou que o Brasil estaria sujeito a ataques de hackers em seu sistema elétrico e, como sempre, o governo brasileiro juntamente com o ministro de Minas e Energia, Edison Lobão, negam completamente a possibilidade. Porém, a verdade pode ser dura para todos os brasileiros.</p>
<p>Ao ver a possibilidade, procurei analisar se realmente seria possível adentrar no sistema de gerenciamento elétrico do país. Até então, não conhecia nada sobre o assunto, porém ao analisar algumas noticias, percebi que um dos principais órgãos a gerenciar a energia é o Operador Nacional do Sistema (ONS).</p>
<p>Dando uma googlada, pude facilmente encontrar a página do governo (www.ons.org.br) e, caminhando por alguns links, notei nada de importante. Foi então que pensei: &#8220;Se eles tivessem alguma coisa confidencial, não estariam na página. E se eles quisessem esconder de indexadores como Google?&#8221;. Aí que veio a primeira parte da surpresa.</p>
<p>Existe o arquivo robots.txt na raiz de alguns servidores que definem algumas regras para os indexadores. O grande problema é que muitos desenvolvedores utilizam esses arquivos para &#8216;esconder&#8217; diretórios e arquivos de possíveis atacantes. Porém um atacante poderia facilmente descobrir tais diretórios simplesmente e acessar os arquivos, como segue:</p>
<p><a href="http://www.ons.org.br/robots.txt">http://www.ons.org.br/robots.txt</a></p>
<p>Ao acessar este arquivos, temos o seguinte conteúdo:</p>
<blockquote><p>User-agent: * Disallow: /agentes/agentes.aspx<br />
Disallow: /download/agentes/</p></blockquote>
<p>Fiquei surpreso ao perceber que realmente tentaram utilizar tais recursos para proteger um diretório.</p>
<p>Acessando o primeiro dos endereços, sem qualquer autenticação podemos ter acesso ao endereço de todos os Sistemas Agentes da ONS, inclusive alguns com software para download e manual. Não conheço quaisquer destes sistemas, porém um deles me chamou a atenção quanto ao blecaute que ocorreu na ultima terça-feira, o Sistema de Administração de Contratos de Transmissão (SACT), que é acessível através do do endereço <a href="http://aplicleg.ons.org.br/intunica/">http://aplicleg.ons.org.br/intunica/</a>, e pode ser visto abaixo:</p>
<div id="attachment_208" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.hacknroll.com/wp-content/uploads/2009/11/login1.JPG"><img src="http://blog.hacknroll.com/wp-content/uploads/2009/11/login1-300x114.jpg" alt="Tela de Login SACT" width="300" height="114" class="size-medium wp-image-208" /></a><p class="wp-caption-text">Tela de Login SACT</p></div>
<p>Com isto, conseguimos chegar a uma tela de login que representa nada mais nada menos do que o <strong>Operador Nacional do Sistema Elétrico</strong>. Pensei que a partir de então o processo seria mais difícil, porém mais uma vez fiquei surpreso com a incompetência do governo.</p>
<p>Ao fazer o primeiro teste, que qualquer ferramenta de auditoria de segurança faria, obtive um grande susto. Ao colocar uma aspas simples no campo de usuário e senha pude detectar a mais grotesca das falhas Web, um SQL INJECTION, tendo como resultado o seguinte:</p>
<blockquote><p>[IfxException: ERROR [HY000] [Informix .NET provider]General error.] IBM.Data.Informix.IfxConnection.HandleError(IntPtr hHandle, SQL_HANDLE hType, RETCODE retcode) +27 IBM.Data.Informix.IfxCommand.ExecuteReaderObject(CommandBehavior behavior, String method) +739 IBM.Data.Informix.IfxCommand.ExecuteReader(CommandBehavior behavior) +104 IBM.Data.Informix.IfxCommand.ExecuteReader() +48 OnsClasses.OnsData.OnsCommand.ExecuteReader() IntUnica.Menu.btnOk_Click(Object sender, ImageClickEventArgs e) System.Web.UI.WebControls.ImageButton.OnClick(ImageClickEventArgs e) +109 System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +69 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33 System.Web.UI.Page.ProcessRequestMain() +1292</p></blockquote>
<p>Ou seja, além de ter encontrado uma falha de SQL Injection, já descobri de cara que o sistema funciona rodando um banco de dados IBM Informix. A partir deste passo ficaria extremamente fácil para qualquer pessoa com conhecimento intermediário de SQL Injection <strong>invadir o Operador Nacional do Sistema Elétrico</strong>.</p>
<p>É interessante ressaltar que não tenho qualquer ligação com o ocorrido no dia 11 de novembro de 2009, e que irei parar a divulgação neste ponto para não comprometer mais ainda o funcionamento do sistema (odeio escuro). Não estou afirmando que o ocorrido foi causado por um ataque hacker, porém se tivesse sido, é importante deixar bem visível que o mesmo aconteceria sem qualquer dificuldade.</p>
<p>Espero que este post abra os olhos do governo, para que não possamos sofrer danos maiores em situações mais críticas.</p>
<p>Abraços a todos,<br />
Maycon Maia Vitali (23 anos)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2009/11/12/a-verdade-sobre-o-apagao/feed/</wfw:commentRss>
		<slash:comments>200</slash:comments>
		</item>
		<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>

