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?
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.
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:
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