<?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:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Felipe Farinon</title>
	<atom:link href="http://scarvenger.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://scarvenger.wordpress.com</link>
	<description>__asm { int 3h }</description>
	<pubDate>Wed, 21 May 2008 03:06:25 +0000</pubDate>
	<generator>http://wordpress.org/?v=MU</generator>
	<language>pt-br</language>
			<item>
		<title>Injetando Código em outro Processo.</title>
		<link>http://scarvenger.wordpress.com/2008/05/21/injetando-codigo-em-outro-processo/</link>
		<comments>http://scarvenger.wordpress.com/2008/05/21/injetando-codigo-em-outro-processo/#comments</comments>
		<pubDate>Wed, 21 May 2008 02:32:29 +0000</pubDate>
		<dc:creator>scarvenger</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<category><![CDATA[Win32]]></category>

		<category><![CDATA[injeção de código]]></category>

		<category><![CDATA[writeprocessmemory]]></category>

		<guid isPermaLink="false">http://scarvenger.wordpress.com/?p=42</guid>
		<description><![CDATA[Neste artigo irei demonstrar o processo de injeção de código em outro processo rodando no windows.
Requisitos: C++, Win32.

Bom existem várias técnicas de injeção de código em outros processos mas a que eu considero mais &#8220;limpa&#8221; é a da injeção de código via DLL utilizando a API CreateRemoteThread. Vamos começar criando a nossa DLL:


BOOL APIENTRY DllMain( [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Neste artigo irei demonstrar o processo de injeção de código em outro processo rodando no windows.</p>
<p>Requisitos: C++, Win32.</p>
<p><span id="more-42"></span></p>
<p>Bom existem várias técnicas de injeção de código em outros processos mas a que eu considero mais &#8220;limpa&#8221; é a da injeção de código via DLL utilizando a API CreateRemoteThread. Vamos começar criando a nossa DLL:</p>
<pre name="code" class="cpp">

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    MessageBox(NULL, L&quot;Código Injetado&quot;, L&quot;Injeção de Código&quot;, MB_OK);
    break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
</pre>
<p>Este código está bem simples, quando a nossa DLL for carregada ela mostrará uma MessageBox. Agora vamos para a lógica do negócio do injetor desta DLL:</p>
<p><strong>1) </strong>Abrir o processo com a API OpenProcess especificando o pid do processo a ser injetado.</p>
<pre name="code" class="cpp">

HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
</pre>
<p><strong>2) </strong>Usar o VirtualAllocEx para alocar um buffer dentro do processo aberto no item 1, assim que estiver alocado utilizar o WriteProcessMemory para colocar o nome da DLL que vai ser injetada no processo.</p>
<pre name="code" class="cpp">

std::string dllPath = &quot;C:\\MeuProjeto\\Minha.dll&quot;;
int bytesWritten = 0;
void* remoteBuffer = VirtualAllocEx(handle, NULL, dllPath.size(), MEM_COMMIT, PAGE_READWRITE);

WriteProcessMemory(handle, remoteBuffer, &amp;dllPath[0], dllPath.size(), &amp;bytesWritten);
</pre>
<p><strong>3) </strong>Carregue a DLL Kernel32 através de um LoadLibrary e pegue o endereço da função LoadLibrary dentro dessa DLL.</p>
<pre name="code" class="cpp">

HMODULE kernel32 = LoadLibrary(&quot;Kernel32.dll&quot;);
void* loadLibraryAddress = GetProcAddress(kernel32, &quot;LoadLibraryA&quot;);
</pre>
<p><strong>4) </strong>Crie um thread remoto usando a função CreateRemoteThread que inicie na função LoadLibrary através do endereço adquirido no item 3 e que passe como parâmetro o buffer com o nome da DLL que foi previamente alocado.</p>
<pre name="code" class="cpp">

LPTHREAD_START_ROUTINE threadStart = reinterpret_cast&lt;LP_THREAD_START_ROUTINE&gt;(loadLibraryAddress);
DWORD threadId = 0;
HANDLE remoteThread = CreateRemoteThread(handle,
      NULL,
      0,
      threadStart,
      reinterpret_cast&lt;void*&gt;(remoteBuffer),
      0,
      &amp;threadId);
</pre>
<p>Para simplificar o processo eu criei uma biblioteca que &#8220;automatiza&#8221; o processo de injeção de código em outros processos, <a href="http://www.felipefarinon.com/libprocess.zip">os fontes juntamente com um exemplo estão aqui,</a> sugiro ler os fontes do source Process.cpp para ter uma idéia prática do processo.</p>
<pre name="code" class="cpp">

Process process(4952);

if (process.InjectDll(&quot;D:\\Projetos\\Examples 2\\Debug\\Examples 2.dll&quot;))
{
  std::cout &lt;&lt; &quot;dll injetada com sucesso\n&quot;;
}
</pre>
<p>Então vamos compilar a DLL e alterar o caminho da DLL no arquivo de exemplo para a sua DLL que foi compilada e alterar no construtor do Process o pid do processo a ser infectado. Assim provavelmente acabaremos com uma tela assim:</p>
<p><a href="http://scarvenger.files.wordpress.com/2008/05/injetado.jpg"><img class="alignnone size-thumbnail wp-image-43" src="http://scarvenger.files.wordpress.com/2008/05/injetado.jpg?w=128&h=80" alt="" width="128" height="80" /></a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/scarvenger.wordpress.com/42/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/scarvenger.wordpress.com/42/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scarvenger.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scarvenger.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scarvenger.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scarvenger.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scarvenger.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scarvenger.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scarvenger.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scarvenger.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scarvenger.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scarvenger.wordpress.com/42/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=42&subd=scarvenger&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://scarvenger.wordpress.com/2008/05/21/injetando-codigo-em-outro-processo/feed/</wfw:commentRss>
	
		<media:content url="http://scarvenger.files.wordpress.com/2008/05/injetado.jpg?w=128" medium="image" />
	</item>
		<item>
		<title>Reversing Wacraft 3 Frozen Throne</title>
		<link>http://scarvenger.wordpress.com/2008/05/13/reversing-wacraft-3-frozen-throne/</link>
		<comments>http://scarvenger.wordpress.com/2008/05/13/reversing-wacraft-3-frozen-throne/#comments</comments>
		<pubDate>Tue, 13 May 2008 03:41:14 +0000</pubDate>
		<dc:creator>scarvenger</dc:creator>
		
		<category><![CDATA[Assembly]]></category>

		<category><![CDATA[Debugging]]></category>

		<category><![CDATA[Engenharia Reversa]]></category>

		<category><![CDATA[Win32]]></category>

		<category><![CDATA[ollydbg]]></category>

		<guid isPermaLink="false">http://scarvenger.wordpress.com/?p=39</guid>
		<description><![CDATA[Creio que muitos tenham visto o meu post sobre como descobrir endereços de memória alocados dinâmicamente, aqui vou mostrar um exemplo prático aplicado ao jogo Warcraft 3 onde alteraremos o valor do gold do player dentro da memória do Warcraft 3.
Conhecimentos Requeridos: Assembly, Debugging.
Debugger Utilizado: Windbg e Ollydbg.

Buscando a memória
Bom, começarei lançando o meu debuger, [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Creio que muitos tenham visto o meu post sobre <a href="http://scarvenger.wordpress.com/2008/05/12/descobrindo-endereco-de-memoria-alocada-dinamicamente/">como descobrir endereços de memória alocados dinâmicamente</a>, aqui vou mostrar um exemplo prático aplicado ao jogo Warcraft 3 onde alteraremos o valor do gold do player dentro da memória do Warcraft 3.</p>
<p>Conhecimentos Requeridos: Assembly, Debugging.</p>
<p>Debugger Utilizado: Windbg e Ollydbg.</p>
<p><span id="more-39"></span></p>
<p><strong>Buscando a memória</strong></p>
<p>Bom, começarei lançando o meu debuger, carregando o war3.exe e criando um jogo no custom game, peguei um mapa qualquer e o iniciei. Inicialmente estou com 500 de gold, o valor que a gente usará de base no debugging.</p>
<p>Agora que o jogo já está carregado disparei um breakpoint no debugger e usarei o comando de procurar pela memória que o Windbg fornece:</p>
<p><code><span style="color:#808080;">s b 0&#215;00000000 L?0xffffffff f4 01</span></code></p>
<p>Que faz com que o valor 0xf4 0&#215;01 (500 em decimal) seja procurado do endereço 0&#215;00000000 (início da memória) até L?0xffffffff (fim da memória). É interessante lembrar que os bytes foram invertidos por causa do <a href="http://en.wikipedia.org/wiki/Endianness">Endianess</a>. Isso faz com que uma lista de endereços seja retornada sempre que o valor nele for o mesmo que a gente estiver procurando, o que nos retornou uma lista beeem grande. Para resolver isso gastamos um pouco o gold dentro do jogo e efetuamos a busca novamente com o novo valor do gold o que nos deixará com duas listas enormes. O endereço que for igual quando compararmos as duas listas provavelmente é o endereço do gold, para fazer isso criaremos um programa que realize esta comparação (quando eu tiver o meu site eu posto os meus fontes aqui).</p>
<p>Veremos que apesar de tudo nenhum endereço se igualou, o que nos diz que o gold é guardado de maneira diferente dentro da memória do jogo&#8230; droga, mais trabalho pra gente. Ainda nos resta procurar pelo valor ASCII do gold que é pintado na tela que pode nos dar uma dica de como achar o endereço do gold original. Peguemos o nosso Windbg e repetiremos o processo de criação de um jogo. Agora realizaremos uma busca (da mesma forma que fizemos anteriormente) pela memória com o valor de 35 30 30 que corresponde ao valor de 500 em ASCII:</p>
<p><code><span style="color:#808080;">s a 0&#215;00000000 L?0xffffffff 35 30 30</span></code></p>
<p>Repetiremos o processo de gastar o gold e procurar pelo novo valor e comparar os resultados. Humm, dessa vez conseguimos dois endereços válidos, vamos analisá-los mais de perto setando um breakpoint em cada um deles quando o processador tentar escrever neles.</p>
<p><code><span style="color:#808080;">ba w4 0x[endereco]</span></code></p>
<p>Sendo [endereco] o endereço que o comparador retornou, faça isso em ambos endereços. Esse comando tem a seguinte sintaxe: ba [w/r][tamanho] [endereco]. Ele faz com que cada vez que o [endereco] com [tamanho] bytes seja [escrito/lido] um breakpoint seja disparado. Então agora cada vez que gastamos/ganhamos gold um breakpoint é disparado pela aplicação, agora está começando a ficar legal.</p>
<p><strong>Reversing</strong></p>
<p>Já que eu não gosto do disassembly do Windbg percebemos que a string que guarda o gold começa com &#8220;mo&#8221;, então vamos carregar o nosso Ollydbg com o processo war3.exe, criar um custom game e procurar por mo500 na memória, o que vai nos retornar os mesmos dois endereços anteriores, então vamos setar hardware breakpoints em ambos e gastar um pouco de gold, o que vai disparar um breakpoint e nos dar o seguinte código:</p>
<p><code><span style="color:#808080;"><br />
6F6628A2   MOV BYTE PTR DS:[EAX],CL<br />
6F6628A4   PUSH EBX<br />
6F6628A5   PUSH EDI<br />
6F6628A6   MOV EDI,DWORD PTR SS:[EBP+8]<br />
</span></code></p>
<p>Percebemos que o registrador EAX está com apontando para um dos nossos endereços, e vemos que o valor de EBP+8 é o novo valor do gold que deve ser atualizado, EBP geralmente é usado para especificar parâmetros, então esta variável deve estar vindo de uma função acima no stack, vamos segui-la:</p>
<p><code><span style="color:#808080;"><br />
6F151766   CALL Game.6F088E10<br />
6F15176B   MOV ECX,EAX<br />
6F15176D   MOV EAX,6666666<br />
6F151772   IMUL ECX<br />
6F151774   SAR EDX,2<br />
6F151777   MOV EAX,EDX<br />
6F151779   SHR EAX,1F<br />
6F15177C   ADD EDX,EAX<br />
6F15177E   JMP SHORT Game.6F151782<br />
6F151780   XOR EDX,EDX<br />
6F151782   PUSH EDX<br />
6F151783   PUSH Game.6F804EC0                       ; ASCII &#8220;%u&#8221;<br />
6F151788   LEA ECX,DWORD PTR SS:[EBP-40]<br />
6F15178B   PUSH 40<br />
6F15178D   PUSH ECX<br />
6F15178E   CALL &lt;JMP.&amp;Storm.#578&gt;<br />
6F151793   MOV ECX,DWORD PTR DS:[EDI+124]<br />
6F151799   ADD ESP,10<br />
6F15179C   LEA EDX,DWORD PTR SS:[EBP-40]<br />
6F15179F   PUSH EDX<br />
6F1517A0   CALL Game.6F662890</span></code></p>
<p>A variável que está sendo passada como parâmetro é a EDX, logo antes da chamada à função que estavamos anteriormente temos um:</p>
<p><code><span style="color:#808080;"> 6F15179C   LEA EDX,DWORD PTR SS:[EBP-40]</span></code></p>
<p>Que faz com que EDX aponte para o endereço DWORD PTR SS:[EBP-40], provavelmente uma variável local com tamanho fixo de 0&#215;40, que está sendo populado quando a função &lt;JMP.&amp;Storm.#578&gt; é chamada, então observemos os seus parâmetros: regitrador EDX, variável local com valor &#8220;%u&#8221;, uma variável local e seu respectivo tamanho. Está com cara de uma função de conversão de valor decimal para caractere. Sabemos então que EDX está com o valor decimal do gold.</p>
<p>A instrução que origina o valor de EDX antes de serem efetuados aqueles calculos (que são necessário para converter o valor &#8220;escondido&#8221; no decimal) é:</p>
<p><code><span style="color:#808080;"><br />
6F151766   CALL Game.6F088E10<br />
6F15176B   MOV ECX,EAX<br />
</span></code></p>
<p>Aqui observamos que no fim das contas o valor de EDX vem do retorno da função ((registrador EAX) chamada no bloco acima, então vamos entrar nessa função e ver de onde que o registrador EAX tira o seu valor:</p>
<p><strong>Gotcha!</strong><br />
<code><span style="color:#808080;"><br />
6F088E78   MOV EAX,DWORD PTR DS:[EDX+78]<br />
6F088E7B   POP ESI<br />
6F088E7C   POP EBX<br />
6F088E7D   RETN<br />
</span></code></p>
<p>Logo no fim dessa função podemos ver o endereço de onde o valor de EAX está vindo, então finalmente, ai está o maldito endereço do gold. Mas porque nós não tinhamos achado ele no início? Porque o valor está com um zero a mais (gold 500, valor 5000) ai os bytes que a gente procurou são inúteis. Agora para brincar escreva no endereço EDX+78 o quanto de gold você quer ter :).</p>
<p><a href="http://scarvenger.files.wordpress.com/2008/05/victory.jpg"><img class="alignnone size-thumbnail wp-image-40" src="http://scarvenger.files.wordpress.com/2008/05/victory.jpg?w=127&h=76" alt="" width="127" height="76" /></a></p>
<p>Agora este endereço entra no problema da memória alocada dinâmicamente que expliquei em <a href="http://scarvenger.wordpress.com/2008/05/12/descobrindo-endereco-de-memoria-alocada-dinamicamente/">outro post</a> (cada vez que o processo war3.exe for reiniciado esse endereço será outro), deixarei a criação do &#8220;trainer&#8221; (programa externo que modifica a memória de outro processo) de tema de casa, só vou dar uma dica: Win32 ReadProcessMemory/WriteProcessMemory. Não se iluda, o calculo da memória &#8220;fixa&#8221; vai ser bem mais complicado do que o que eu descrevi no post pois envolve vários ponteiros e estruturas, mas todos têm condições de fazê-lo.</p>
<p>Até o próximo post, aceito sugestões :).</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/scarvenger.wordpress.com/39/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/scarvenger.wordpress.com/39/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scarvenger.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scarvenger.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scarvenger.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scarvenger.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scarvenger.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scarvenger.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scarvenger.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scarvenger.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scarvenger.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scarvenger.wordpress.com/39/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=39&subd=scarvenger&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://scarvenger.wordpress.com/2008/05/13/reversing-wacraft-3-frozen-throne/feed/</wfw:commentRss>
	
		<media:content url="http://scarvenger.files.wordpress.com/2008/05/victory.jpg?w=127" medium="image" />
	</item>
		<item>
		<title>Descobrindo endereço de memória alocada dinâmicamente.</title>
		<link>http://scarvenger.wordpress.com/2008/05/12/descobrindo-endereco-de-memoria-alocada-dinamicamente/</link>
		<comments>http://scarvenger.wordpress.com/2008/05/12/descobrindo-endereco-de-memoria-alocada-dinamicamente/#comments</comments>
		<pubDate>Mon, 12 May 2008 07:18:31 +0000</pubDate>
		<dc:creator>scarvenger</dc:creator>
		
		<category><![CDATA[Assembly]]></category>

		<category><![CDATA[Debugging]]></category>

		<category><![CDATA[Engenharia Reversa]]></category>

		<category><![CDATA[Win32]]></category>

		<category><![CDATA[ollydbg]]></category>

		<guid isPermaLink="false">http://scarvenger.wordpress.com/?p=33</guid>
		<description><![CDATA[Na criação de trainers para jogos é comum nos depararmos com alguns valores sendo alocados dinâmicamente, isto pode gerar alguns empecilhos que podem ser ultrapassados, aqui vou dizer como.
Conhecimentos necessários: Assembly e Debugging.
Debugger utilizado: OllyDbg.

Memória dinâmica
Memória dinâmica é a memória alocada no heap de um programa, que foi alocada pelo sistema operacional. Ela pode ser [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Na criação de trainers para jogos é comum nos depararmos com alguns valores sendo alocados dinâmicamente, isto pode gerar alguns empecilhos que podem ser ultrapassados, aqui vou dizer como.</p>
<p>Conhecimentos necessários: Assembly e Debugging.</p>
<p>Debugger utilizado: OllyDbg.</p>
<p><span id="more-33"></span></p>
<p><strong>Memória dinâmica</strong></p>
<p>Memória dinâmica é a memória alocada no heap de um programa, que foi alocada pelo sistema operacional. Ela pode ser um empecilho pois, para programar os trainers nós necessitamos de um endereço fixo para ser lido e/ou escrito (os pontos em um jogo por exemplo). Em um programa escrito em C++ podemos alocar a memória dinâmicamente com a seguinte construção:</p>
<p>int* dynamic = new int;</p>
<p><strong>Descobrindo o endereço fixo da memória dinâmica</strong></p>
<p>Quando usamos um new int[4] o sistema operacional &#8220;vasculha&#8221; por um lugar na memória que esteja disponível e retorna o endereço dessa memória, que no caso do nosso exemplo acima este endereço fica armazenado no ponteiro com o nome dynamic. No caso o ponteiro para essa memória alocada é que tem endereço fixo, então descobrindo o endereço do ponteiro nós podemos ler o valor do mesmo e descobrir o endereço da memória dinâmica.</p>
<p><strong>Exemplo</strong></p>
<pre name="code" class="cpp">

#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;

class Jogo
{
public:
    volatile char m_dummy;
	volatile int* m_pontos;

	Jogo()
	{
        m_dummy   = &#039;a&#039;;
		m_pontos  = new int;
		*m_pontos = 57;
	}
	~Jogo()
	{
		delete m_pontos;
	}
};

Jogo jogo;

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, char* cmdParam, int cmdShow)
{
	char points[10];

	wsprintf(points, &quot;%d&quot;, *(jogo.m_pontos));

	::MessageBox(0, points, &quot;Meu jogo&quot;, MB_ICONEXCLAMATION | MB_OK);
    ::MessageBox(0, points, &quot;Meu jogo&quot;, MB_ICONEXCLAMATION | MB_OK);
}
</pre>
<p>Após compilar este programa vamos carrega-lo com o OllyDbg e botar um breakpoint na chamada da função wsprintf,  e executar o programa o que vai nos deparar com o seguinte código:</p>
<p><code><span style="color:#808080;">LEA EAX,DWORD PTR DS:[373370]<br />
MOV ECX,DWORD PTR DS:[EAX+4]<br />
MOV EDX,DWORD PTR DS:[ECX]<br />
PUSH ESI<br />
PUSH EDX<br />
LEA EAX,DWORD PTR SS:[ESP+C]<br />
PUSH OFFSET Examples.??_C@_02DPKJAMEF@?$&gt;<br />
CALL DWORD PTR DS:[&lt;&amp;USER32.wsprintfA&gt;]</span></code></p>
<p>Esse é o código que lê a variável m_points e passsa o seu valor para a função wsprint. Logo na primeira linha podemos ver:</p>
<p><code><span style="color:#808080;">LEA EAX,DWORD PTR DS:[373370]</span></code></p>
<p>Que faz com que EAX aponte para a variável global jogo.</p>
<p><code><span style="color:#808080;">MOV ECX,DWORD PTR DS:[EAX+4]</span><span style="color:#808080;"><br />
</span> <span style="color:#808080;"> MOV EDX,DWORD PTR DS:[ECX]</span><br />
</code><br />
A primeira linha lê o ponteiro que está em EAX+4 e o copia para ECX, e a segunda pega o valor que o ponteiro ECX está apontando e salva o seu valor em EDX, simplificando, ECX fica com o endereço de m_pontos e EDX com o seu valor.</p>
<p>Para ler o m_pontos neste programa só seria necessário ler a memória no endereço 0&#215;373374 (que é fixo), pegar o valor lido (que será o endereço da varável m_pontos, que foi escolhido dinâmicamente) e ler no seu endereço.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/scarvenger.wordpress.com/33/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/scarvenger.wordpress.com/33/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scarvenger.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scarvenger.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scarvenger.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scarvenger.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scarvenger.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scarvenger.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scarvenger.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scarvenger.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scarvenger.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scarvenger.wordpress.com/33/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=33&subd=scarvenger&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://scarvenger.wordpress.com/2008/05/12/descobrindo-endereco-de-memoria-alocada-dinamicamente/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gotcha 0.1a Lançado</title>
		<link>http://scarvenger.wordpress.com/2008/05/12/gotcha-01a-lancado/</link>
		<comments>http://scarvenger.wordpress.com/2008/05/12/gotcha-01a-lancado/#comments</comments>
		<pubDate>Mon, 12 May 2008 06:00:24 +0000</pubDate>
		<dc:creator>scarvenger</dc:creator>
		
		<category><![CDATA[Gotcha]]></category>

		<category><![CDATA[campus party]]></category>

		<category><![CDATA[minority report]]></category>

		<guid isPermaLink="false">http://scarvenger.wordpress.com/?p=35</guid>
		<description><![CDATA[Depois de alguns meses sem postar, felizmente anuncio a minha volta junto com uma novidade: Gotcha 0.1a foi lançado.

Modificações:
* Arquitetura Cliente/Servidor para aplicações cliente e fontes de input.
Mas o que tem de tão bom assim nessa arquitetura nova?
- Ela permite abstrair as fontes de input de modo que se uma aplicação foi construída em cima [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Depois de alguns meses sem postar, felizmente anuncio a minha volta junto com uma novidade: Gotcha 0.1a foi lançado.</p>
<p><span id="more-35"></span></p>
<p><strong>Modificações:</strong></p>
<p>* Arquitetura Cliente/Servidor para aplicações cliente e fontes de input.</p>
<p>Mas o que tem de tão bom assim nessa arquitetura nova?</p>
<p>- Ela permite abstrair as fontes de input de modo que se uma aplicação foi construída em cima do Gotcha e de repente o usuário escolher usar a webcam como input ao invés de um wiimote essa alteração será refletida automaticamente na aplicação sem mesmo precisar reiniciar ela.</p>
<p>- Pode-se usar um computador como fonte de input (ligar um sensor nele) e distribuir essa informação para vários outros computadores que não têm o sensor.</p>
<p>- Na arquitetura antiga, se muitas aplicações usassem o wiimote como fonte iriamos perceber uma perda de performance considerável, algo que a nova arquitetura evita.</p>
<p>- Integração com outras linguagens fica muito mais fácil, pois qualquer linguagem que tenha acesso ao protocolo TCP pode se comunicar com o Gotcha.</p>
<p>O link para download do source está <a href="http://sourceforge.net/project/showfiles.php?group_id=225646">aqui</a>.</p>
<p><strong>GotchaDrivers:</strong> contêm todas as fontes de input que o gotcha suporta (atualmente o wiimote e uma fonte de exemplo), deve ser iniciado após o servidor.</p>
<p><strong>GotchaMouseClient: </strong>Esse é o client que permite controlar o mouse, deve ser iniciado por ultimo.</p>
<p><strong>GotchaServer: </strong>Esse é o servidor do Gotcha, deve ser iniciado antes do cliente e do driver.</p>
<p><strong>Compilando</strong></p>
<p>O Gotcha possui as seguintes dependências:</p>
<p><a href="http://sourceforge.net/project/showfiles.php?group_id=7586&amp;package_id=8041&amp;release_id=587936">Boost 1.35.0.</a><br />
<a href="http://http://wiiyourself.gl.tter.org/">Wiiyourself.</a></p>
<p>Em breve disponibilizarei um Wiki com informações mais completas sobre o Gotcha.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/scarvenger.wordpress.com/35/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/scarvenger.wordpress.com/35/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scarvenger.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scarvenger.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scarvenger.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scarvenger.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scarvenger.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scarvenger.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scarvenger.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scarvenger.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scarvenger.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scarvenger.wordpress.com/35/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=35&subd=scarvenger&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://scarvenger.wordpress.com/2008/05/12/gotcha-01a-lancado/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Créditos do Gotcha</title>
		<link>http://scarvenger.wordpress.com/2008/02/23/creditos-do-gotcha/</link>
		<comments>http://scarvenger.wordpress.com/2008/02/23/creditos-do-gotcha/#comments</comments>
		<pubDate>Sat, 23 Feb 2008 16:40:10 +0000</pubDate>
		<dc:creator>scarvenger</dc:creator>
		
		<category><![CDATA[Gotcha]]></category>

		<guid isPermaLink="false">http://scarvenger.wordpress.com/?p=32</guid>
		<description><![CDATA[Muitas pessoas tem me reclamado quanto aos créditos do meu sistema, afinal, nunca uma idéia é feita completamente do zero, então meus créditos:

1) Ao roteirista do Minority Report pela incrível idéia de utilizar o  computador usando as mãos.
2) Ao website http://www.wiili.org/ (que aliás, merece grande parte dos créditos) por ter quebrado o protocolo do [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Muitas pessoas tem me reclamado quanto aos créditos do meu sistema, afinal, nunca uma idéia é feita completamente do zero, então meus créditos:</p>
<p><span id="more-32"></span></p>
<p><b>1)</b> Ao roteirista do Minority Report pela incrível idéia de utilizar o  computador usando as mãos.</p>
<p><b>2)</b> Ao website http://www.wiili.org/ (que aliás, merece grande parte dos créditos) por ter quebrado o protocolo do wiimote e disponibilizar links de bibliotecas de acesso ao mesmo. Eles também revelaram que realmente era possível fazer tracking de pontos IR a partir do wiimote sem problemas.</p>
<p><b>3)</b> À biblioteca WiiYourself (http://www.wiili.org/) que possibilitou o acesso aos dados do wiimote.</p>
<p><b>4)</b> Ao Jean Karpisnki pela idéia de criar o Multipointer.</p>
<p>Espero  que esse post tenha sido esclarecedor para muita gente.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/scarvenger.wordpress.com/32/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/scarvenger.wordpress.com/32/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scarvenger.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scarvenger.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scarvenger.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scarvenger.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scarvenger.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scarvenger.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scarvenger.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scarvenger.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scarvenger.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scarvenger.wordpress.com/32/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=32&subd=scarvenger&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://scarvenger.wordpress.com/2008/02/23/creditos-do-gotcha/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gotcha - Vídeo, Comparações e Futuro</title>
		<link>http://scarvenger.wordpress.com/2008/02/22/gotcha-video-comparacoes-e-futuro/</link>
		<comments>http://scarvenger.wordpress.com/2008/02/22/gotcha-video-comparacoes-e-futuro/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 03:42:38 +0000</pubDate>
		<dc:creator>scarvenger</dc:creator>
		
		<category><![CDATA[Gotcha]]></category>

		<guid isPermaLink="false">http://scarvenger.wordpress.com/?p=31</guid>
		<description><![CDATA[Há tempos eu estava sendo cobrado de um vídeo do sistema já que os da imprensa não dava para ver direito. Apesar de eu estar sem meus aparelhos (longe de casa) eu consegui fazer um vídeo do sistema. Aliás, já definimos o nome: Gotcha. Gostaram? hehe. Me desculpem se fiquei devendo os detalhes técnicos, assim [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Há tempos eu estava sendo cobrado de um vídeo do sistema já que os da imprensa não dava para ver direito. Apesar de eu estar sem meus aparelhos (longe de casa) eu consegui fazer um vídeo do sistema. Aliás, já definimos o nome: Gotcha. Gostaram? hehe. Me desculpem se fiquei devendo os detalhes técnicos, assim que eu tiver mais tempo eu posto eles.</p>
<p><span id="more-31"></span></p>
<p><b>Comparações:</b></p>
<p>Quanto às comparações técnicas relativas ao software do Johnny Lee eu já criei um post sobre isso e agora tenho o vídeo para provar que o meu sistema é diferente do dele, nós tivemos a idéia sem ver o vídeo dele e conseguimos um resultado diferente do dele. Me desculpem pela falta de som, é que como já falei estou sem meus aparelhos.</p>
<p><b>Vídeo:</b></p>
<p><span style="text-align:center; display: block;"><a href="http://scarvenger.wordpress.com/2008/02/22/gotcha-video-comparacoes-e-futuro/"><img src="http://img.youtube.com/vi/hU0Q2pSW3Fg/2.jpg" alt="" /></a></span></p>
<p><b>Futuro:</b></p>
<p>Qual o futuro do Gotcha? Primeiramente, vou desenvolver uma versão para o Linux, pretendo também tirar a dependência do wiimote e fazer uns últimos ajustes no sistema. Também pretendo fazer uma versão para usuários tetraplégicos e entre eles o meu sonho, criar um sistema para que o meu tio possa utilizar o computador, ele praticamente não possui nenhum movimento mas prometo que em breve verão ele utilizar um computador. Quanto à licença, planejo adotar uma que seja compatível com a filosofia open-source, aguardem.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/scarvenger.wordpress.com/31/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/scarvenger.wordpress.com/31/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scarvenger.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scarvenger.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scarvenger.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scarvenger.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scarvenger.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scarvenger.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scarvenger.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scarvenger.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scarvenger.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scarvenger.wordpress.com/31/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=31&subd=scarvenger&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://scarvenger.wordpress.com/2008/02/22/gotcha-video-comparacoes-e-futuro/feed/</wfw:commentRss>
	
		<media:content url="http://img.youtube.com/vi/hU0Q2pSW3Fg/2.jpg" medium="image" />
	</item>
		<item>
		<title>Johnny Lee</title>
		<link>http://scarvenger.wordpress.com/2008/02/18/johnny-lee/</link>
		<comments>http://scarvenger.wordpress.com/2008/02/18/johnny-lee/#comments</comments>
		<pubDate>Mon, 18 Feb 2008 17:02:46 +0000</pubDate>
		<dc:creator>scarvenger</dc:creator>
		
		<category><![CDATA[Gotcha]]></category>

		<guid isPermaLink="false">http://scarvenger.wordpress.com/?p=29</guid>
		<description><![CDATA[Muitas pessoas estão perguntando sobre a diferença do meu sistema ao do Johnny Lee apresentado no vídeo: http://br.youtube.com/watch?v=0awjPUkBXOU
Vejam o vídeo, é muito legal só que é importante esclarecer aqui: 

O nosso projeto não é um plágio. Ai está o porque:
* O cara gastou no mínimo uns 60 reais para fazer a matriz de leds dele, [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Muitas pessoas estão perguntando sobre a diferença do meu sistema ao do Johnny Lee apresentado no vídeo: http://br.youtube.com/watch?v=0awjPUkBXOU</p>
<p>Vejam o vídeo, é muito legal só que é importante esclarecer aqui: <b></b></p>
<p><span id="more-29"></span></p>
<p><b>O nosso projeto não é um plágio. Ai está o porque:</b></p>
<p>* O cara gastou no mínimo uns 60 reais para fazer a matriz de leds dele, uma técnica diferente da minha, na qual gastei no máximo 10 reais.<br />
* O papel reflexivo não é tão efetivo e sofre muita interferência de outras fontes infravermelhas no ambiente.<br />
* Ele não criou ponteiros múltiplos acima do sistema operacional, ele sequer criou algum ponteiro, ele somente indicou onde estavam as fontes infravermelhas.<br />
* Os pontos infravermelho dele não se distinguem um do outro, no nosso caso nós sabemos qual led corresponde a qual dedo.<br />
* Ele não criou um sistema de cliques. Ele interpreta como se qualquer ponto infravermelho fosse um clique (um clique no seu programa, não no sistema operacional). Então ou ele move livremente sua mão sem cliques ou ele fica sempre clicando sem mover suas mãos.<br />
* A pessoa tem que estar entre um intervalo de distância, na qual se ela fica perto, muitos pontos infravermelhos aparecem. Diferente do meu, que a pessoa pode ficar o quão perto ela quiser. Se o projeto do Johnny Lee fosse em um notebook como eu fiz, milhares de pontos infravermelhos surgiriam, e a pessoa não poderia ficar a uma distância agradável do computador, tendo que ficar muito longe.</p>
<p>Ele simplesmente não interagiu com o sistema operacional e nem com outros programas externos somente o seu software interpretou os dados.</p>
<p><b>Justamente o que inviável o projeto do Johnny Lee torna o meu viável</b> que é o fato da pessoa poder estar perto do computador.</p>
<p>Pelo que podem ver na minha apresentação eu joguei Warcraft 3 com o meu sistema algo que seria impossível com o sistema do Johnny Lee. Não desmereço o seu trabalho, que aliás, é muito bom, só que temos grandes diferenças que são importantes de serem ressaltadas. As diferenças técnicas dos dois projetos devem ser levadas em consideração, teste-os, e teça uma opinião sem se basear em artigos que não são de caráter técnico. Em breve postarei um vídeo no Youtube para ressaltar as diferenças.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/scarvenger.wordpress.com/29/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/scarvenger.wordpress.com/29/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scarvenger.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scarvenger.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scarvenger.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scarvenger.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scarvenger.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scarvenger.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scarvenger.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scarvenger.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scarvenger.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scarvenger.wordpress.com/29/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=29&subd=scarvenger&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://scarvenger.wordpress.com/2008/02/18/johnny-lee/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Campus Party 2008 - Minority Report</title>
		<link>http://scarvenger.wordpress.com/2008/02/17/campus-party-2008-minority-report/</link>
		<comments>http://scarvenger.wordpress.com/2008/02/17/campus-party-2008-minority-report/#comments</comments>
		<pubDate>Sun, 17 Feb 2008 07:40:59 +0000</pubDate>
		<dc:creator>scarvenger</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://scarvenger.wordpress.com/?p=28</guid>
		<description><![CDATA[Sinto muito se desviarei um pouco o foco técnico que o meu blog tem para divulgar o meu recente feito hehe.
Creio que todos que leiam este blog ja tenham ouvido falar da Campus Party, um evento que sempre acontecia na Espanha e foi, esse ano, realizado aqui no Brasil, que reúne um monte de nerd [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Sinto muito se desviarei um pouco o foco técnico que o meu blog tem para divulgar o meu recente feito hehe.</p>
<p>Creio que todos que leiam este blog ja tenham ouvido falar da Campus Party, um evento que sempre acontecia na Espanha e foi, esse ano, realizado aqui no Brasil, que reúne um monte de nerd durante uma semana. E eu fui :), na realidade, estou aqui neste exato momento. Quando fiquei sabendo da CP, eu pensei: &#8220;Bá, tenho que fazer alguma coisa legal para apresentar lá&#8221;. Neste momento eu estava visitando alguns sites e me deparei com um sobre a definição do protocolo do controle remoto do Nintendo Wii, o Wiimote, fiquei bem interessado e resolvi fazer um software que interagisse com o acelerômetro dele, e fiz, e levei pra CP.</p>
<p><span id="more-28"></span></p>
<p>Chegando lá, conheci um amigo do meu irmão, o Jean Karpinski, que já tinha uma palestra agendada sobre como usar o Wiimote no PC, basicamente ele tinha feito o mesmo que eu :P. Dai eu estava melhorando um pouco o meu software e tive a idéia de fazer algo estilo o Minority Report (aquele filme que tem uma cena na qual o personagem interage com o computador usando as mãos), ai falei para o Jean essa idéia, ele adorou, e perguntou: &#8220;Cara, acha que consegue fazer para sexta?&#8221;. &#8220;O Jean não me conhece&#8221;, pensei hehehe. Brincadeiras à parte, ai eu peguei, sentei e fiquei desenvolvendo, enquanto o Jean já ia agitando com a galera do modding, com os organizadores da CP que disseram que se eu conseguisse fazer eles me davam um espaço na programação de palestras.</p>
<p>Sexta, lá pelas 5:35 horas da manhã eu consegui com que o primeiro protótipo funcionasse, ai chamei o Jean, que chamou o assessor de imprensa da Campus Party que acabou dando uma ajuda com a parte da imprensa, foi uma manhã legal, ficamos até às 6:40 horas falando sobre o projeto.</p>
<p>Sábado, o dia da apresentação, eu já acordei com um frio na barriga, estava difícil esconder o nervosismo, não consegui comer nada o dia inteiro. Chegou a hora da palestra, eu não me contia de tanto nervosismo depois de ter passado o dia inteiro fazendo uns ajustes, quando eu comecei a falar quase tranquei hahaha. Para quem não estava na palestra, basicamente eu controlo o ponteiro do mouse utilizando as mãos, porém não só um ponteiro, eu criei um sistema que permite ter quantos ponteiros quiser na tela, bem loco hehe. Mas depois da palestra meus amigos disseram que nem deu pra notar que eu estava nervoso, tirando o fato de que eu estava tremendo muito na hora, o ponteiro do mouse não parava, já que era controlado pela minha mão hehe.</p>
<p>Bá mas parece que o pessoal gostou, eu vou postar mais sobre o projeto que eu pretendo continuar, assim que for se definindo o futuro dele eu atualizo vocês.</p>
<p>Agora tenho que ir dormir, e prometo a vocês que em breve escrevei muitos posts, tenho bastante assuntos interessantes, é só achar tempo para escrever.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/scarvenger.wordpress.com/28/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/scarvenger.wordpress.com/28/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scarvenger.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scarvenger.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scarvenger.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scarvenger.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scarvenger.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scarvenger.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scarvenger.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scarvenger.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scarvenger.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scarvenger.wordpress.com/28/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=28&subd=scarvenger&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://scarvenger.wordpress.com/2008/02/17/campus-party-2008-minority-report/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Otimizando o corretor ortográfico (Java)</title>
		<link>http://scarvenger.wordpress.com/2008/01/14/otimizando-o-corretor-ortografico-java/</link>
		<comments>http://scarvenger.wordpress.com/2008/01/14/otimizando-o-corretor-ortografico-java/#comments</comments>
		<pubDate>Mon, 14 Jan 2008 03:13:06 +0000</pubDate>
		<dc:creator>scarvenger</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://scarvenger.wordpress.com/2008/01/14/otimizando-o-corretor-ortografico-java/</guid>
		<description><![CDATA[Bom, pedi à Rael Cunha a autorização para &#8220;tunar&#8221; o seu código do corretor ortográfico em Java para tentar aproximá-lo o máximo possível da performance do corretor em C++.
Vamos começar com o código presente em seu website:



import java.io.*;
import java.util.*;
import java.util.regex.*;
class Spelling {
     private final HashMap&#60;String, Integer&#62; nWords = new HashMap&#60;String, Integer&#62;();
 [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Bom, pedi à <a href="http://www.raelcunha.com">Rael Cunha</a> a autorização para &#8220;tunar&#8221; o seu <a href="http://www.raelcunha.com/spell-correct.php">código do corretor ortográfico em Java</a> para tentar aproximá-lo o máximo possível da performance do corretor em C++.</p>
<p>Vamos começar com o código presente em seu website:</p>
<p><span id="more-27"></span></p>
<pre name="code" class="java">

import java.io.*;
import java.util.*;
import java.util.regex.*;
class Spelling {
     private final HashMap&lt;String, Integer&gt; nWords = new HashMap&lt;String, Integer&gt;();
     public Spelling(String file) throws IOException {
          BufferedReader in = new BufferedReader(new FileReader(file));
       	  String temp = null;
 	  Pattern p = Pattern.compile(&quot;\\w+&quot;);
 	  while((temp = in.readLine()) != null) {
 	       Matcher m = p.matcher(temp.toLowerCase());
 	       while(m.find()) nWords.put((temp = m.group()), nWords.containsKey(temp) ? nWords.get(temp) + 1 : 1);
 	  }
 	  in.close();
     }
     private final ArrayList&lt;String&gt; edits(String word) {
          ArrayList&lt;String&gt; result = new ArrayList&lt;String&gt;();
 	  for(int i=0; i &lt; word.length(); ++i) result.add(word.substring(0, i) + word.substring(i+1));
 	  for(int i=0; i &lt; word.length()-1; ++i) result.add(word.substring(0, i) + word.substring(i+1, i+2) + word.substring(i, i+1) + word.substring(i+2));
 	  for(int i=0; i &lt; word.length(); ++i) for(char c=&#039;a&#039;; c &lt;= &#039;z&#039;; ++c) result.add(word.substring(0, i) + String.valueOf(c) + word.substring(i+1));
 	  for(int i=0; i &lt;= word.length(); ++i) for(char c=&#039;a&#039;; c &lt;= &#039;z&#039;; ++c) result.add(word.substring(0, i) + String.valueOf(c) + word.substring(i));
 	  return result;
     }
     public final String correct(String word) {
          if(nWords.containsKey(word)) return word;
          ArrayList&lt;String&gt; list = edits(word);
          HashMap&lt;Integer, String&gt; candidates = new HashMap&lt;Integer, String&gt;();
 	  for(String s : list) if(nWords.containsKey(s)) candidates.put(nWords.get(s),s);
 	  if(candidates.size() &gt; 0) return candidates.get(Collections.max(candidates.keySet()));
 	  candidates.clear();
 	  for(String s : list) for(String w : edits(s)) if(nWords.containsKey(w)) candidates.put(nWords.get(w),w);
 	  return candidates.size() &gt; 0 ? candidates.get(Collections.max(candidates.keySet())) : word;
     }
     public static void main(String args[]) throws IOException {
          if(args.length &gt; 0) System.out.println((new Spelling(&quot;big.txt&quot;)).correct(args[0]));
     }
}
</pre>
<p>Após um benchmark pude observar que a parte que consome o maior tempo de execução é a inicialização do corretor, então é esse o nosso principal alvo de otimização. Mas o que vamos otimizar exatamente? Neste mesmo benchmark pude ver que as rotinas que consomem maior tempo de execução são:</p>
<p>* java.util.regex.Matcher.find()<br />
* java.lang.String.toLowerCase()</p>
<p>Então vamos nos concentrar nessas rotinas. Já que nosso objetivo não é otimizar as bibliotecas java.* temos de achar alternativas mais rápidas do que as que estamos usando, então vamo começar pela substituição da biblioteca java.util.regex.<strong></strong></p>
<p><strong>Substituições:</strong><strong> - Expressões Regulares:</strong></p>
<p>As expressões regulares internamente realizam muitas computações, o que é desnecessário para a nossa causa já que temos de procurar por algo simples (palavras) dentro de uma string. O que faremos então? Vamos utilizar um loop clássico para determinar as palavras.</p>
<p>Primeiro, escaneamos a string para achar qualquer caractere que seja igual a alguma letra que desejamos, no nosso caso todos os caracteres alfabéticos &#8220;[a-z]&#8220;. Quando o acharmos, estaremos no início de uma palavra. Agora para achar o seu final procuramos por qualquer caractere que <strong>não</strong> seja alfabético, porém já que são muitos esses caracteres, isso resultaria em muita computação, teríamos que comparar cada caractere com todos os caracteres indesejados e ver se ele é um deles. A melhor saída é &#8220;filtrar&#8221; previamente os caracteres indesejados e estabelecer um separador entre eles.</p>
<p><strong>- Rotina toLowerCase():</strong></p>
<p>Sinceramente, alguém ja viu o código deste método? É de meter medo hehe. E já que estamos percorrendo a cadeia de caracteres inteira mesmo, podemos fazer um toLowerCase em caracteres individuais, assim podemos evitar múltiplas passagens na cadeia de caracteres.</p>
<p>Após otimizado o código ficou assim:</p>
<pre name="code" class="java">

public Spelling(String file) throws IOException {
     BufferedReader in = new BufferedReader(new FileReader(file));
     String temp = null;
     while ((temp = in.readLine()) != null) {
          //converter a string para um array de char
          char[] letters  = temp.toCharArray();
          int end   = letters.length;
          int begin = 0;
          //converter caracteres upper case em lower case e transformar em delimitador todos caracteres indesejados&lt;br /&gt;
          for (int i = 0; i &lt; end;i++) {
               char letter = letters[i];
               if      (&#039;a&#039; &lt;= letter &amp;&amp; letter &lt;= &#039;z&#039; ) letters[i] = letter;
               else if (&#039;A&#039; &lt;= letter &amp;&amp; letter &lt;= &#039;Z&#039; ) letters[i] = Character.toLowerCase(letter);
               else letters[i] = &#039;-&#039;;
          }
          //atualizar a string com os novos caracteres
          temp = new String(letters);
          for (int index = 0;index &lt; end;index++) {
               //procurar pelo inicio da palavra
               while (letters[index] == &#039;-&#039; &amp;&amp; index &lt; (end-1)) index++;
               begin = index;
               //procurar pelo fim da palavra
               while (letters[index] != &#039;-&#039; &amp;&amp; index &lt; (end-1)) index++;
               String word = temp.substring(begin, index);
               nWords.put(word, nWords.containsKey(word) ? nWords.get(word) + 1 : 1);
          }
     }
     in.close();
}
</pre>
<p>Observem que no código a maioria do processamento foi feito com uma cadeia de caracteres já que além de ser mais rápido o acesso a caracteres individuais, um objeto String em Java é imútavel, ou seja, cada alteração que fizermos nele um novo objeto String é criado, o que não ocorre na cadeia de caracteres. Essa otimização resultou em um acréscimo considerável na performance do corretor passando o tempo de execução de 0.983s para 0.734s, ocorrendo uma melhoria de 25,3%. Certo, após essas melhorias eu ainda não estava satisfeito com o acréscimo de 25,3% de performance, então peguei o meu profiler e vi que agora os métodos do HashMap são os que ocupam maior tempo de execução, que estão presentes no construtor apenas nesta linha:</p>
<pre name="code" class="java">

nWords.put(word, nWords.containsKey(word) ? nWords.get(word) + 1 : 1);
</pre>
<p>Pelo o que podemos constatar o próprio HashMap::get já pode fazer o serviço de constatar se uma key existe ou não então vamos usá-lo:</p>
<pre name="code" class="java">

public Spelling(String file) throws IOException {
     BufferedReader in = new BufferedReader(new FileReader(file));
     String temp = null;
     while ((temp = in.readLine()) != null) {
          //converter a string para um array de char
          char[] letters  = temp.toCharArray();
          int end   = letters.length;
          int begin = 0;
          //converter caracteres upper case em lower case e transformar em delimitador todos caracteres indesejados&lt;br /&gt;
          for (int i = 0; i &lt; end;i++) {
               char letter = letters[i];
                if      (&#039;a&#039; &lt;= letter &amp;&amp; letter &lt;= &#039;z&#039; ) letters[i] = letter;
                else if (&#039;A&#039; &lt;= letter &amp;&amp; letter &lt;= &#039;Z&#039; ) letters[i] = Character.toLowerCase(letter);
                else letters[i] = &#039;-&#039;;
           }
           //atualizar a string com os novos caracteres
           temp = new String(letters);
           for (int index = 0;index &lt; end;index++) {
                //procurar pelo inicio da palavra
                while (letters[index] == &#039;-&#039; &amp;&amp; index &lt; (end-1)) index++;
                begin = index;
                //procurar pelo fim da palavra
                while (letters[index] != &#039;-&#039; &amp;&amp; index &lt; (end-1)) index++;
               String  word  = temp.substring(begin, index);
               Integer value = nWords.get(word);
               if (value == null) value = 0;
               nWords.put(word, value + 1);
          }
     }
     in.close();
}
</pre>
<p>Após a utilização do código citado acima, podemos constatar uma melhoria de 52,87% na performance do corretor ortográfico, algo já bem consideravel.Espero que tenham gostado (comentários são bem vindos, nem que seja só um oi para eu saber que não estou jogado às traças hehe).</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/scarvenger.wordpress.com/27/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/scarvenger.wordpress.com/27/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scarvenger.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scarvenger.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scarvenger.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scarvenger.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scarvenger.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scarvenger.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scarvenger.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scarvenger.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scarvenger.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scarvenger.wordpress.com/27/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=27&subd=scarvenger&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://scarvenger.wordpress.com/2008/01/14/otimizando-o-corretor-ortografico-java/feed/</wfw:commentRss>
		</item>
		<item>
		<title>C++0x</title>
		<link>http://scarvenger.wordpress.com/2007/12/24/c0x/</link>
		<comments>http://scarvenger.wordpress.com/2007/12/24/c0x/#comments</comments>
		<pubDate>Mon, 24 Dec 2007 19:32:19 +0000</pubDate>
		<dc:creator>scarvenger</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://scarvenger.wordpress.com/2007/12/24/c0x/</guid>
		<description><![CDATA[Opa pessoal, ultimamente andei pesquisando sobre o novo padrão do C++, o C++0x e fiquei bem feliz com as suas propostas, recomendo a leitura do artigo sobre C++0x no Wikipedia. E algumas de suas novas funções já podem ser encontradas no G++. Sinceramente, fiquei muito empolgado com as propostas, sendo que algumas eu já esperava [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Opa pessoal, ultimamente andei pesquisando sobre o novo padrão do C++, o C++0x e fiquei bem feliz com as suas propostas, recomendo a leitura do artigo sobre <a href="http://en.wikipedia.org/wiki/C%2B%2B0x" target="_blank">C++0x no Wikipedia</a>. E algumas de suas novas funções já podem ser encontradas no <a href="http://gcc.gnu.org/" target="_blank">G++</a>. Sinceramente, fiquei muito empolgado com as propostas, sendo que algumas eu já esperava à muito tempo, este novo padrão fará essa linguagem poderosa ficar ainda mais poderosa.  Aproveitem :).</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/scarvenger.wordpress.com/24/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/scarvenger.wordpress.com/24/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scarvenger.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scarvenger.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scarvenger.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scarvenger.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scarvenger.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scarvenger.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scarvenger.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scarvenger.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scarvenger.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scarvenger.wordpress.com/24/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=24&subd=scarvenger&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://scarvenger.wordpress.com/2007/12/24/c0x/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>