Engenharia Reversa e Programação Low Level

1. Engenharia Reversa e Programação Low Level

Thiago
thiago_c

(usa Debian)

Enviado em 18/10/2024 - 09:45h

Olá pessoal, gostaria de saber se alguém tem indicação de livros, artigos ou materiais audiovisuais para iniciar os estudos na área de engenharia reversa e low level.
No momento sei o básico de C/C++ que se aprende na faculdade, scripts envolvendo ponteiros, estruturas de dados e etc. Vale a pena buscar o aprofundamento em C e depois partir para Assembly e Análise de Binários ou posso seguir tudo em paralelo?


  


2. Re: Engenharia Reversa e Programação Low Level

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 18/10/2024 - 10:26h

Sugiro ir um passo de cada vez, ou melhor, aprofunde em C por um tempo (uns 12 meses) e depois vá para assembly.
Digo isso porque assembly pode ser muito complexo sem ter experiência em programação, a não ser é claro que vc vá pra um assembly mais de boa, tipo assembly 8 bits.

Mas com C vc também terá contato com a memoria e principios de assembly, como manipulação bit a bit e hexadecimal.

Eu tinha material sobre assembly e C mas tá perdido no meio dos meus arquivos.
Como introdução a assembly vc pode usar o site aldeia numa boa e até mesmo o livro The Art of Assembly, que dizem ser uma referencia na área.

Para C não tem muito segredo porque é apenas prática e mais prática com algoritmos.

Boa sorte.



3. Re: Engenharia Reversa e Programação Low Level

Thiago
thiago_c

(usa Debian)

Enviado em 18/10/2024 - 10:42h

SamL escreveu:

Sugiro ir um passo de cada vez, ou melhor, aprofunde em C por um tempo (uns 12 meses) e depois vá para assembly.
Digo isso porque assembly pode ser muito complexo sem ter experiência em programação, a não ser é claro que vc vá pra um assembly mais de boa, tipo assembly 8 bits.

Mas com C vc também terá contato com a memoria e principios de assembly, como manipulação bit a bit e hexadecimal.

Eu tinha material sobre assembly e C mas tá perdido no meio dos meus arquivos.
Como introdução a assembly vc pode usar o site aldeia numa boa e até mesmo o livro The Art of Assembly, que dizem ser uma referencia na área.

Para C não tem muito segredo porque é apenas prática e mais prática com algoritmos.

Boa sorte.

Agradeço pela sugestão, vou buscar me aprofundar em C primeiro mesmo, até tinha pensado em pegar aquele livro "C completo e total" que já me disseram que é excelente, talvez o mergulho seja mais fácil de forma lenta e gradual pra acostumar com a pressão. Vou colocar na lista esse livro de Assembly também. Vou deixar o tópico aberto por mais um tempo para pegar mais sugestões de materiais.

Obrigado.


Frase de efeito que demonstra minha ideologia.

Distros utilizadas: Slackware, Fedora, Manjaro, Debian, Xubuntu


4. Re: Engenharia Reversa e Programação Low Level

Buckminster
Buckminster

(usa Debian)

Enviado em 19/10/2024 - 19:10h

Terá de aprender a mexer em Debugger, Disassembler, Compiler e Editores Hexadecimais.

Por exemplo, o RETOOLKIT.
https://github.com/mentebinaria/retoolkit/releases/tag/2022.04

No Linux tem o Ghidra:
https://ghidra-sre.org/

Aqui tem algo muito interessante para Linux:
https://www.mentebinaria.com.br/artigos/engenharia-reversa/montando-sua-m%C3%A1quina-virtual-para-en...

Com o vim:
https://www.linuxforce.com.br/comandos-linux/comandos-linux-comando-vim/

https://sergioprado.org/configurando-o-vim-como-ide-para-desenvolver-aplicacoes-em-cc/

https://www.youtube.com/watch?v=hdZMqMeruSQ

Aqui tem mais uma porção de softwares:
https://mentebinaria.gitbook.io/engenharia-reversa/apendices/ferramentas


_________________________________________________________
Always listen the Buck!
Enquanto o cursor estiver pulsando, há vida!


5. Re: Engenharia Reversa e Programação Low Level

César
dark777

(usa Debian)

Enviado em 23/01/2025 - 16:36h



Procure pelo livro "A arte de proteger(Software), Greg Hoglund e Gary McGraw"
wiki.anon


6. Re: Engenharia Reversa e Programação Low Level

Paulo
paulo1205

(usa Ubuntu)

Enviado em 24/01/2025 - 16:53h

thiago_c escreveu:

Agradeço pela sugestão, vou buscar me aprofundar em C primeiro mesmo, até tinha pensado em pegar aquele livro "C completo e total" que já me disseram que é excelente, talvez o mergulho seja mais fácil de forma lenta e gradual pra acostumar com a pressão. Vou colocar na lista esse livro de Assembly também. Vou deixar o tópico aberto por mais um tempo para pegar mais sugestões de materiais.


Recomendo não usar o C Completo e Total. Apesar da eloquência do autor (que, além de ter um estilo muito fácil de ler, era uma verdadeira máquina de produzir livros sobre diferentes linguagens e dialetos de programação nas décadas de 1980 e 1990 — talvez a grande quantidade e a alta velocidade ajudem a explicar a baixa qualidade), o livro apresenta diversas práticas de programação duvidosas, conceitos errôneos, explicações incorretas, e muitos dos exemplos têm erros tão crassos que os tornam absolutamente inúteis e incompatíveis com a proposta de ensinar a programar adequadamente.

Veja a quarta mensagem neste tópico (de 2016) do fórum do VoL, onde eu apresento links para artigos e referências a respeito do livro e seu autor: https://www.vivaolinux.com.br/topico/C-C++/Iniciante-em-programacao.


Quanto à última pergunta da mensagem original, minha opinião é que é possível, sim, aprender Assembly ao mesmo tempo que outra linguagem. Isso pode inclusive ser muito interessante, de certa forma, com a pessoa vendo como o compilador faz para converter um código em C (ou outra linguagem de alto nível) em linguagem de máquina, através do exame do Assembly que produziria o mesmo código de máquina (por exemplo, com a opção -S do GCC, possivelmente em conjunto com -fverbose-asm, inclusive comparando o o resultado de uma compilação com otimização desligada e com diferentes níveis de otimização ligados). Fazendo isso, pode-se ver, entre outras coisas, como o compilador faz para enviar parâmetros a funções, como uma função pode devolver informações a quem a invocou, como funcionam variáveis globais, variáveis locais estáticas e variáveis locais automáticas (aqui, contrapondo “estática” e “automática” do mesmo modo como faz o padrão da linguagem C; outras linguagens podem usar outra terminologia), qual a diferença entre uma tripa if/else if/.../else e um switch com múltiplos rótulos de case e com ou sem o rótulo default, etc.

Claro que deve existir uma certa habilidade de separar os assuntos, para que o aprendizado de uma coisa não atrapalhe o aprendizado da outra, em lugar de ajudar. Importante também é saber alguma coisa sobre a arquitetura em que se está programando, incluindo aspectos tais como a quantidade e propósito dos diferentes registradores, como os dados de diferentes tipos são representados (inteiros de 8, 16, 32, 64 ou até mais bits, se for o caso, e se/quando eles são usados com sinal ou sem sinal, formatos de ponto flutuante etc.), como funciona a pilha do processador, entre outros. E, claro, é importante que a teoria básica, incluindo algoritmos e estrutura de dados fundamentais, esteja o mais próximo possível de completamente dominada, pois o processo de engenharia reversa tende a ser muito facilitado quando não se perde muito tempo para intuir algoritmos fundamentais e estruturas de dados simples a partir das operações, pois as operações do Assembly são tão mais fundamentais do que as de linguagens de mais alto nível, que a familiaridade com os algoritmos e estruturas de dados fundamentais se torna ainda mais crítica.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


7. Re: Engenharia Reversa e Programação Low Level

César
dark777

(usa Debian)

Enviado em 28/01/2025 - 00:49h

paulo1205 escreveu:

thiago_c escreveu:

Agradeço pela sugestão, vou buscar me aprofundar em C primeiro mesmo, até tinha pensado em pegar aquele livro "C completo e total" que já me disseram que é excelente, talvez o mergulho seja mais fácil de forma lenta e gradual pra acostumar com a pressão. Vou colocar na lista esse livro de Assembly também. Vou deixar o tópico aberto por mais um tempo para pegar mais sugestões de materiais.


Recomendo não usar o C Completo e Total. Apesar da eloquência do autor (que, além de ter um estilo muito fácil de ler, era uma verdadeira máquina de produzir livros sobre diferentes linguagens e dialetos de programação nas décadas de 1980 e 1990 — talvez a grande quantidade e a alta velocidade ajudem a explicar a baixa qualidade), o livro apresenta diversas práticas de programação duvidosas, conceitos errôneos, explicações incorretas, e muitos dos exemplos têm erros tão crassos que os tornam absolutamente inúteis e incompatíveis com a proposta de ensinar a programar adequadamente.

Veja a quarta mensagem neste tópico (de 2016) do fórum do VoL, onde eu apresento links para artigos e referências a respeito do livro e seu autor: https://www.vivaolinux.com.br/topico/C-C++/Iniciante-em-programacao.


Quanto à última pergunta da mensagem original, minha opinião é que é possível, sim, aprender Assembly ao mesmo tempo que outra linguagem. Isso pode inclusive ser muito interessante, de certa forma, com a pessoa vendo como o compilador faz para converter um código em C (ou outra linguagem de alto nível) em linguagem de máquina, através do exame do Assembly que produziria o mesmo código de máquina (por exemplo, com a opção -S do GCC, possivelmente em conjunto com -fverbose-asm, inclusive comparando o o resultado de uma compilação com otimização desligada e com diferentes níveis de otimização ligados). Fazendo isso, pode-se ver, entre outras coisas, como o compilador faz para enviar parâmetros a funções, como uma função pode devolver informações a quem a invocou, como funcionam variáveis globais, variáveis locais estáticas e variáveis locais automáticas (aqui, contrapondo “estática” e “automática” do mesmo modo como faz o padrão da linguagem C; outras linguagens podem usar outra terminologia), qual a diferença entre uma tripa if/else if/.../else e um switch com múltiplos rótulos de case e com ou sem o rótulo default, etc.

Claro que deve existir uma certa habilidade de separar os assuntos, para que o aprendizado de uma coisa não atrapalhe o aprendizado da outra, em lugar de ajudar. Importante também é saber alguma coisa sobre a arquitetura em que se está programando, incluindo aspectos tais como a quantidade e propósito dos diferentes registradores, como os dados de diferentes tipos são representados (inteiros de 8, 16, 32, 64 ou até mais bits, se for o caso, e se/quando eles são usados com sinal ou sem sinal, formatos de ponto flutuante etc.), como funciona a pilha do processador, entre outros. E, claro, é importante que a teoria básica, incluindo algoritmos e estrutura de dados fundamentais, esteja o mais próximo possível de completamente dominada, pois o processo de engenharia reversa tende a ser muito facilitado quando não se perde muito tempo para intuir algoritmos fundamentais e estruturas de dados simples a partir das operações, pois as operações do Assembly são tão mais fundamentais do que as de linguagens de mais alto nível, que a familiaridade com os algoritmos e estruturas de dados fundamentais se torna ainda mais crítica.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


Ja vi pessoal comentando sobre o livro "C completo e Total" nunca o li ou baixei o mesmo, mas acredito que o autor criou um livro para mostrar o que poderia ser escrito em C indiferente da necessidade dentro da engenharia de software, entao existe algumas abordagems em que autores ou professores mostram um exemplo que funciona porem com alguma falha ou limitação, e depois manda os alunos estudarem e praticarem para realmente aprender as coisas da forma como devem ser feitas sem falhas em C89, C99 ou Ansi C de K&R, este livro nunca nem encontrei para baixar, pois para quem gosta de estudar C dizem ser um livro com uma abordagem bem concisa....


wiki.anon






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts