::Engenharia Reversa::

10/03/2003

0

[b:96ad151664]Alguém sabe como gerar o código fonte de um aplicativo .exe?[/b:96ad151664]

É o seguinte tenho um CD aqui que era um antigo projeto da faculdade, só que não consegui localizar os fontes e não tenho backup do tal aplicativo.
Será que consigo algo que gere os fontes deste aplicativo?
Alguém tem alguma idéia?


Ericoak

Ericoak

Responder

Posts

10/03/2003

Anonymous

vou logo avisando que é perda de tempo. nao tem como descompilar um programa delphi, quer dizer, tem sim, mas é para assembler e eu acho que voce nao vai tentar decifrar milhoes de 1 e 0 vai?
é isso procurar é perda de tempo, nao tem como.


Responder

10/03/2003

Aroldo Zanela

[b:921e998ecd]Alguém sabe como gerar o código fonte de um aplicativo .exe?[/b:921e998ecd] É o seguinte tenho um CD aqui que era um antigo projeto da faculdade, só que não consegui localizar os fontes e não tenho backup do tal aplicativo. Será que consigo algo que gere os fontes deste aplicativo? Alguém tem alguma idéia?



Caro,

Peguei o texto abaixo para você dar uma olhada. É de 2001, mas:

[list:921e998ecd]
Os amigos de lista de discussão já não aguentam mais ouvir falar nisso !
Certos são eles, que sabem que milagres não acontecem, porém, programadores
iniciantes ou acostumados com Clipper e VB, querem ver os fontes de todos os
programas, a qualquer custo. Afinal, estes descompiladores existem ou não
??? Sobre isso estarei falando neste arigo.

O absurdo foi tanto, que ouviu-se até uma história onde o programador chegou
a fazer um depósito, para ou suposto hacker, que dizia ter um descompilador.
Após feito o depósito e enviado o comprovante via e-mail para uma conta
WebMail, o programador recebeu um softare que recuperava as .DFM (Delphi
From). DFM esse, que pode ser recuperado por um programa que vem no
diretório Demos do Delphi, o ResXplo.

Linguagen como o Clipper, não geram código de máquina, ou seja, elas não
compilam, só transcrevem, portanto, precisam dos ´run times´, no VB são os
VbRun300.dll, VbRun500.dll, no Clipper são as declarações no autoexec.
Delphi, C e Java são exemplos de linguágens que geram código de máquina.

:Isso significa que é impossivel uma engenharia reversa ???

Não, recuperar os códigos destes projetos é muito fácil, porém, só se pode
retorna-los para Assembler, uma vez que o código de máquina já é um código
binário.

:Como é possivel recuperar um DFM de um exe ???

As DFMs fazem parte da tabela de recursos do arquivo (Resource), regenera-se
lógicamente os nomes e propriedades dos objetos. :O que são Resources ???

Resources são as informações que não podem ou não devem ser compiladas. Como
as imagens, estas não podem ser compiladas, uma vez que seus conjuntos de
bits formam o seu conteúdo.

Todo programa Win32 tem resources, onde são normalmente encontradas: a
tabela de recursos aceleradores, os cursores, ícones, caixas de dialogo
(janelas), fontes, menus, mensagens de erro e finalmente, as informações de
versão. Na resource de um arquivo, todos estes itens podem ser lidos e
modificados ! Porém, sobre isso estarei falando em outro artigo, neste
tratamos sobre descompiladores delphi.

:Como é um código em Assembler ???

mov
mov
call
cmp
jnz
xor
mov
eax, [ebx+$02E0]
edx, [eax]
dword ptr [edx+$00B4]
al, $01
0044679B
edx, edx
eax, ebx



Este é um verificar Assembler, um If. Por ser uma linguágem baixo nível, não
existem comandos específicos, como if ou while, tudo é feito atravéz dos
valores nos registradores. Portanto, fazer um programa windows totalmente em
assembler é totalmente inviável, diria que impossivel, uma vez que assembler
não tem bibliotécas.

Para se ter uma noção do que é um projeto Delphi compilado; tenho um projeto
com 22 linhas de código escrito por mim. Este mesmo projeto compilado, e
depois revertirdo para Assembler, ficou com aproximadamente 15.000 linhas.
Agora, se imagine descompilando um projeto gigantesco, ou simplismente
grande.

:Como fica um código de um projeto Delphi em Assembler ???

Veja este exemplo:

push
mov
push
push
push
mov
mov
xor
push
push
push
mov
lea
movzx
call
mov
mov
call
xor
pop
pop
pop
mov
push
lea
call
ret
jmp
jmp
pop
pop
pop
ret

ebp
ebp, esp
$00
ebx
esi
esi, ecx
ebx, eax
eax, eax
ebp
$00425B14
dword ptr fs:[eax]
fs:[eax], esp
edx, [ebp-$04]
eax, word ptr [esi]
004063E8
edx, [ebp-$04]
eax, [ebx+$01DC]
00415B1C
eax, eax
edx
ecx
fs:[eax], edx
$00425B1B
eax, [ebp-$04]
00403518

00402FBC
00425B0B
esi
ebx
ecx
ebp
$04

Este código captura o valor de uma tecla, e o passa para uma variável, no
caso do projeto, numa panel. Veja agora, que código Delphi, esse código
Assembler representa:

procedure TKEYVIEW.FormKeyDown(Sender: TObject; var Key: Word; Shift:
TShiftState);
begin
label1.caption:=inttostr(key);
end;

Importante observar, que o código Assembler na verdade é maior. Neste código
apresentado, ele está supondo que certas condições já existam. Este projeto,
depois de compilado e revertido para Assembler, ficou com 9.471 linhas em
assembler.

Você consegue se imaginar descompilando um sistema inteiro ???

Além disso tudo, não basta você trazê-lo para o Assembler, você TEM que
SABER Assembler realmente !

:Mas alguns amigos meus disseram ter descompiladores que criam o .PAS.. ?!?

Realmente, alguns descompiladores Delphi regeneram o .PAS. Destes
descompiladores gostaria de resaltar que existem 3 tipos:

O primeiro tipo é o ´declarador´, que recupera o .PAS, porém, só traz as
declarações em pascal, o código realmente ele traz em Assembler. Veja o
exemplo:

procedure TKEYVIEW.FormKeyDown(Sender: TObject; var Key: Word; Shift:
TShiftState);
begin
{ 00425ACC 55 push ebp
00425ACD 8BEC mov ebp, esp
00425ACF 6A00 push $00
00425AD1 53 push ebx
00425AD2 56 push esi
00425AD3 8BF1 mov esi, ecx
00425AD5 8BD8 mov ebx, eax
00425AD7 33C0 xor eax, eax
00425AD9 55 push ebp
00425ADA 68145B4200 push $00425B14
00425ADF 64FF30 push dword ptr fs:[eax]
00425AE2 648920 mov fs:[eax], esp
00425AE5 8D55FC lea edx, [ebp-$04]
00425AE8 0FB706 movzx eax, word ptr [esi]
00425AEB E8F808FEFF call 004063E8
00425AF0 8B55FC mov edx, [ebp-$04]
00425AF3 8B83DC010000 mov eax, [ebx+$01DC]
00425AF9 E81E00FFFF call 00415B1C
00425AFE 33C0 xor eax, eax
00425B00 5A pop edx
00425B01 59 pop ecx
00425B02 59 pop ecx
00425B03 648910 mov fs:[eax], edx
00425B06 681B5B4200 push $00425B1B
00425B0B 8D45FC lea eax, [ebp-$04]
00425B0E E805DAFDFF call 00403518
00425B13 C3 ret
00425B14 E9A3D4FDFF jmp 00402FBC
00425B19 EBF0 jmp 00425B0B
00425B1B 5E pop esi
00425B1C 5B pop ebx
00425B1D 59 pop ecx
00425B1E 5D pop ebp
00425B1F C204 ret $04
} end ;

O segundo tipo é o que eu diria mais adequado. Ele retorna as declarações,
traz novamente o código Assembler, porém, tenta explicar cada parte do
código, veja o exemplo:

procedure TKEYVIEW.FormKeyDown(Sender: TObject; var Key: Word; Shift:
TShiftState);
begin
{ 00425ACC 55 push ebp
00425ACD 8BEC mov ebp, esp
00425ACF 6A00 push $00
00425AD1 53 push ebx
00425AD2 56 push esi
00425AD3 8BF1 mov esi, ecx
00425AD5 8BD8 mov ebx, eax
00425AD7 33C0 xor eax, eax
00425AD9 55 push ebp
00425ADA 68145B4200 push $00425B14

***** TRY
|
00425ADF 64FF30 push dword ptr fs:[eax]
00425AE2 648920 mov fs:[eax], esp
00425AE5 8D55FC lea edx, [ebp-$04]
00425AE8 0FB706 movzx eax, word ptr [esi]

* Reference to: Sysutils.IntToStr(Integer)
|
00425AEB E8F808FEFF call 004063E8
00425AF0 8B55FC mov edx, [ebp-$04]

* Reference to control TKEYVIEW.Label1 : TLabel
|
00425AF3 8B83DC010000 mov eax, [ebx+$01DC]

* Reference to: Controls.TControl.SetText(System.AnsiString)
|
00425AF9 E81E00FFFF call 00415B1C
00425AFE 33C0 xor eax, eax
00425B00 5A pop edx
00425B01 59 pop ecx
00425B02 59 pop ecx
00425B03 648910 mov fs:[eax], edx

****** FINALLY
|
00425B06 681B5B4200 push $00425B1B
00425B0B 8D45FC lea eax, [ebp-$04]
00425B0E E805DAFDFF call 00403518
00425B13 C3 ret
00425B14 E9A3D4FDFF jmp 00402FBC
00425B19 EBF0 jmp 00425B0B

****** END
|
00425B1B 5E pop esi
00425B1C 5B pop ebx
00425B1D 59 pop ecx
00425B1E 5D pop ebp
00425B1F C204 ret $04
}
end ;

Este código realmente é bem digestivo, lendo assim, podemos enteder melhor
do que se trata. Podemos inclusive, ver que para o próprio descompilador,
certas funções devem ser escritas em blocos protegidos.

Obs:Este exemplo, ainda se trata do projeto que recupera o código da tecla
prescionada na edit.

Já o terceiro tipo, esse é o pior deles, retorna apenas o código Pascal,
porém ele faz uma bagunça gigantesca, interpreta mal, escreve
desordenadamente, se basea em informações catadas ao montes, enfim, esse é
totalmente descartável.

:Afinal, existe ou não descompilador de Delphi ???

Existir existe, mas quem disse que funciona direito.. os descompiladores que
existem geram isto que mostrei ao longo deste artigo. Ou seja, eles
realmente descompilam o projeto Delphi, porém não o transforma em projeto
Delphi novamente, apenas o trazem para Assembler, e .DFM.

Ainda lhe resta alguma dúvida ???

Entre em contato !!

Se você quer realmente descompilar, ver fontes, mudar tudo, leia meu artigo
´Eu vi seu Resource´.


A cópia fiel e a distribuição completa deste artigo é permitida em qualquer
meio, desde que esta nota seja preservada:

24 Fev 2001 - Ctrl+F9, caminho sem volta
Por Tiago G. Nikon (tgnikon@bigfoot.com) -
http://www.tg.nikon.nom.br/delphidimilo
[/list:u:921e998ecd]


Responder

11/03/2003

Ericoak

Pessoal,

Obrigado pelas dicas.
Vou desistir e refazer tudo de novo... :(

Obrigado

Erico


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar