descompilar o compilado [RESOLVIDO]

1. descompilar o compilado [RESOLVIDO]

felipe silva
lipman

(usa Debian)

Enviado em 19/05/2016 - 21:45h

boas...
bom estou pressisando de um decompiler para que eu possa pegar o codigo de um programa que eu criei a um tempo atras, mas não guardei o codigo, hoje gostaria de fazer umas mudanças nesse programa, mas não posso, pois não tenho o fonte, e refazer-lo de novo vai dar muito o que pensar!
agradeço desde já!
linguagem C


  


2. Re: descompilar o compilado [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/05/2016 - 23:11h

Sei como é! HAHA
Mano, o "Snowman" quebra sse galho, também tem o "Boomerang", mas dependendo da compilação (de como foi compilado) o code pode ser descompilado totalmente desestruturado, faça os testes ai.

--
Just bring us some beers, and then we can talk about our systems. :)



3. Re: descompilar o compilado [RESOLVIDO]

felipe silva
lipman

(usa Debian)

Enviado em 20/05/2016 - 00:22h

amigo, eu não consegui usar esses programas não!
teria uma dica para usar?
não sei ingles!


4. Re: descompilar o compilado

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/05/2016 - 09:41h

Achei muito interessante a descompilação do “Hello, World!”, listado entre os exemplos do Snowman.

Tudo bem que boa parte do monstro inclui a descompilação do código de inicialização que executa antes de main() ser chamada e também do código de finalização que executa após o seu retorno. Será que precisaria mostrar isso? Já que mostra, poderia tentar acertar mais pelo menos os tipos dos dados. Destaco aqui algumas das coisas que eu achei mais exóticas:

void frame_dummy() {
if (__JCR_END__ == 0 || 1) { // <-- Condição sempre verdadeira. Para que o if?
return;
} else {
goto 0; // <-- Hein?!!
}
}

int64_t __gmon_start__ = 0;

void call_gmon_start() {
int64_t rax1; // <-- O tipo deveria ser “void (*)(void)”, não inteiro.

rax1 = __gmon_start__;
if (rax1 != 0) {
rax1(); // <-- Chama um inteiro? Não vai compilar...
}
return; // <-- Comando inócuo.
}

void __do_global_dtors_aux() {
uint64_t rax1; // <-- Note que é unsigned.
uint64_t rax2;

if (completed_6341 == 0) {
rax1 = dtor_idx_6343;
if (0 > rax1) { // <-- Se rax1 é unisgned, zero nunca será maior que ela.
do {
rax2 = rax1 + 1;
dtor_idx_6343 = rax2;
*(int64_t*)(rax2 * 8 + 0x6006b0)(); // <-- Invoca inteiro? E para que o cast no valor retornado?
rax1 = dtor_idx_6343;
} while (rax1 < 0); // <-- De novo: essa condição será sempre falsa.
}
completed_6341 = 1;
}
return;
}


Não me entendam mal, contudo. Os absurdos acima, reitero, aconteceram com código que não estava “dentro” do programa original em C. Se você precisa realmente reconstruir o algoritmo original a partir do executável e não é capaz de entender o Assembly por conta própria, um descompilador como esse pode ser sua melhor opção.

Mas prepare-se para filtrar e reinterpretar tudo o que ele lhe mostrar -- especialmente se o executável que você submeter a ele tiver sido compilado com otimização ligada.


5. Re: descompilar o compilado [RESOLVIDO]

felipe silva
lipman

(usa Debian)

Enviado em 20/05/2016 - 13:58h

é... acho melhor reconstruir do 0 mesmo...
obrigado pelas explicações =D






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts