Material assembly

7 respostas
yschmitzz

Fala pessoal!
estou fuçando um programa, de curioso comecei a mexer com assembly, mas material para ele é difícil de encontrar
em fim, como estou “brincando”, não pretendo aprender os fundamentos de assembly, estou querendo alterar o valor de uma variável de um programa já compilado, mas nao consigo de forma nenhuma, só acho tutoriais ensinando os fundamentos

em fim, o que eu estou querendo fazer, é simples (eu acho) o programa recebe um valor de uma linha do arquivo.ini, mas queria alterar seu código para ao invés dele receber o conteúdo desse arquivo.ini ele recebe o valor por parâmetro
acredito que ele recebe todos os valores do arquivo ini, e armazena em um vetor, dai seria só alterar o vetor que utilizaria

exemplo:

string ip = arquivo[10] // atribui a variavel ip o valor da linha 11 no arquivo.ini

seria substituir arquivo[10] para args[0]

realmente, muito simples no código fonte, mas no assembly não parece tão facil
Em tempo de execução (pelo editor OllyDbg) consigo procurar o endereço da memoria e alterar com o programa em execução, mas no codigo compilado não consigo

será que vou ter que realmente aprender todos os fundamentos só para fazer uma alteração dessa?
alguem sabe algum material?

7 Respostas

mi.rodrigues

Isso deveria estar em Outras Linguagens?!? >> http://www.guj.com.br/forums/show/20.java

Desculpe se eu estiver enganado! :slight_smile:

perdeu

tem esse livro aqui http://www.erica.com.br/detalhes.asp?cod=4261

E

Tio, é bem mais complicado que parece - normalmente crackers (que são aqueles carinhas que mexem em programas já compilados e fazem com que seja possível, por exemplo, desabilitar a proteção de código) não mudam a funcionalidade de um programa (que é o que você quer fazer) mas simplesmente desabilitam a funcionalidade (por exemplo, onde é feito uma verificação de um flag que indica se a licença é válida, põem uma instrução JMP (Jump) ou coisa parecida, para passar por cima desse código.
No seu caso você quer mudar o lugar de onde você quer pegar os dados, o que não costuma ser trivial em termos de mexer em código já compilado.

matheuslmota

O que você está querendo fazer não possui solução simples.
Eu fiz um teste bem bobo aqui e tive o seguinte resultado. Eu fiz dois códigos em C, um que colocava um valor em uma variavel e outro que coloca um valor passado por parametro na mesma variavel:

int main(int argc, char **argv) { char c = 10; return 0; }

int main(int argc, char **argv) { char c = *argv[0]; return 0; }

Depois eu rodei o seguinte comando para gerar a listagem em assembly correspondentes aos dois arquivos:

gcc -c -g -Wa,-ahl=main.s main.c

Ess comando gera uma listagem assembly um pouco mais legivel, ele adiciona alguns comentarios que ajudam a localizar os pontos do código C que correspondem a um ponto do assembly.
Enfim, gerando os respectivos arquivos assembly e comparando com um diff, cheguei ao seguinte resultado:

4:main.c **** char c = 10; 24 .loc 1 4 0 25 000e C644240F movb $10, 15(%esp)

4:main.c **** char c = *argv[0]; 24 .loc 1 4 0 25 000e 8B450C movl 12(%ebp), %eax 26 0011 8B00 movl (%eax), %eax 27 0013 0FB600 movzbl (%eax), %eax 28 0016 8844240F movb %al, 15(%esp)

Como pode ver, não é só mover um valor para um registrador, você tem de fazer mais algumas operações e isso não é trivial.

yschmitzz

mi.rodrigues:
Isso deveria estar em Outras Linguagens?!? >> http://www.guj.com.br/forums/show/20.java

Desculpe se eu estiver enganado! :slight_smile:

Foi mal pessoal, nem reparei.

matheuslmota realmente, parecia simples imaginando, mas realmente a coisa é bem mais complicada… se não como o entanglement falou, seria tudo questão de dar um jump no codigo de programas que precisam de validação…
No momento meu objetivo não é estudar Assembly ja que não tem muita ligação com meu objetivo profissional, então acho que essa idéia de mexer no codigo compilado deixa pra la :stuck_out_tongue:

M

A linguagem vai depender da arquitetura usada pelo processador usado para compilar o programa também.

Não vai ser algo trivial … querendo ou não voce VAI ter que aprender algo em baixo nivel para fazer isso.

veja se isso da uma esclarecida:

B

De qualquer maneira, se você realmente quer fazer isso, pode tentar usar esta ferramenta:

https://www.hex-rays.com/products/ida/index.shtml

Criado 1 de abril de 2013
Ultima resposta 1 de abr. de 2013
Respostas 7
Participantes 7