Sie sind auf Seite 1von 22

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

10.237.932 membros (62421 online)

Entre
Email
Senha

Join

Entre
Esqueceu sua senha?

Entre usando

casa
artigos
ajudar

respostas rpidas

discusses

recursos

comunidade

Artigos Idiomas C / C + + Language Utilitrios

Artigo
Navegar Cdigo
Stats

Prximo

A Beginners Guide to Codecaves

Sobre o artigo

Por Drew_Benton 27 Ago 2007

Baixar projeto de demonstrao - 120,9 KB

Este um guia completo


para iniciantes codecaves
que cobre os principais
tpicos: o que um
codecave , o que um
codecave pode ser usado
para, e como usar um
codecave.

Download de arquivos de origem - 14,4 KB

Tipo

Inscreva-se para votar

Revises

4.98 (113 votos)


Like

Alternativas
Comentrios &
Discusses (53)

Search for articles, questions, tips

11

Tweetar

Artigo

Licence

CPOL

Primeiro
Postado

27 de agosto de 2007

Visualizaes 129898
De
downloads

1484

Favoritos

197 vezes

VC6

VC7

VC7.1

VC8.0
Win2K

WinXP

VS.NET2003 , +

Top Notcias
Microsoft ainda fontes
abertas mais tecnologias
do que muitos pensam
Seja o Insider Notcias libertar
todas as manhs.

Contedo

Vdeos
Relacionados

Introduo
Teoria
Atributos Codecave
Atributo 1: Codecave Localizao
Localizao Fsica
Lgico Localizao

1 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

Atributo 2: Codecave Entrada e Sada


Mtodo JMP
Chamada de mtodo
Atributo 3: Codecave Stack / Registo Modificao
PUSH / POP
PUSHAD / POPAD
PUSHFD / POPFD
Armazenamento temporrio
Aplicao
Ferramentas
Tsearch
OllyDbg
Visual C + +
Processo de Trabalho
Passo 1: Encontrar um Propsito
Passo 2: Escrevendo o Codecave
Passo 3: Juntando tudo
Concluso

Introduo
A "code-qu"? A menos que voc passou algum tempo trabalhando na rea de engenharia
reversa, as chances so que voc no tenha ouvido falar do termo "codecave" antes. Se voc j
ouviu falar dela, talvez voc no tenha lido uma definio clara do mesmo ou entendo muito bem
o que ou por que ele til. Eu at perguntei programadores experientes montagem sobre o
termo antes ea maioria deles no tinha ouvido falar dele. Se novo para voc, no se preocupe,
voc no o nico. um termo que pouco usado e s til em um contexto de engenharia
reversa. Alm disso, "codecave" ou "cdigo de caverna"? Eu no estou muito certo, mas vou
tentar o meu melhor para se referir a ele de forma consistente como um "codecave". Um espao
pode esgueirar-se l de vez em quando.
Se voc procurar por a na internet, voc no vai encontrar muito sobre o tema da codecaves. Se
voc fizer isso, a maior parte dos recursos so encontrados em sites "obscuros". verdade que
codecaves tm um lugar importante e til no mundo subterrneo de hacking, mas eles podem ser
usados por razes legtimas, bem como (como com qualquer coisa relacionada com a
programao que pode ser usada para o bem ou ruim). Independentemente disso, codecaves so
apenas mais uma ferramenta de um programador ou fazer engenharia reversa pode usar para
melhorar suas habilidades e ferramentas. Voc no pode ter um uso imediato para ele agora, mas
talvez um dia voc vai e voc ser feliz que voc sabe como usar o conceito.
O objetivo deste artigo fornecer um guia completo para a compreenso e utilizao codecaves.
At o final deste artigo, voc vai saber o que um codecave , o que til, e como us-lo. Alm
disso, voc ser exposto a um exemplo prtico para reforar o que voc aprendeu, para que voc
possa ver o conceito em ao. Este artigo escrito como um guia para todos os nveis de
especializao, mesmo os iniciantes, mas presume-se que voc tenha algum conhecimento
bsico de C / C + +, Assembly, e engenharia reversa conceitos. Enquanto voc l ao longo do
artigo, voc pode querer pesquisar na net para material de referncia adicional, se algo no est
muito claro.
Este artigo dividido em quatro sees principais, com vrias subsees. A "Introduo", o que
voc est lendo agora, ir configurar o artigo e cobrir o que este artigo sobre o que voc venha
a aprender. A "Teoria" vai discutir a teoria da codecaves em relao ao que eles so e como eles
so usados. A "Aplicao" mostrar a seo "Teoria" em ao com um exemplo completo de
utilizao codecaves para realizar uma determinada tarefa. Por ltimo, mas no menos
importante, a "Concluso" rapidamente recapitular o que o artigo tem discutido e apresentar
palavras de despedida.

Os artigos
relacionados
Novato Walk Desenvolvimento Web
Recordes em Solitaire: uma
abordagem mais avanada
Lista de livros de programao
disponveis gratuitamente
Guia do Iniciante para cookies
ASP.NET
Como anexar ao Browser
Helper Object (BHO) com C #
em dois minutos
COM na plancie C
InfoPath GUID Updator
O idiota completo guia para
escrever Shell Extensions Index
Detectando Atualizar ou
PostBack no ASP.NET
Guia para Win32 Pintura para
iniciantes
BHO Desenvolvimento usando
cdigo gerenciado
Detectar e reconhecer rostos
usando OpenCV para iniciantes
- Passo a Passo
Projeto Renomear - Renomear
um projeto existente Visual
Studio
AdventureWorks.WPF (Parte 1)
Gerador de grfico simples
Coluna
Um guia para iniciantes
Modelos - Parte 2
DRY-o o seu cdigo com
delegados
Um Guia de Idiotas para Really
Really Bad Programao
CBSTRStream - Uma
implementao simples fluxo
BSTR
Criar uma nova lista no
SharePoint Services em tempo
de execuo

Pesquisas
relacionadas

Agora que as coisas chatas fora do caminho, hora de comear!

Teoria
A codecave pode ser melhor definida como "um redirecionamento da execuo do programa para
outro local e, em seguida, retornar de volta para a rea onde a execuo do programa havia
deixado anteriormente." Em certo sentido, um codecave no diferente no conceito do que uma
chamada de funo, com exceo de algumas pequenas diferenas. Se um codecave e uma
chamada de funo so to semelhantes, por que precisamos de codecaves em tudo, ento? A
razo pela qual ns precisamos codecaves porque o cdigo fonte raramente disponvel para
modificar qualquer programa. Como resultado, temos que fisicamente (ou virtualmente) modificar
o executvel em um nvel de montagem para fazer alteraes.

2 de 22

Como proteger o seu software


para o Mobile Apps Mercado
em os EUA e Canad

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

Neste ponto, alguns alarmes e assobios pode estar acontecendo fora por alguns leitores. Que
razo legtima que ns nunca temos que faz-lo, modificar um programa existente para o qual
nenhuma fonte est disponvel? Considere o seguinte hipottico, mas no improvvel, cenrio:
Uma empresa que tem vindo a utilizar o mesmo sistema de software que
desenvolveu nos ltimos 10 anos. O sistema de software que esto usando tem
servido bem, mas hora de atualiz-lo para refletir uma mudana obrigatria no
formato de dados de sada. O nico problema que os programadores originais
esto muito longe e no h esperana de obter o cdigo-fonte original para atualizar
o programa. Agora, a empresa tem treinado agora funcionrios veteranos e cresceu
nos ltimos 10 anos usando este sistema de software especfico, para uma reescrita
completa seria muito desastroso para a empresa. Reciclagem todos os seus
empregados para um novo sistema e ter que reprogramar as coisas de forma
diferente no apenas demorado, mas muito caro. Levaria cerca de um ano para
fazer tal e isso fora do perodo de tempo que a empresa tem. A pior parte de tudo
isso que voc o programador que foi contratado para resolver este problema.

Proteja seu App Android: Por


que os desenvolvedores devem
alavancar Certificados de
Assinatura de Cdigo de
seguros

Voc poderia simplesmente jogar as mos para cima e dizer que no possvel, mas que no iria
fazer muito para ajudar a sua carreira profissional. Em vez disso, imagine se houvesse uma
maneira que voc pode continuar usando o mesmo programa, mas voc tem uma DLL adicional
que usado para atualizar dinamicamente os dados do programa da empresa de sada para que
ele se encaixa no novo padro que exigido. O melhor de tudo, uma soluo que pode ser
implementada bem antes de seu prazo e requer alteraes mnimas a serem feitas aos
procedimentos existentes da empresa de usar o programa. Digite codecaves.
Agora que temos uma definio de codecaves e um propsito a respeito de porque podemos
precisar de um, hora de uma apresentao visual deste conceito. Considere a seguinte imagem
como fluxo normal do programa:

Na imagem de cima, a execuo flui atravs dos trs pontos marcados A, B, e C, respectivamente
nessa ordem. Os pontos A, B e C so apenas as determinadas reas de cdigo, pois eles podem
ser uma linha de cdigo de montagem ou vrias linhas de cdigo de montagem. O ponto (sem
trocadilhos), a execuo passa por todos eles, em algum ponto no tempo. Se fssemos codecave
ponto B, que iria acabar com a seguinte imagem:

Nesta imagem, a execuo passa primeiro atravs de um como de costume. No entanto, ele
ento direcionado para a codecave, que, em seguida, executa no lugar do ponto B. Depois que a
execuo competiram, a execuo do programa redirecionado para depois B e continua
atravs de C. Se voc olhar atentamente para a foto, pode ser um pouco vago a respeito de onde
o codecave em relao ao programa. Isto feito intencionalmente apenas para mostrar o
conceito de em primeiro lugar, por conseguinte, so usados pontos de referncia A, B e C e de
cdigo nada relacionado mostrado. Felizmente, o conceito do que um codecave realmente
faz mais sentido agora.

3 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

Atributos Codecave
Agora que entendemos o que um codecave um pouco melhor, podemos passar para os
diferentes atributos de codecaves que voc precisa para estar familiarizado. Vou discutir trs
atributos principais que precisamos estar cientes e compreender antes de podermos us-los. O
primeiro a localizao codecave, ou mais simplesmente, onde o codecave implementado. O
segundo a entrada e pontos de sada codecave, que se refere forma como obtemos a partir
do EXE na codecave bem como do codecave volta para o EXE no local adequado. O atributo final
a pilha codecave e registrar a modificao, que discute as diferentes lgicas que podemos usar
para ter certeza de que no modifique a pilha e registradores final no codecave.

Atributo 1: Codecave Localizao


O primeiro atributo a localizao de um codecave. Este atributo de um codecave descreve onde
o codecave implementado. Existem duas partes para este atributo, uma descrio geral local e
uma descrio especfica local.
Localizao Fsica
Desde codecaves deve estar no espao de processo do aplicativo, h duas possibilidades, no
EXE ou em uma DLL carregada. Quando um codecave no EXE, geralmente codificada
embutido. Isto significa simplesmente o codecave colocado em algum lugar uma poro no
utilizada do EXE que est vazio ou no utilizado em um bsico regulares, como cdigo de
manipulao de exceo. Aqui um exemplo de um codecave que est contida no prprio
programa:

Nesta imagem, a execuo nunca deixa o mdulo do programa para a execuo do codecave. O
codecave colocado em alguma rea do EXE marcado "T" que assumida para ser adequado
para uma codecave. Existem vrias vantagens e desvantagens para esta abordagem. As
vantagens so que muito rpido para implementar, eficiente e fcil de testar e distribuir. As
desvantagens so que voc deve modificar o prprio EXE, no flexvel, e voc deve codificar
em assemblia. Vamos dar uma olhada com cuidado cada conjunto de vantagens e desvantagens
agora.

Vantagens
Rpido de implementar - Esta vantagem vem do fato de que h disassemblers que esto
livremente disponveis que lhe permitem modificar um programa e salvar as alteraes
imediatamente (como OllyDbg ). Com esta abordagem, voc pode localizar um local
adequado no EXE para o codecave, faa as alteraes necessrias para implementar a
codecave (ainda no discutido neste artigo), e salvar o EXE final.
Eficiente - Ao colocar o codecave no EXE, essa abordagem eficiente no sentido de que
voc no tem que carregar nada adicional no programa para implementar as alteraes.
Como resultado, isso leva desvantagem de flexibilidade, mas enquanto voc estiver
usando funes de base da API que as importaes de programa e no fazendo qualquer
lgica complicado, este ponto mantm-se.
Fcil de testar e distribuir - Desde que voc est modificando o prprio EXE e salv-lo,

4 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

voc pode aquec-la em um depurador e definir pontos de interrupo antes do codecave


executado para verificar se tudo est funcionando corretamente. Quando tudo est
funcionando bem, voc pode apenas distribuir o EXE e substituir o original. Voc poderia
talvez at mesmo escrever um patcher arquivo que corrige o EXE original para esta final,
que trabalha para reduzir o tamanho do arquivo distribudo.

Desvantagens
Modificao EXE - A primeira desvantagem vem do fato de que voc tem que modificar o
prprio EXE. Se houver qualquer verificao de arquivo fsico CRC no lugar, ento esta
abordagem ir exigir que os controlos que devem ser anuladas ou falsificados. H um
espao limitado em um EXE e pode no haver um lugar que grande o suficiente para que
voc coloque o seu codecave desejado em. difcil descobrir um lugar "seguro" para
substituir, por isso colocando um novo cdigo sobre idade pode levar a instabilidade futuro
programa.
No flexvel - Esta abordagem no flexvel, uma vez todas as atualizaes para o EXE
que so feitas exigir a codecave a ser atualizado em um novo EXE. Tambm no flexvel
no que diz respeito ao seguinte desvantagem.
Deve cdigo em linguagem assembly - Desde que voc est modificando o prprio EXE,
voc deve implementar todo o seu cdigo em linguagem assembly. Isto pode ou no pode
ser uma desvantagem para voc, dependendo do que voc precisa fazer, mas para a maior
parte, este um grande problema, j que cdigo de linguagem de montagem ocupa um
pouco de espao.
Agora que sabemos o bsico para um codecave no EXE, podemos dar uma olhada na segunda
opo para o atributo localizao, e que est a implementar um codecave em uma DLL. Vou
enfatizar o fato de que codecaves deve estar no espao de processo do aplicativo, para que a
imagem visual de um codecave em uma DLL o mesmo que para um EXE. No entanto, aqui
est uma imagem dele apenas para ser completo:

Nesta imagem, a execuo do programa vai deixar o mdulo de programa para a execuo do
codecave. O codecave est localizado dentro de algum DLL carregada em alguma regio
marcada como "Z". As vantagens e desvantagens para a colocao de um codecave na DLL so
o inverso aos do EXE. As vantagens so que este mtodo muito flexvel e programvel numa
linguagem de alto nvel, e de natureza dinmica. As desvantagens so que preciso um pouco
mais de tempo para implementar, adiciona sobrecarga ao processo, e mais difcil de testar e
distribuir. Mais uma vez, vamos dar uma olhada em cada conjunto de vantagens e desvantagens.

Vantagens
Flexvel - Esta abordagem muito flexvel, pois qualquer cdigo que muda no EXE pode
ser facilmente atualizado no codecave dentro da DLL. Se os locais do local de onde o
codecave pertence mudana, que tambm facilmente atualizada pelo carregador de DLL
que usado para obter a DLL no processo. Consulte as desvantagens que resultam deste
efeito colateral tambm.
Programvel em linguagens de alto nvel - Desde o codecave agora est em uma DLL
que criamos, somos livres para codificar nossa DLL em uma linguagem de alto nvel, como
C / C + + / C + + CLI. Isso nos permite ter mais controle e implementar uma lgica mais

5 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

complicado do que possvel nos meios anteriores de colocar o codecave no prprio EXE.
Dinmica natureza - Uma vez que este mtodo no requer o EXE que ser mudado
fisicamente, podemos praticamente ativar e desativar os nossos codecaves se configurado
corretamente. Isto leva-nos a ser capaz de criar um "shot" codecaves que so executados
apenas uma vez e restaurar os bytes que uma vez que foram escritos para levar para a
prpria codecave. Devido a outras vantagens, condies mais complexas de execuo
pode ser implementada, assim como para permitir que codecaves para ser executado
apenas sob certas condies.

Desvantagens
Maior tempo de implementao - Um grande problema neste mtodo que voc primeiro
tem que desenvolver o seu codecave em uma DLL, em seguida, carregar a DLL para o
programa, e, finalmente, fazer o EXE redirecionar em seus codecaves. Se voc novo a
este tema, ficando a sua DLL "justo direito", de modo a codecave funciona como esperado
leva um pouco de tempo, mas uma vez que voc est acostumado, isso no vai ser to
grande de uma desvantagem.
Sobrecarga adicional - Esta uma desvantagem bvia, mas ainda importante mencionar.
Desde que voc est carregando uma DLL adicional para o programa e executar mais de
cdigo do que havia antes, voc pode prejudicar o desempenho se voc no implementar
corretamente a sua lgica. Para a maior parte, voc vai ter um impacto insignificante sobre
o desempenho do programa, mas apenas se voc no escrever um cdigo ineficiente que
executado dentro do codecave.
Mais difcil de testar e distribuir - Esta desvantagem se correlaciona com a vantagem de
flexibilidade acima. Desde o codecave est em uma DLL, voc deve escrever um
carregador de DLL para obter a DLL no programa. Esta "injeo de DLL" faz com que voc
no pode facilmente iniciar o processo de destino com um depurador. Em vez disso, voc
deve anex-lo a um processo em execuo. Isto leva a alguns casos complicados se voc
deve depurar o codecave quando o EXE est apenas comeando.
Agora sabemos que as duas principais opes que temos para onde implementar nossos
codecaves. Podemos coloc-los no EXE com a convenincia rpida e fcil de testar a lgica
relativamente simples. Se precisamos de um pouco mais de flexibilidade e poder, podemos
recorrer a implementao do codecave em uma DLL.
Lgico Localizao
A segunda parte deste atributo que tem que ser discutido a localizao do prprio codecave em
relao a um perfil de montagem. A orientao que devemos seguir que quase sempre vai
precisar de pelo menos 5 bytes de espao para configurar um codecave usando um dos mtodos
discutidos na prxima seo para entrar no codecave. Onde quer que coloque o codecave, temos
de ser capazes de facilmente restaurar os bytes que foram sobrescritos dentro do nosso
codecave. Isso significa que as instrues que envolvem PUSH , MOV , CMP , ou incondicional
longo JMP s so os locais mais ideal para colocar um codecave se 5 bytes ou mais. Queremos
encontrar um local que vamos ter que fazer o trabalho menos adicional para restaurar. Este
pargrafo um pouco difcil de digerir, por isso aqui esto alguns exemplos e explicaes sobre o
que se entende.
Considere as seguintes listagens de cdigo de uma funo arbitrria do jogo Pinball:

Digamos que precisamos definir um codecave em algum lugar que a funo para obter acesso a
alguns dados arbitrrios em outras partes do programa. A nica condio que temos que o
codecave deve cair nesta funo, podemos ter acesso ao que precisamos uma vez que o
codecave est configurado. Onde est a "melhor escolha" localizao para o nosso codecave?
Uma vez que s precisa de pelo menos 5 bytes de espao para o codecave, poderamos
coloc-lo nos primeiros 3 instrues, que ocupam exatamente 5 bytes. No entanto, isso significa
que teria que implementar esse cdigo em nosso codecave. "Esse cdigo", sendo:
Collapse | Copy Code

01017441 / $ 8BFF MOV EDI, EDI


01017443 |. 55 TOQUE EBP
01017444 |. 8BEC MOV EBP, ESP

Esta soluo iria funcionar bem para ns, porque no h nada de verso especfica sobre esse
cdigo de montagem. Cdigo de montagem no incio da funo normalmente gerado pelo
compilador (referido como cdigo prlogo) e mantm-se constante entre todas as verses. Uma
vez que este cdigo tambm sempre garantido para ser executado, ele faria para uma tima
opo para colocar um codecave. No entanto, vamos considerar outras possibilidades. Se

6 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

olharmos para a seguinte linha:


Collapse | Copy Code

01017449 |.

E8 6545FFFF CHAMADA PINBALL.0100B9B3

Esta instruo ocupa exatamente 5 bytes, bem, ento isso faria um bom candidato? A resposta :
"depende". Se no havia nenhum outro local adequado para um codecave e tivemos que escolher
este lugar, seria timo. No entanto, existem algumas desvantagens no uso desta localizao. Se o
programa deve mudar durante uma atualizao, provvel que a CALL endereo seria diferente.
Isto iria resultar na necessidade de actualizar o endereo codecave, bem como o cdigo que
chamado no interior do codecave. Em suma, temos mais trabalho a fazer no longo prazo.
Se olharmos para as prximas duas linhas:
Collapse | Copy Code

0101744E |. F645 08 01 TESTE BYTE PTR SS: [EBP +8], 1


01017452 |. 74 07 JE SHORT PINBALL.0101745B

Podemos ver que o total combinado ocupa 6 bytes, que mais do que 5, mas um salto
condicional parte da lgica. Queremos evitar a colocao de um codecave no cdigo que
envolve saltos condicionais a todo custo. Eles acrescentam um monte de trabalho para
reprogramar corretamente em nosso codecave. Que tal o apelo feito depois do salto condicional?
Collapse | Copy Code

01017455 |.

E8 249D0000 CHAMADA <JMP.&msvcrt.??3@YAXPAX@Z>

Por razes semelhantes chamada acima, esta linha traz os mesmos inconvenientes que em
uma atualizao de programa, o endereo pode mudar, assim, criar-nos mais trabalho, mas o real
no-no nesta linha que no sempre vai ser executado! Este cdigo pode ser a condio de
erro da comparao feita acima, ento o nosso codecave nunca seria executado. Temos que
prestar especial ateno s condies como estas ao procurar um local para codecave.
Finalmente, no fim da funo que tem um conjunto de cinco bytes constitudos pelas instrues:
Collapse | Copy Code

0101745A | 59 ECX POP.


0101745B |> 8BC6 MOV EAX, ESI
0101745D |. 5E POP ESI
0101745E |. 5D POP EBP

Ser que isso um local codecave adequado? Absolutamente no! Este exemplo aqui o
campo minado de codecaves que leva voc para o caminho de quebrar o seu programa. Se voc
olhar acima no salto condicional, ele ir saltar para a linha MOV EAX, ESI . Isto significa que
quando o salto condicional tomada, o programa ir executar uma seqncia de bytes invlida
desde a nossa codecave comeou um byte antes. Este cenrio muito importante estar atento
para.
Depois de olhar para a maior parte das possibilidades de onde colocar a codecave, o melhor seria
o incio da funo. Neste exemplo, ns tivemos uma exigncia frouxa de apenas a necessidade
de ter um codecave nesse local. Esta a melhor exemplo de caso que raramente acontece. Na
maioria das vezes, temos um lugar particular a codecave tem que ser pelo, ento deve ler
atentamente o cdigo para ter certeza de que no vai falhar o programa se colocarmos um
codecave l.
A principal bit de informao para tomar a partir deste exemplo que voc deve ler atentamente o
cdigo de listagem de montagem em todo o contexto antes de selecionar um local para a
colocao de um codecave. Com este atributo totalmente coberto agora, podemos passar para o
prximo atributo, que envolve as formas que pode realmente entrar em nosso codecave.

Atributo 2: Codecave Entrada e Sada


O segundo atributo de codecaves que devem ser cobertos so os pontos de entrada e sada reais
do codecave. Temos de ser capazes de obter o EXE para executar nosso codecave ou vamos
apenas ter adicionado cdigo intil. Para este atributo, existem duas maneiras que podemos ir a
este respeito, os quais envolvem indiretamente modificar o ponteiro de instruo no programa. O
primeiro mtodo consiste em usar uma JMP instruo para saltar directamente para o codecave.
O segundo mtodo, que possvel, a utilizao de um CALL instrues para ligar a codecave.
Mtodo JMP
A JMP mtodo o mtodo mais fcil dos dois para usar, uma vez que pode diretamente JMP para
o codecave e depois JMP de volta atravs de um PUSH e RETN para onde ns pertencemos. A
vantagem deste mtodo que a pilha preservada quando fazemos a JMP , por isso, logo que
estamos no codecave, como se no tivssemos feito a JMP em tudo. Isto importante, uma vez
que deve executar o cdigo que foi substitudo no local codecave em primeiro lugar. Se no
tivermos cuidado com a pilha, podemos travar o programa se as coisas ficarem fora de ordem. A

7 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

desvantagem dessa abordagem que o endereo de retorno deve ser codificado no codecave.
Se o EXE no vai mudar, no h nada de errado com essa abordagem, no entanto, se isso no
mudar, muitas vezes, ele vai ficar chato para atualizar o endereo de retorno de cada vez. fcil
esquecer de atualizar o endereo de retorno e acabam deixando de funcionar o programa, pois
voc est retornando a uma posio falsa. Haver mais sobre esta desvantagem mais tarde. Aqui
est um exemplo deste mtodo em ao:

Se voc no est acostumado a OllyDbg, pode demorar um pouco de leitura da imagem para
entender completamente, mas no h pressa. Leia-o com ateno e continuar uma vez que voc
comea o que est acontecendo. A coluna da esquerda os endereos. Etiquetas foram
adicionados para ajudar na identificao de endereos importantes. As mdias duas colunas so
o HEX e listagens de cdigo ASM respectivamente. A quarta coluna comentrios adicionais.
Este exemplo apenas para mostrar um meio rpido de como este mtodo funciona. Como uma
nota lateral, o primeiro JMP geralmente no ser um SHORT JMP , mas um LONG JMP , j que o
codecave no ser to perto do local que codecaved.
Como mencionado acima, na desvantagem, o seu trabalho para manter a codecave para voltar
para o local correto para continuar a execuo. Na imagem acima, que est no endereo
0x401002 . Se o cdigo inserido antes desse local, ento teramos de atualizar o codecave
para PUSH o novo endereo de retorno antes dos codecave retornos. Caso contrrio, estaremos
retornando em uma seqncia de cdigo invlido. De acordo com o primeiro atributo, se voc
pode ter notado, este exemplo foi feito usando o codecave no prprio EXE. um pouco mais
difcil de apresentar completamente o mtodo alternativo visualmente, de modo que por isso
que eu escolhi esse caminho.
Isso tudo que existe para a JMP mtodo. bastante fcil de implementar e usar, mas requer um
pouco mais de manuteno para quando as mudanas de EXE.
Chamada de mtodo
A CALL mtodo um pouco mais complexa do que a JMP mtodo, porque temos de salvar o
endereo de retorno a partir do topo da pilha, antes de executar a nossa codecave e empurre-o
de volta para a pilha antes de voltarmos. A vantagem deste mtodo que no temos de
manter-nos abordar o retorno, uma vez que empurrado para a pilha para comear. Se no o
fizermos, todas as nossas operaes codecave tm de operar em relao a um ponteiro de pilha
que de 4 bytes fora do que esperado. Isso uma baguna para trabalhar, por isso melhor se
cuidarmos de ns mesmos.
Agora, esse ltimo pargrafo vai quer fazer total sentido para voc ou vai deixar voc coando a
cabea. Deixe-me assumir o ltimo e apresentar algumas fotos para ilustrar o que acabei de dizer.
Vamos supor que este o nosso cdigo original apresentada nesta imagem:

Se traarmos at o CALL , a nossa pilha ser parecido com este:

Se tudo funcionar bem, a pilha de chamadas vai ser o mesmo quando fazemos o CALL como
seria no JMP mtodo (este no ser o caso):

8 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

Se olharmos com cuidado, o topo da pilha agora tem o endereo de retorno da CALL fizemos.
Como resultado, temos que saltam este valor. No entanto, no podemos simplesmente
descart-lo, preciso salv-lo, para que possamos voltar a este endereo, quando estamos a
fazer com o codecave. por isso que temos a linha de cdigo que aparece fora do topo da pilha
em nossa varivel (a instruo no endereo 0x00401017 ). Uma vez que a linha executada, o
valor superior da pilha so armazenados em nossa varivel ea pilha vai olhar como deveria, e
isso com a parte superior sendo 0x6FFBC ponto ao invs de 0x6FFB8 , que aponta para o
endereo de retorno para a CALL .
Uma vez que tenhamos cuidado essa pequena inconvenincia, somos livres para continuar como
se estivssemos na JMP mtodo. Esta CALL mtodo tambm oferece um pouco de flexibilidade,
j que o endereo de retorno j est salvo, podemos realmente modificar isso com vrias
compensaes para que possamos voltar sempre que quiser. Assumindo que as mudanas EXE
e da funo que estamos codecaving dentro no muda, os deslocamentos ainda so vlidos! Isso
no quer dizer que no poderia fazer o mesmo no JMP mtodo, mas seria um pouco mais de
trabalho para que a lgica extra complicado.
Com estes dois mtodos cobertos, sabemos que a teoria de como chegar em nossa codecave do
EXE e de volta para o EXE do codecave. Deve notar-se que embora os exemplos acima foram
realizadas com o codecave no EXE, que ficaria a mesma, como se fosse no DLL, excepto os
endereos poderia ser diferente. Temos mais um atributo da esquerda para cobrir agora e que lida
com a teoria de trabalhar com os registros e pilha dentro do codecave.

Atributo 3: Codecave Stack / Registo Modificao


O ltimo atributo de codecaves que temos de ter em conta a pilha e registrar modificao que
ocorre dentro do codecave. Este atributo um aspecto extremamente importante que deve ser
cuidadosamente observado ao projetar seus codecaves ou resultados desastrosos podem
ocorrer. Tomemos por exemplo o seguinte trecho de cdigo:

Big oops! Em nosso codecave, modificamos o EAX registo, por isso quando os codecave
retornos, vamos executar um CALL 0 instruo, o que resultar em uma exceo e uma falha no
aplicativo. Agora, bvio por que devemos prestar especial ateno pilha e registradores. Este
exemplo bem simples, mas quando voc est trabalhando com um cdigo mais complexo, voc
pode inadvertidamente alterar a pilha ou um registo e travar o seu programa. H algumas coisas
que podemos fazer para ajudar a preservar a pilha e registros medida que avanamos em
nossa codecave.
PUSH / POP
Podemos usar este par conjunto de instrues para preservar um registro de cada vez. Por
exemplo, se precisamos usar apenas o ECX registo, podemos fazer o seguinte:
Collapse | Copy Code

empurrar ecx
...
; Use ecx
...
pop ecx

A vantagem deste conjunto de instrues que s pode salvar e restaurar o que precisamos, se
estamos certos de que ns s precisamos modificar alguns registros. Se precisar acessar o
contedo da pilha, ns sabemos que s temos de modific-lo por quatro, por isso um clculo
aceitvel para fazer.

9 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

PUSHAD / POPAD
Podemos usar este par conjunto de instrues para preservar todos os registros de uso geral, ao
mesmo tempo. Ns vamos querer usar esta se estivssemos chamando uma funo de dentro de
nossa codecave que pode modificar um ou mais registros.
Collapse | Copy Code

PUSHAD
...
chamar MinhaFuncao; Modifica algumas registradores
...
POPAD

muito importante lembrar que o PUSHAD instruo modificou a pilha com 8 valores de 32 bits,
por isso, se voc tem que acessar ou utilizar a pilha, voc vai querer faz-lo antes que voc
realmente usar um PUSHAD instruo. Caso contrrio, voc ter que modificar a pilha de acesso
por 0x20 de cada vez. Aqui um exemplo de como a pilha parece antes um PUSHAD executada
e em seguida, depois. Observe o quanto a pilha mudou:

Na pilha original, o valor mais alto de - 1 acessado como ESP + 8 . Aps a PUSHAD ,
devemos usar ESP + 0x28 . Isto o que se entende por recalcular o endereo pilha nos
codecaves se modificar a pilha. Observe tambm que $ apenas ESP .
PUSHFD / POPFD
Este conjunto par instruo semelhante ao PUSHAD e POPAD par, mas ele salva as bandeiras
para a pilha. Este conjunto de instrues s economiza um valor de 32 bits na pilha, de modo que
voc trabalha com a atualizao de clculos de acesso pilha exatamente como faria com um
PUSH , basta adicionar 4.
Collapse | Copy Code

PUSHFD
...
teste eax, eax
...
popfd

Aqui est um exemplo da pilha antes de um PUSHFD executado e, em seguida, mais tarde:

Como voc pode ver, a pilha s foi modificado por 4 bytes. Note que eu no alterou o endereo de
referncia na segunda foto acima, de modo que por isso que o endereo de nvel superior ESP
- 4 , em vez de ESP como a segunda foto no PUSHAD exemplo. Aqui est um olhar para as
bandeiras-se perante o TEST EAX, EAX executado no meu exemplo e depois:

Aps a POPFD executado, as bandeiras sero restauradas para os estados originais visto na
primeira imagem acima.

10 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

Armazenamento temporrio
A ltima tcnica que podemos utilizar para ajudar a preservar a pilha e registradores usar
armazenamento varivel temporria. Ao invs de armazenar um registro original na pilha, que
pode salv-lo para um local de memria, utilize o registo, e, em seguida, restaur-lo de volta a
ns mesmos.
Collapse | Copy Code

mov [VariableAddr], EAX


...
; Use EAX
...
mov EAX, [VariableAddr]

Aqui est um exemplo visual:

Neste cdigo, primeiro mover o EAX registar no local de memria, use EAX , e restaur-lo de volta
do local de memria salvos. Ao fazer isso, ns no alterar a pilha em tudo, ento no temos que
mudar os clculos de pilha! um pouco mais de trabalho, e temos de garantir que vamos
restaurar as variveis de volta em registros, mas para alm disso, uma abordagem interessante
para tomar.
H uma ressalva que eu tenho que chamar a sua ateno aqui. Esta seo foi escrito em relao
ao comeo da escrita codecave. Neste caso, importante por um novato no modificar a pilha ou
registos. No entanto, como mais experincia se ganha, voc vai achar s vezes que voc deseja
modificar a pilha ou registos. Se voc deseja modificar intencionalmente a pilha ou registos, isso
timo. Apenas certifique-se que voc sabe o que est fazendo antes de faz-lo.
Agora que os trs atributos principais de codecaves foram discutidos, temos um conhecimento
mais completo e compreenso da codecaves combinadas com o conhecimento anterior da teoria
bsica. O que resta agora dar uma olhada na aplicao prtica da codecaves e ter uma boa
noo de como desenvolver e us-los em um exemplo do mundo real.

Aplicao
Com a teoria da codecaves cobertos, podemos agora colocar esse conhecimento para usar.
Antes de continuarmos, porm, existem algumas ferramentas que precisamos para obter. Uma
vez que temos o nosso conjunto de ferramentas, temos que, em seguida, obter o programa que
vamos estar trabalhando. Para este artigo eu optar por usar o jogo Space Cadet Pinball que vem
com o WinXP. Lendo sobre o EULA de componentes do Windows, eu no acho que eu possa
redistribuir a verso exata que eu tenho. Vou dar uma pequena dica para ajudar aqueles que tm
verses diferentes quando chegarmos a trabalhar com o programa atual. Uma vez coletadas as
ferramentas discutidas na prxima seo, pode-se passar para fazer um codecave! Aqui est uma
imagem da verso do jogo de Pinball que eu estarei usando:

Ferramentas
A primeira ferramenta que precisamos de um scanner de memria. Para esta ferramenta, vou
recomendar tsearch . O objetivo desta ferramenta verificar a memria de um processo para
encontrar o endereo de dados. H um link para o programa na pgina do Wikipedia, mas no se
esquea que voc escane-lo com cuidado, como com qualquer coisa que voc baixar na
internet. A prxima ferramenta que precisamos de um disassembler e depurador. Para isso, eu
recomendo que voc use OllyDbg uma vez que livre, poderoso e fcil de usar. A ferramenta final
que voc precisa de um compilador C + +. Por isso eu recomendo que voc use o Visual C + +,
se voc tem isso. Se voc no fizer isso, voc pode obter o Express Edition . Por favor, note que
uma outra alternativa livre como Dev-Cpp vai funcionar, mas o cdigo fonte no compatvel com
ele desde que ele no usa assembly embutido estilo Intel. Para recapitular, vamos precisar de trs
ferramentas: um scanner de memria, um desmontador e um compilador C + +. Se voc nunca
usou qualquer uma dessas ferramentas antes, esta seo do artigo pode demorar um pouco mais
de tempo para que voc possa entender. Voc pode querer fazer referncia a alguns tutoriais
adicionais sobre estas ferramentas, se as imagens e textos aqui apresentados no so suficientes
para voc. Apenas lembre-se de ser paciente e reler os lugares que voc ficar preso em. Este
material no de forma simples. Aqui est informaes gerais adicionais (retirado do Wikipedia)

11 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

sobre as ferramentas que iremos utilizar. Eu no incluem links para tutoriais e recursos adicionais
devido natureza dos sites que esto hospedados no.

Tsearch
"Tsearch (semelhante ao ArtMoney e de cdigo aberto Cheat Engine) um utilitrio
de scanner / depurador de memria desenvolvido pela Crsega Productions funo
primria do tsearch digitalizar processos abertos para endereos de bytes;.
Restringir pesquisas para tanto 'valor exato', 'Intervalo' ou . 'Valores Desconhecidos'
As buscas podem ser refinadas usando uma 'Pesquisa Next' (ou peneira) opo:.
este re-pesquisas j encontraram resultados para exibir resultados adequando um
critrio ainda mais refinado tsearch tambm possui um editor hexadecimal e 'auto
hack' opo, e comumente usado dentro do jogo hackers da comunidade para
desenvolver terceiro jogo de festa 'formadores' e 'hacks' ".

OllyDbg
"OllyDbg um depurador que enfatiza a anlise de cdigo binrio, que til quando
o cdigo fonte no est disponvel. Ele traa registradores, reconhece procedimentos,
chamadas de API, switches, tabelas, constantes e cordas, bem como localiza rotinas
de arquivos objeto e bibliotecas. De acordo com o arquivo de ajuda do programa,
verso 1.10 a verso final 1.x. verso 2.0 est em desenvolvimento e est sendo
escrito a partir do zero. O software livre de custos, mas a licena shareware requer
que os usurios se registrar com o autor. "

Visual C + +
"Microsoft Visual C + + (tambm conhecido como MSVC) um ambiente de
desenvolvimento integrado (IDE) do produto projetado pela Microsoft para os C, C + +
e C + + / CLI linguagens de programao. Possui ferramentas para desenvolvimento
e depurao de cdigo C + +, especialmente o que est escrito para a API do
Microsoft Windows, a API DirectX, ea Microsoft. NET Framework ".

Processo de Trabalho
Agora que temos as ferramentas que iremos utilizar e nosso programa alvo, podemos comear
com a aplicao da teoria da codecaves fazer alguma coisa. O que se segue so os trs passos
principais que devemos seguir. O primeiro passo encontrar um propsito para a codecave
queremos criar. Normalmente, voc j sabe por que voc precisa de um codecave, mas por causa
do artigo, vamos trabalhar por esta etapa desde o incio. O prximo passo escrever o codecave
real. Para este artigo, vamos escrever uma codecave que est localizado em uma DLL e usa a
CALL mtodo. O ltimo passo colocar tudo isso em conjunto para obter a nossa DLL no
processo e ver o nosso codecave em ao.

Passo 1: Encontrar um Propsito


Vamos comear o jogo Pinball e dar uma olhada no que est l para nos mexer. Aqui est uma
imagem da tela principal do jogo para referncia:

12 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

Se levarmos em conta o que exibido e que mudanas o mais, a nica coisa que realmente tem
que trabalhar a pontuao atual. E se a gente queria fazer um programa que exibiu a pontuao
atual para ns fora do programa? Poderamos, ento, fazer algum tipo de registro de pontuao
ou outra anlise estatstica se quisssemos. De qualquer forma, ns estamos tentando fazer algo
que no pode atualmente ser feito uma vez que apenas o jogo sabe o resultado atual. Ns
poderamos simplesmente l-lo de memria, mas em alguns casos, essas coisas pode no ser
possvel, por isso vamos assumir a nossa nica opo fazer um codecave para extrair os
dados.
Como uma rpida recapitulao para o passo 1, vamos definir nosso propsito criar uma
codecave no jogo Pinball para que tenham acesso pontuao. Agora que sabemos o que
queremos fazer, ns temos que comear nossos procedimentos de engenharia reversa para
descobrir como realmente encontrar um local adequado no programa para extrair o placar de.
Para fazer isso, vamos utilizar tsearch. V em frente agora e comece a se tsearch. Na barra de
menu na parte superior, selecione o boto Abrir processo e escolher o nosso programa ",
Pinball.exe".

Depois de ter feito isso, o ttulo da janela mudar para "tsearch - PINBALL.EXE". Isso permite-nos
saber que o processo tenha sido carregado. Com tsearch carregado, nossa primeira ordem de
negcio encontrar o endereo onde a nossa pontuao est sendo realizada no. Para fazer

13 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

isso, jogar o jogo Pinball um pouco para obter uma pontuao diferente de zero e pressione F3
para pausar o jogo. Eu parei quando minha pontuao foi 6750. Depois de ter sua pontuao
mo, voltar ao tsearch, vamos procurar o endereo de memria da partitura.
Olhe para a rea mais esquerda superior que contm um controle de grade. Vamos usar o
primeiro boto para procurar o placar. Clique no primeiro cone, a lupa para iniciar uma nova
pesquisa.

Uma nova caixa de dilogo ser aberta, que nos permitir selecionar algumas opes de tipo de
dados, opes de busca, bem como os valores reais. Uma vez que a pontuao exibida como o
que parece ser um nmero inteiro, vamos usar os parmetros de pesquisa padro para procurar a
nossa pontuao. Em outros programas ou jogos, que voc pode ter que brincar com as
configuraes para encontrar o tipo certo para o que voc est procurando. V em frente e entrar
a sua pontuao e pressione OK.

Se tudo correr bem, tsearch ir verificar a memria do programa e diga-nos os endereos de


dados que correspondem a nossa pontuao. No meu caso, foi exatamente 2. Dependendo do
valor, que voc pode conseguir mais. Se voc ficar mais, eu iria mudar a sua pontuao, jogando
um pouco mais e procurar novamente para que voc obtenha exatamente 2 resultados. Aqui est
uma imagem da janela de resultados que aparece depois de uma pesquisa:

Depois de clicar em OK e olhar para trs, o controle de grade que usamos para busca de,
podemos ver dois endereos listados sendo que contm a nossa pontuao:

Agora, por que temos dois endereos na lista? Considerando que temos uma varivel para
armazenar a pontuao, provavelmente h uma segunda varivel que contm o marcador para
exibi-lo para a GUI principal. Como resultado, pode haver dois ou mais valores que contm os
dados que ns estamos procurando em outros programas. Isso algo que importante manter
em mente. Sabemos que a pontuao real e um uma pontuao manequim, como podemos
distingui-los? No h uma resposta fcil que no seja tentativa e erro. Referenciando a imagem
acima, clique no boto com o "caixa, sinal de mais verde" que l, "Adicionar toda a linha
encontrada para a mesa". Depois de clicar nesse boto, as duas entradas so copiadas para o
dilogo do painel direita. Agora vamos descobrir qual a pontuao real.
Agora vamos trabalhar a partir do lado direito da tela, onde os dois endereos foram adicionados
a. Clique dentro da coluna que l Valor da primeira entrada e alter-lo para 0.

14 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

Mude para o jogo e jog-lo at chegar mais alguns pontos. Se o layout de memria semelhante
ao meu, ento voc vai ver que a sua pontuao apresentada continua a subir e a posio de
memria que acabamos de definir a 0 est de volta para redefinir a pontuao atual. Isto significa
que o endereo no a nossa pontuao real. Para verificar isso, bateu F3 para pausar o jogo
novamente e voltar para tsearch. No segundo endereo, alterar o seu valor para 0 e repita o
mesmo procedimento. Uma vez que temos mais alguns pontos no jogo, vamos ver a nossa
pontuao agora redefinir e estamos jogando desde o incio novamente. Este um claro
indicador de que ns encontramos o endereo pontuao correta.
Agora que temos o endereo do nosso pontuao, temos de encontrar onde no EXE do jogo
acessa ou modifica-lo para que possamos configurar um codecave naquele local. Para fazer isto,
iremos anexar OllyDbg para o processo. Aproveitar este momento para iniciar OllyDbg. Se esta
sua primeira vez o lanamento do programa, voc ter que clicar em "Yes" na primeira caixa de
mensagem, se voc receber um:

Com OllyDbg aberta, clique em "Arquivo" e depois em "Anexar". Selecione o processo Pinball a
partir da lista e clique no boto Anexar. Voc pode clicar no cabealho Nome para ordenar a lista
por nome para fazer encontrar o processo muito mais fcil.

Assim que voc anexar OllyDbg para o processo, voc ser saudado com uma outra caixa de
mensagem. Basta pressionar OK.

Neste ponto, OllyDbg est ligado ao nosso programa e devemos ver algo como isto:

15 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

Existem algumas coisas importantes a ter em conta neste momento. Agora nosso programa est
no estado suspenso. Sabemos disso porque, no canto inferior direito, em amarelo, ele diz que
"em pausa". O mdulo que est sendo exibido no o nosso programa, mas o arquivo ntdll.dll.
Este predito pela legenda da janela, que diz "mdulo ntdl". Ns primeiro precisamos retomar o
nosso programa com a tecla F9 ou o azul boto 'Play' (para os lados do tringulo apontando para
a direita) na parte superior da barra de menu. Voc saber que voc fez isso corretamente se as
mudanas de fundo canto direito de "pausa" para "Running".
Com o programa a correr novamente, precisamos realmente olhar para o mdulo de Pinball em
vez do mdulo ntdll.dll. Boto direito do mouse no painel de listagem de montagem e escolha a
opo "View" e depois "Mdulo" Pinball ".

Voc deve fazer isso algumas vezes at que a janela principal diz "CPU - segmento principal,
mdulo de PINBALL". Se voc fizer isso uma vez e ele ainda diz "mdulo ntdll", voc vai ter que
fazer isso de novo! Uma vez que voc est no mdulo principal PINBALL, pressione "Ctrl + A"
para fazer uma anlise do cdigo. Isso vai tornar as coisas um pouco mais limpo para ler. Como
alternativa, clique direito na lista de montagem e escolha a opo "Anlise" e depois em "Analisar
Cdigo". Voc tambm pode querer alterar a aparncia do cdigo para que ele no tudo preto e
branco. Boto direito do mouse novamente na janela da montagem lista e escolha a opo
"Aparncia", "destacando", e depois "Jumps'n'Calls".
Neste ponto, temos OllyDbg anexado ao processo Pinball e sabemos o endereo do nosso score
de tsearch. Copie o endereo do placar real a partir tsearch na rea de transferncia. Mudar para
OllyDbg e pressione "Ctrl + G" e cole no endereo. Prefixar o endereo com " 0x "para OllyDbg
sabe que um endereo, uma vez que comea com uma letra.

16 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

Depois de pressionar OK, voc ser levado para o endereo na janela de despejo desmontagem
principal. Voc deve ver algo parecido com este:

O que voc est vendo agora a desmontagem do contedo da memria no local. No entanto,
essa no a viso que ns queremos olhar para esses dados. Certifique-se que a principal linha
realado e clique direito. Escolha "Siga em Dump" e "Seleo". Na parte inferior da tela, voc
ver os dados em uma visualizao HEX. Destaque os primeiros 4 bytes, esta a nossa varivel
pontuao:

A prxima coisa que temos a fazer definir um ponto de interrupo de memria neste local to
OllyDbg ir pausar o programa quando o jogo escreve a este local de memria para atualizar a
nossa pontuao. Ao fazer isso, ns sabemos de um local que pode colocar um codecave em
para obter a pontuao atual. Clique direito sobre o 4 bytes destaque e escolha "Breakpoint" e
"Memria, na escrita":

Com o ponto de interrupo de memria no lugar, podemos voltar para o jogo e retomar isso.
Assim que voc ganha pontos, o jogo deve parar eo depurador deve tornar-se ativo. O depurador
deve ficar parecido com isso quando ele focado a partir do ponto de interrupo:

Observe no canto inferior direito o processo est "em pausa" novamente. Na barra de status, o
texto l "ponto de interrupo de memria durante a gravao de [ 00AFFC82 ] ". Isso permite-nos
saber que o depurador chamou o processo de escrever ao local de memria da nossa pontuao.
Vamos dar uma olhada nas instrues de montagem que dizem respeito pontuao sendo

17 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

modificado.
Collapse | Copy Code

01017579 |. 8D41 52 LEA EAX, DWORD PTR DS: [ECX +52]


. 0101757C | 0130 ADD DWORD PTR DS: [EAX], ESI
0101757E |. 8B10 MOV EDX, DWORD PTR DS: [EAX]
01017580 |. 81FA 00CA9A3B CMP EDX, 3B9ACA00

Aqui est uma traduo aproximada do que est acontecendo. Ao olhar para o acima, sabemos o
endereo do score carregado em EAX do DS:[ECX + 0x52] . Em seguida, a ESI registo
adicionado ao valor da nota. Finalmente, a varivel de contagem carregada no EDX e, em
seguida, feita uma comparao com a constante de esttica 0x3B9ACA00 , ou decimal
1000000000. Depois de ter visto pelo menos uma verso diferente do cdigo acima nas diferentes
verses de Pinball, vou optar por colocar o codecave na instruo CMP EDX, 3B9ACA00 . Desde
que a instruo de 7 bytes, ele atende aos requisitos de um codecave precisando de pelo
menos 5 bytes. Alm disso, a reprogramao que a lgica em um codecave simples, ns
apenas executar essa linha no final do codecave antes de retornar para o EXE. Colocar o
codecave realmente conveniente naquele local, pois sabemos a pontuao armazenada em
EDX . Ns podemos simplesmente mover o registro para a nossa prpria varivel para uso sem
qualquer trabalho adicional.
Se a sua lista um pouco diferente do acima, ok. Enquanto voc v algo que se assemelha a
acima e ter algum CMP instruo que compara um registo contra 0x3B9ACA00 , voc est bem.
Se voc no quebrar em um local como este, voc poderia ter escolhido o endereo errado como
a varivel score. Este ok tambm, pois voc pode bater CTRL + F e faa uma busca por CMP
EDX, 3B9ACA00 . Voc deve pousar na rea no momento. Devemos lembrar o endereo que o
CMP instruo est em uma vez que vai usar isso na prxima etapa.
Este um bom lugar para parar por um momento e recapitular o que fizemos at agora. Ns
comeamos por olhar para o nosso jogo Pinball e encontrou uma tarefa para fazer. Ns decidimos
que queramos ser capaz de ter acesso pontuao fora do jogo. Uma vez estabelecido esse
objetivo, em seguida, mudou-se para encontrar o endereo de que os dados no processo usando
tsearch. Assim que identificou corretamente a localizao, usamos OllyDbg para descobrir onde o
processo modifica o endereo, que por sua vez d-nos um local para codecave para extrair o
placar atual. Com tudo isso feito, que tenham concludo o passo 1. Agora, podemos passar para a
prxima etapa, que escrever o prprio codecave.

Passo 2: Escrevendo o Codecave


Neste ponto, no artigo, um pequeno problema surge. Ele no ser um problema para implementar
a codecave, mas ser um problema para realmente escrever para o processo. O conceito de
alterar dinamicamente o cdigo de um programa carregado um outro artigo em si. Devido a esta
limitao, vou dar as funes bsicas que usaremos para realizar nossas metas para este artigo.
Caber a voc pesquisar mais para eles para entender completamente o que eles fazem e por
que as coisas so como so (algo que leva um pouco de tempo e prtica). O cdigo est bem
comentado embora assim apenas alguns conceitos precisam ser explicados.
Ns geralmente ter pelo menos duas funes de cada codecave fazemos. A primeira funo
ser o prprio codecave. As restantes funes so funes de apoio que so chamados a partir
da primeira funo para lidar com lgica adicional que no pode ir na primeira funo. A prpria
funo codecave tem que ser um tipo especial de funo, uma funo de nu. Aqui est um
trecho retirado do MSDN :
Funes declaradas com o atributo nu so emitidos sem prlogo ou eplogo cdigo,
permitindo que voc escreva seu prprio seqncias costume prlogo / eplogo
usando o inline assembler. Funes nuas so fornecidos como um recurso avanado.
Eles permitem que voc declarar uma funo que est sendo chamado a partir de um
contexto diferente de C / C + +, e, assim, fazer diferentes suposies sobre onde os
parmetros so, ou quais registros so preservados. Exemplos incluem rotinas, como
manipuladores de interrupo. Este recurso particularmente til para escritores de
drivers de dispositivo virtual (VxD).
Para obter informaes adicionais sobre o prlogo e eplogo cdigo, d uma olhada neste artigo
do Projeto Cdigo: Brincando com a pilha e no adicional Google procurando os termos "prlogo"
e "eplogo".
Quando usamos uma funo nu, temos algumas diretrizes que devem ser seguidas. Para obter
uma lista de diretrizes que devem ser seguidas, por favor, d uma olhada neste artigo: Regras e
limitaes para Funes nuas . Uma coisa importante a lembrar que voc no pode declarar
variveis dentro de uma funo nu. Em vez disso, eles devem ser declarados fora da funo. Se
voc colocar uma declarao de varivel em uma funo nu, voc estar fazendo referncia a um
endereo na pilha. Afora isso, aconselhvel apenas colocar o mnimo de cdigo no-montagem
na principal funo codecave possvel. Voc deve colocar tudo nas funes de apoio.
Como estamos usando um codecave em uma DLL e usando a CALL mtodo, vamos precisar de
um total de duas variveis e duas funes. A primeira varivel manter a pontuao atual obtido a
partir do jogo. A segunda varivel ir realizar o endereo de retorno quando entrar e sair de nosso

18 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

codecave. Para este exemplo simples, vamos apenas mostrar a pontuao atual para uma janela
do console para mostrar que tudo funciona.
O que se segue agora o cdigo relevante para a implementao codecave. O DllMain e
funes de utilidade extra no so mostrados.
Collapse | Copy Code

/ / Esta varivel mantm a nossa pontuao atual


DWORD currentScore = 0;
/ / Esta varivel contm o endereo de retorno, deve ser global!
DWORD ExtractScoreRetAddr = 0;
/ / Este o nosso nvel mais elevado funo C + + que chamado para exibir
/ / A pontuao atual
vazio DisplayCurrentScore ()
{
/ / Basta exibir a pontuao atual para o console
printf ("Score atual:% i \ n", currentScore);
}
/ / Esta a nossa funo codecave, devemos nos lembrar de
/ / Torn-lo uma funo "__declspec (nu)"
__declspec (naked) CC_ExtractScore void (void)
{
__asm
{
/ / A primeira coisa que devemos fazer em nossa codecave salvar
/ / O endereo de retorno a partir do topo da pilha
pop ExtractScoreRetAddr
/ / Uma vez que sabemos o placar atual est em EDX, copie-o em
/ / Nossa varivel
MOV currentScore, EDX
/ / Lembre-se que preciso preservar registros e da pilha!
PUSHAD
PUSHFD
}
/ / Chamar a nossa funo C + + agora
DisplayCurrentScore ();
__asm
{
/ / Restaurar tudo a ser como era antes
POPFD
POPAD

/ /
/ /
/ /
CMP

/ / Esta uma parte importante aqui, temos de executar o que quer


Cdigo que levou para o codecave.
Observe tambm que ns temos que usar 0x3B9ACA00 para um HEX #
E no 3B9ACA00, que seria mal interpretada pelo compilador.
EDX, 0x3B9ACA00

/ / A ltima coisa que devemos fazer em nossa codecave empurrar


/ / O endereo de retorno de volta para a pilha e depois RET volta
empurrar ExtractScoreRetAddr
macerar
}
}
/ / Funo chamada pela funo injetar do carregador Inicializar
extern "C" __ declspec (dllexport) vazio Initialize ()
{
/ / Vamos colocar um codecave no 0x01017580 endereo.
/ / A funo ir chamar CC_ExtractScore
/ / E um byte extra ser NOP'ed
Codecave (0x01017580, CC_ExtractScore, 1);
/ / Cria um console j que estamos em uma DLL
CreateConsole ();
}

Isso no to ruim agora, no ? Lembre-se que apenas o cdigo codecave relacionado


mostrado, o resto do cdigo parte do projeto. Se lembrarmos toda a teoria que aprendemos na
segunda parte deste artigo, tudo parece estar aqui. Primeiro temos o nosso codecave salvar o
endereo de retorno a uma varivel. Isto visto na linha pop ExtractScoreRetAddr . Em
seguida, salvar nossos dados para outra varivel, como visto na linha MOV currentScore,
EDX . Antes de chamar a nossa funo de apoio, vamos guardar os registros e bandeiras para a
pilha e, em seguida, restaur-los mais tarde. Ns finalmente executar o cdigo que foi retirado
para o codecave, que foi a linha CMP EDX, 0x3B9ACA00 , e voltar para onde suposto estar
usando o endereo de retorno armazenado.

19 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

A Initialize funo uma funo exportada que o nosso carregador ir usar para injetar a
DLL para o jogo Pinball para que o EXE ir chamar o codecave. A funo Codecave vai fazer a
maior parte do trabalho para ns, por escrito, o prprio codecave. Como estamos usando o CALL
mtodo para entrar no codecave, a funo Codecave cria uma CALL instruo usando o endereo
da funo que passamos dentro O ltimo parmetro o NOP contagem que especificamos para
apagar bytes extras que precisam ser tomadas fora. Este nmero simplesmente o total de bytes
que voc quer codecave menos 5. Neste caso, h 6 bytes na CMP EDX, 3B9ACA00 instruo,
como podemos ver a partir da listagem de montagem. Cinco destes bytes so para o codecave,
de modo que deixa em byte extra devemos NOP para que o programa no falhar no currculo
devido a uma seqncia de bytes invlido. Se houvesse exatamente 5 bytes, no precisaramos
de qualquer NOP s. Se houvesse 7 bytes precisaramos de 2 NOP s.
Para criar futuros DLLs codecave si mesmo, voc pode usar o projeto fornecido como um modelo.
Voc ter que atualizar o Initialize funo, bem como implementar novas codecaves para si
mesmo. Agora que temos a DLL Codecave concluda, hora de ir para a ltima etapa desse
processo, colocando tudo isso junto!

Passo 3: Juntando tudo


Para ver o produto final do que temos feito apenas em ao, temos de encontrar uma maneira de
obter a nossa DLL no processo de Pinball. Uma vez que fizermos isso, a Initialize da funo
tem que ser chamado para fazer a DLL corrigir o programa de modo a codecave chamado.
Depois disso, sempre que a pontuao atualizada, nossa codecave ser acionado e vamos ver
a nossa pontuao que est sendo exibido no console.
Para realizar esta ltima etapa, vou me referir a e use um artigo anterior eu escrevi: Uma Soluo
DLL Injection mais completa usando CreateRemoteThread . Vou usar esse projeto para criar o
Loader para injetar nossa DLL no processo. O carregador em si bastante simples: o WinMain
mostrado no final desse artigo s foi ligeiramente modificada para este:
Collapse | Copy Code

Ponto de entrada / / Program


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
/ / As estruturas para a criao do processo
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
BOOL resultado = false;
/ / Cordas para criar o programa
caractere exeString [MAX_PATH + 1] = {0};
caractere WorkingDir [MAX_PATH + 1] = {0};
/ / Mantm onde a DLL deve ser
caractere DLLPath [MAX_PATH + 1] = {0};
/ / Pega o diretrio atual
GetCurrentDirectory (MAX_PATH, WorkingDir);
/ / Construir o caminho completo para o EXE
_snprintf (exeString, MAX_PATH, "\"% s \ \ PINBALL.EXE \ "-quick", WorkingDir);
/ / Definir o caminho esttico de onde a DLL Inject codificado para uma demo
_snprintf (DLLPath, MAX_PATH, "PinballCodecave.dll");
/ / Necessidade de definir este para a estrutura
si.cb = sizeof (STARTUPINFO);
/ / Tente carregar o nosso processo de
result = CreateProcess (NULL, exeString, NULL, NULL, FALSE,
CREATE_SUSPENDED, NULL, WorkingDir, & si, p);
if (resultado!)
{
MessageBox (0, "! Processo no pde ser carregado", "Erro", MB_ICONERROR);
voltar - 1;
}
/ / Injetar a DLL, a funo de exportao nomeado 'Inicializar'
Injetar (pi.hProcess, DLLPath, "Inicializar");
Execuo do processo / / Resume
ResumeThread (pi.hThread);
/ / Retorno padro
return 0;
}

Lembre-se que s o WinMain mostrado acima, o resto do cdigo est no arquivo de projeto em
si. Neste ponto, temos agora todas as principais peas. hora de testar! Copiar todo o

20 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

"PinballCodecave.dll" e arquivos "PinballLoader.exe" em sua pasta Pinball, que "C: \ Program


Files \ Windows NT \ Pinball" por padro. Execute o arquivo "PinballLoader.exe" para iniciar o jogo
de Pinball, voc deve ver um pop-up do console DOS tambm. Se tudo funcionar bem, voc deve
ser capaz de jogar o jogo. Quando voc marcar pontos, sua pontuao atual deve ser passada
para a janela do console. Neat, hein? Se algo der errado, d uma olhada sobre o endereo que
voc est colocando o codecave on, bem como todos os detalhes menores. A boa coisa sobre
este material de baixo nvel que se voc fracassar, 90% do tempo que voc vai estar ciente de
que uma vez que as falhas do programa ou faz algo inesperado.

Concluso
Tem sido uma viagem longa e difcil, mas voc finalmente chegou ao fim. Neste ponto, voc deve
ter ganhado uma compreenso bsica, mas completa, do que um codecave . Vimos atravs da
seco de teoria de que um codecave faz e como ela pode ser usada. Voc sabe agora trs
atributos importantes de codecave que voc tem que manter em mente ao projetar seu prprio
pas. Eles so a localizao do codecave, os pontos de entrada e de sada, e a pilha e registar as
tcnicas de preservao. Voc tem um exemplo prtico de referncia, bem como um cdigo de
modelo sua disposio para seus projetos futuros. Voc pode ter at mesmo ganhou um pouco
de conhecimento de algumas novas ferramentas que voc pode usar em seus futuros
empreendimentos.
A grande questo que sempre vem esquerda em qualquer final "e agora?" A partir daqui, voc
pode continuar a explorar o uso codecave para realizar vrias tarefas que voc pode no ter sido
capaz de fazer antes. s vezes, difcil de descobrir "o que fazer", ento se voc no tem nada
para trabalhar de imediato, no se preocupe com isso! Basta lembrar o que aprendeu e, talvez,
voc pode aplic-lo em outro lugar no futuro. Espero que voc tenha gostado deste artigo, eu sei
que muito longo, mas espero ouvir seus comentrios.

Licena
Este artigo, juntamente com qualquer cdigo-fonte associado e arquivos, est licenciado sob a
licena de cdigo Projeto Open (CPOL)

Sobre o autor
Drew_Benton
Estados Unidos

No Biografia fornecido
Artigo Top

Comentrios e Discusses
Voc deve Entrar para usar esta placa da mensagem.
Ir

Procure neste frum


Perfil Espaamento popups

Descontrado Rudo

Muito Alta

Traado

Por pgina

Normal
10

Atualizar

Primeira Anterior Prxima

21 de 22

01-12-2013 19:20

A Beginners Guide to Codecaves - CodeProject

http://translate.googleusercontent.com/translate_...

JMP vs PSH + RETN

Membro 9251782

Muito obrigado!

Id0Hadar

7-Aug-12 14:52

Meu voto de 5

helloshaktiman

19-Jul-12 22:58

Meu voto de 5

gndnet

19-Jul-12 22:55

Obrigado, Drew

roygunter

2-Out-11 13:48

Fundamental Mr. Watson

TheRaven

18-Set-11 15:01

Obrigado por isso.

Joe_Dert

5-Set-11 15:52

Meu voto de 5

xiaoy312

21-Mar-11 21:13

Problema Assemblia

krzer

6-May-09 18:11

Drew_Benton

7-May-09 03:38

Re: problema Assemblia


ltima Visita: 31-Dez-99 18:00 Atualizao: 1-Dec-13 06:02
Geral
Notcia
Administrador

Sugesto

Pergunta

Percevejo

Atualizar
Resposta

21-Aug-12 13:20

1 2 3 4 5 6 Prximo
Piada

Discurso retrico

Use Ctrl + Esquerda / Direita para mudar mensagens, Ctrl + Cima / Baixo para alternar threads, Ctrl + Shift + Esquerda /
Direita para mudar as pginas.

Link permanente | Publicidade | Privacidade | Celular


Web03 | 2.7.131126.1 | ltima atualizao Ago 27, 2007

22 de 22

Layout: fixo | fluido

Artigo Copyright 2007 by Drew_Benton


Tudo o resto Copyright CodeProject , 1999-2013
Termos de Uso

01-12-2013 19:20

Das könnte Ihnen auch gefallen