Logo Hardware.com.br
Demarchi_
Demarchi_ Membro Junior Registrado
76 Mensagens 0 Curtidas

Assembly - Manipulando Endereços de Memória

#1 Por Demarchi_ 23/10/2011 - 15:55
Boa Tarde.rindo_ate_agora.png

A estudar assembly, me apareceram algumas dúvidas das quais não encontrei resposta.
Vou citar um exemplo mais fácil para minha compreensão, corrigam se eu estiver errado.:nao_sei_de_nada:


Em um jogo de RPG qualquer, o dano do seu personagem é armazenado em algum lugar, este lugar seria um endereço de memória correto? Como faço para conseguir analisar os endereços de memória de um jogo e modifica-los? É assim que surgem os cheater de jogos, como cheater do Grand Chase, que aumenta o dano do personagem?

Existe algum programa específico para manipular endereços?
OS: Windows 7 / Debian Squeeze / Backtrack 5
Processador: AMD Phenom II x2 3.20 (x4 B50)
Memória: 2 GB DDR3 1066 Mhz Kingston
VGA: XFX ATI HD 5550 1 GB (low profile)
Fonte: Casemall 500WR
Monitor: SAMSUNG Sync 21"
Jogolos: adeus.gif Nenhum, só estudando
Meyer!
Meyer! Ubbergeek Registrado
3.9K Mensagens 535 Curtidas
#2 Por Meyer!
23/10/2011 - 17:41
Demarchi_ disse:

Dependendo do jogo, o dano é armazenado em um endereço de memória.
Para modificar, existe um programa chamado Cheat Engine (ele funciona em qualquer aplicativo, me corrigam se eu não posso falar sobre cheaters). Ele tem suporte a Win64, ele, no início é um pouco difícil de usar, mas se pega o jeito. Ele inclui um tutorial para usar ele. Eu uso ele no CS (quem não usa cheaters no CS?). Exemplo: Você tá com a vida em 100. ela cai para 95. Existe uma função no programa citado que monitora a modificação dos endereços de memória. Na Net você acha uns tutoriais sobre esse programa.
Demarchi_
Demarchi_ Membro Junior Registrado
76 Mensagens 0 Curtidas
#4 Por Demarchi_
23/10/2011 - 18:59
RSRSRSR, eu jogo na Steam, e abomino os xiters, na boa, estragam o jogo :/
Antigamente não tinha isso de sXe, EAC , o jogo era mais limpo,

Enfim, obrigado pela resposta Meyer, citei o jogo como exemplo, pois é uma forma mais fácil para min de entender.

Agora, eu consigo por exemplo, usar um debugger no código fonte do Counter-Strike por exemplo, ou este código é fechado, o que nós temos em nosso PC é o código já compilado em linguagem de máquina?

Estou aprender a usar o gdb (Gnu Project Debugger) No material que estou estudando ele explica como analisar registradores e os endereços de memória que esses registradores correspondem, por exemplo
registrador eip que é um apontador, ele ensina como examinar a memória que o eip está armazenando. To achando mt legal.

Enfim, em breve postarei mais dúvidas, obrigado a todos.
OS: Windows 7 / Debian Squeeze / Backtrack 5
Processador: AMD Phenom II x2 3.20 (x4 B50)
Memória: 2 GB DDR3 1066 Mhz Kingston
VGA: XFX ATI HD 5550 1 GB (low profile)
Fonte: Casemall 500WR
Monitor: SAMSUNG Sync 21"
Jogolos: adeus.gif Nenhum, só estudando
Demarchi_
Demarchi_ Membro Junior Registrado
76 Mensagens 0 Curtidas
#5 Por Demarchi_
23/10/2011 - 19:20
Segue um trecho do texto, abaixo dele vou perguntas umas coisas:

"A opreação cmp é usada para comparar valores, e basicamente qualquer operação que começe com j é usada para pular uma parte diferente do código (dependendo do resultado da comparação). O exemplo que segue primeiro compara um valor de 4 bytes localizado do ebp menos 4 com o número 9. A próxima instrução é um resumo de salte quando for menor ou igual a, referindo-se ao resultado da comparação anterior. Se quele valor é menor ou igual a 9, a execução pula para a instrução 0x8048393. Senão a execução roda para a próxima instrução com um pulo incondicional. Se o valor não é menor ou igual a 9, a execução pula para 0x80483a6."

804838b: 83 7dfc 09 cmp DWORD PTR [ebp-4],0x9
804838f: 7e 02 jle8048393
8048391: eb 13 jmp 80483a6 "



O trecho em assembly acima, creio eu que seja um breakpoint na função main() queria saber o que significa o DWORD e os ?

No livro ele não exemplifica isso.

Obrigado.
OS: Windows 7 / Debian Squeeze / Backtrack 5
Processador: AMD Phenom II x2 3.20 (x4 B50)
Memória: 2 GB DDR3 1066 Mhz Kingston
VGA: XFX ATI HD 5550 1 GB (low profile)
Fonte: Casemall 500WR
Monitor: SAMSUNG Sync 21"
Jogolos: adeus.gif Nenhum, só estudando
Meyer!
Meyer! Ubbergeek Registrado
3.9K Mensagens 535 Curtidas
#7 Por Meyer!
23/10/2011 - 19:39
Demarchi_ disse:

Sim, o próprio programa citado anexa um debugger se solicitado. O debugger é anexado quando a aplicação está em execução. Não o programa presente no computador (no caso o Counter-Strike) já vem numa linguagem para o Windows entender (abra um no bloco de notas para você ver). Usando um editor Hexadecimal você consegue editar algo nesse aplicativo sem abrir-lo (é bem mais ImagemImagemImagemImagem ImagemImagemImagemImagem)


Demarchi_ disse:

DWORD:

Uma dword é normalmente o dobro de uma word, que por sua vez é normalmente a unidade natural de operação do processador, sobre a qual as instruções operam de uma vez só(ou pelo menos deveriam). O tamanho de uma word pode variar dependendo da implementação de dada arquitetura, e conseqüentemente o de uma dword variará.

Para o processador, não existe "int", "char", "long long int", "short", etc. Também não existem tipos; tudo não passa de uma longa seqüência de estados binários. Nós chamamos variáveis assim em uma linguagem de programação de nível mais alto(e fazemos diferenciação de tipos), mas normalmente nas linguagens próximas do código de máquina(Assembly), usamos os termos byte, word, dword(double word) e qword(quad word).

Embora usemos em linguagens de nível mais baixo, uma word é parte da implementação, e seu tamanho exato irá variar. Já em linguagens de alto nível o tamanho é normalmente apenas um sinônimo para algum outro tipo, como "int" ou "unsigned int". Nesses casos, como por exemplo no Windows, um byte será um valor de 8 bits, uma word será um valor de 16 bits, uma dword será um valor de 32 bits, e uma qword será um valor de 64 bits.

Por essa definição, essas variáveis não passam de:

typedef uint8_t BYTE;
typedef uint16_t WORD;
typedef uint32_t DWORD;
typedef uint64_t QWORD;

E é muito provavelmente por isso que as encontrou com letras maiúsculas: é uma prática comum (e boa) representar constantes, typedefs, defines e etc com letras maiúsculas. Dessa forma você reconhece facilmente.

Então, em outras palavras, são apenas variáveis de tamanhos variáveis que armazenam dados, cuja interpretação, assim como com todos os outros dados, depende de você, do programa, ou do sistema.
removido de: http://br.answers.yahoo.com/question/index?qid=20110708212627AAIIFMy
Resumindo:
WORD é a instrução 16 bits usadas em todos os processadores.
D(ouble)WORD é a instrução 32 bits em todos os processadores desde o Intel 80386.
Q(uad)WORD é a instrução 64 bits usadas nos processadores mais modernos, a maioria são de dois ou mais núcleos.
Em relação ao main, eu não sei.nao_sei.gif Na verdade eu não entendo muito de assembly foi_ruim.gif... Acho que só com uma boa apostila.
Demarchi_
Demarchi_ Membro Junior Registrado
76 Mensagens 0 Curtidas
#8 Por Demarchi_
23/10/2011 - 19:46
51l3n7 disse:


Isso eu sei, mas queria saber ao que se refere.

@Meyer
Vlw ae ^^, o jeito é achar uma apostila zica, o tenso é que material bom só em inglês e meu inglês está enferrujado,

Obrigado.
OS: Windows 7 / Debian Squeeze / Backtrack 5
Processador: AMD Phenom II x2 3.20 (x4 B50)
Memória: 2 GB DDR3 1066 Mhz Kingston
VGA: XFX ATI HD 5550 1 GB (low profile)
Fonte: Casemall 500WR
Monitor: SAMSUNG Sync 21"
Jogolos: adeus.gif Nenhum, só estudando
Demarchi_
Demarchi_ Membro Junior Registrado
76 Mensagens 0 Curtidas
#10 Por Demarchi_
25/10/2011 - 12:47
Obrigado Fergo, quando estiver em casa vou ler com mais atenção.

Enquanto ao Ollgydb, você saberia me dizer se existe algo parecido com ele, para Linux?

@edit
Cara, isso é mt show, acabei de ver aqui pelo livro, como analisar a memória contida em uma variável do C, e os três comandos assembly responsáveis pelo if-then-else respectivamente cmp, jle e jmp. E também o exemplo de Hello World, os bytes hexadecimais comparados com a tabela ASCII, to impressionado....


Obrigado.
OS: Windows 7 / Debian Squeeze / Backtrack 5
Processador: AMD Phenom II x2 3.20 (x4 B50)
Memória: 2 GB DDR3 1066 Mhz Kingston
VGA: XFX ATI HD 5550 1 GB (low profile)
Fonte: Casemall 500WR
Monitor: SAMSUNG Sync 21"
Jogolos: adeus.gif Nenhum, só estudando
Demarchi_
Demarchi_ Membro Junior Registrado
76 Mensagens 0 Curtidas
#11 Por Demarchi_
28/10/2011 - 08:40
Meyer! disse:



Então uma WORD, DWORD e etc, não passa de variáveis do processador que "representam" as variáveis do código, seria mais ou menos isso?

eu consigo examinar as WORD, DWORD, e etc?
No Gnu debugger consigo examinar os registratores, o eip e os endereços de memória ex:

(gdb) x/x 0x8048393 //x: Examine o endereço de memória, x: Mostre em sistema numérico hexadecimal.

será que consigo?:

(gdb)x/x $WORD

Vou testar e posto depois.


Obrigado
OS: Windows 7 / Debian Squeeze / Backtrack 5
Processador: AMD Phenom II x2 3.20 (x4 B50)
Memória: 2 GB DDR3 1066 Mhz Kingston
VGA: XFX ATI HD 5550 1 GB (low profile)
Fonte: Casemall 500WR
Monitor: SAMSUNG Sync 21"
Jogolos: adeus.gif Nenhum, só estudando
Fergo
Fergo Highlander Registrado
9.3K Mensagens 1.1K Curtidas
#12 Por Fergo
28/10/2011 - 10:11
Demarchi_ disse:


Esses termos não indicam diretamente um endereço de memória, mas sim como a instrução vai acessar a memória, mais especificamente quantos bytes serão lidos. Exemplo:

mov eax, dword ptr [0x8048393]

Nesse contexto, o termo dword apenas indica que em um processador de 32 bits, serão lidos quatro bytes a partir do endereço indicado para o registrador eax.

mov eax, word ptr [0x8048393]

O código acima faz exatamente a mesma coisa, mas ao invés de ler quatro bytes, ele vai ler apenas 2.
Site pessoal www.fergonez.net
Portfolio
www.fbirck.com
Artigos
Informática
Demarchi_
Demarchi_ Membro Junior Registrado
76 Mensagens 0 Curtidas
#13 Por Demarchi_
28/10/2011 - 10:33
Fergo disse:


Então o DWORD PTR significa:
" Ei, comando mov,eax, você vai ler 0x8048393, mas apenas 4bytes por vez"

Seria isso, ele sinaliza para ler o endereço de 4 em 4 bytes? Isso teria uma relação com um programa ser lento ou não?

E sempre que a uma WORD, DWORD em alguma linha, há também um endereço de memória / valor, isto afirma que as WORD e DWORD "dizem" como ler esses endereços/ valores, correto?



mov eax, dword ptr [0x8048393]

Nesse contexto, o termo dword apenas indica que em um processador de 32 bits, serão lidos quatro bytes a partir do endereço indicado para o registrador eax.


O techo acima diz isso: mova o que está em 0x8048393 para eax, mas apenas 4bytes por vez
Está correto?

Abaixo o código que estou estudando. Bem bobim, e já está complicado...


O código que estou usando é este

#include <stdio.h>

int main()
{
int i;
for(i=0; i < 10; i++) //Repete 10 Vezes
{
puts("Hello, World!\n&quot; //Coloca string na saida
}
return 0; //Diz ao SO que o programa encerrou sem erros.
}


Segue a examinação dos binários do código já compilado, apenas a 20 primeiras linhas depois da função main() do código em C.


#objdump -M intel -D a.out | grep -A20 main.:
080483a4 <main>:
80483a4: 8d 4c 24 04 lea ecx,[esp+0x4]
80483a8: 83 e4 f0 and esp,0xfffffff0
80483ab: ff 71 fc push DWORD PTR [ecx-0x4]
80483ae: 55 push ebp
80483af: 89 e5 mov ebp,esp
80483b1: 51 push ecx
80483b2: 83 ec 14 sub esp,0x14
80483b5: c7 45 f8 00 00 00 00 mov DWORD PTR [ebp-0x8],0x0
80483bc: eb 10 jmp 80483ce <main+0x2a>
80483be: c7 04 24 b0 84 04 08 mov DWORD PTR [esp],0x80484b0
80483c5: e8 0a ff ff ff call 80482d4 <puts@plt>
80483ca: 83 45 f8 01 add DWORD PTR [ebp-0x8],0x1
80483ce: 83 7d f8 09 cmp DWORD PTR [ebp-0x8],0x9
80483d2: 7e ea jle 80483be <main+0x1a>
80483d4: b8 00 00 00 00 mov eax,0x0
80483d9: 83 c4 14 add esp,0x14
80483dc: 59 pop ecx
80483dd: 5d pop ebp
80483de: 8d 61 fc lea esp,[ecx-0x4]
80483e1: c3 ret
OS: Windows 7 / Debian Squeeze / Backtrack 5
Processador: AMD Phenom II x2 3.20 (x4 B50)
Memória: 2 GB DDR3 1066 Mhz Kingston
VGA: XFX ATI HD 5550 1 GB (low profile)
Fonte: Casemall 500WR
Monitor: SAMSUNG Sync 21"
Jogolos: adeus.gif Nenhum, só estudando
Fergo
Fergo Highlander Registrado
9.3K Mensagens 1.1K Curtidas
#14 Por Fergo
28/10/2011 - 15:48
Sim, esses termos servem para referenciar a memória. Como no nível mais baixo não existem variáveis, nem tipagem das mesmas (integer, string, long etc), é tudo informação em um mesmo bloco de memória, você precisa ter uma forma de referenciar o tamanho das mesmas. Nada impede você de ler byte por byte e ir deslocando para a esquerda até ler os 4 bytes de uma dword, mas é trabalhoso.

Quando tiver comparando código fonte com o resultado em assembly, procure desligar todas as otimizações do compilador, assim você tem certeza que aquilo que você programou é o que foi compilado, sem intervenções do mesmo.
Site pessoal www.fergonez.net
Portfolio
www.fbirck.com
Artigos
Informática
Demarchi_
Demarchi_ Membro Junior Registrado
76 Mensagens 0 Curtidas
#15 Por Demarchi_
28/10/2011 - 16:47
Fergo disse:


Sendo assim, em assembly aparece uma DWORD, pois no código em C declarei um bloco de memória int (a variável i), e int vale 4bytes, correto?
OS: Windows 7 / Debian Squeeze / Backtrack 5
Processador: AMD Phenom II x2 3.20 (x4 B50)
Memória: 2 GB DDR3 1066 Mhz Kingston
VGA: XFX ATI HD 5550 1 GB (low profile)
Fonte: Casemall 500WR
Monitor: SAMSUNG Sync 21"
Jogolos: adeus.gif Nenhum, só estudando
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal