Desviando execução

Delphi

03/05/2004

Existe alguma forma de deviar a execução do programa para qualquer parte do mesmo programa, usando um comando do tipo ´execute as informações apartir( 10124 Bytes)´


Ou seja executar da aqueles bytes do programa pra frente!!!! :roll:


Rodrigovollo

Rodrigovollo

Curtidas 0

Respostas

Beppe

Beppe

03/05/2004

É possível sim, mas é totalmente inusitado ter que fazer isso, sem contar que é uma tarefa altamente propensa a erros.


GOSTEI 0
Rodrigovollo

Rodrigovollo

03/05/2004

É possível sim, mas é totalmente inusitado ter que fazer isso, sem contar que é uma tarefa altamente propensa a erros.



Mais eai como é q eu vou fazer isso ????????????. por onde eu começo??


GOSTEI 0
Beppe

Beppe

03/05/2004

asm jmp $12345678 end;



GOSTEI 0
Blivio

Blivio

03/05/2004

A sintaxe é essa mesma? Dá erro.


GOSTEI 0
Rodrigo_rcp

Rodrigo_rcp

03/05/2004

A sintaxe é essa mesma? Dá erro.


é apenas um exemplo.


GOSTEI 0
Beppe

Beppe

03/05/2004

É, é sim...o assembly do Delphi deveria compilar isto(não testei). Como é pra dar pau mesmo, tenta usar call.

asm call $12345678 end;


Lógico que este endereço não contém códigos executáveis, então não espere nenhum resultado não-catastrófico...


GOSTEI 0
Blivio

Blivio

03/05/2004

Prezado amigo, tanto usando JMP como CALL, dá o seguinte erro: [b:a0b5f653d9]Invalid combination of opcode and operands[/b:a0b5f653d9].

Se puder ajudar, agradeço muito.


Atenciosamente,

Blivio.


GOSTEI 0
Rodrigovollo

Rodrigovollo

03/05/2004

É, é sim...o assembly do Delphi deveria compilar isto(não testei). Como é pra dar pau mesmo, tenta usar call.
asm call $12345678 end;


Vou testar se isso vai dar certo, depois eu posto aqui... :wink:


GOSTEI 0
Beppe

Beppe

03/05/2004

No caso do Delphi, call´s e jmp´s recebem sempre(leia-se: só faz sentido) um nome(label ou nome de função). Eu nunca tinha feito passando um endereço imediato. O Delphi usa uma sintaxe diferente em alguns casos, talvez
call [$12345678]

ou
mov eax, $12345678
call eax

Eu ainda só não entendi pq desta necessidade... :?:


GOSTEI 0
Tatuweb

Tatuweb

03/05/2004

Colegas,

há diferença entre as instruções assembly. A que mais se encaixa seria:
[color=olive:2ac3ed9a6a]JMP DWORD PTR [$12345678][/color:2ac3ed9a6a]

Isso é diferente de
[color=olive:2ac3ed9a6a]JMP DWORD PTR $12345678[/color:2ac3ed9a6a]

que é diferente de
[color=olive:2ac3ed9a6a]MOV EAX, $12345678
CALL EAX[/color:2ac3ed9a6a]

que é diferente de muitas outras combinações. A instrução JMP $12345678 postada pelo Beepe não está errada. Só que ela não é permitida usando o assembler inline. Se fosse compilada no MASM, por exemplo, não geraria erro nenhum. Lembre-se Assembler Inline não é o mesmo que Assembly. Outra coisa: as instruções de um programa não começa no inicio do arquivo. Portanto

Existe alguma forma de deviar a execução do programa para qualquer parte do mesmo programa, usando um comando do tipo ´execute as informações apartir (10124 Bytes)´


não vai funcionar. Todos os arquivos executáveis Win32 obedecem a um padrão de formato que chamamos de PE (Portable Executable). Sendo assim para que vc inicie um segundo EXE embutido vc teria que inicialmente descobrir o ´Entry Point´ do exe1 e modificar afim de apontá-lo para o ´Entry Point´ do seu EXE e, após executadas as intruções do seu EXE apontar novamente para que execute as instruções do EXE1.

Sabe quando vc vai conseguir o que pretende usando assembler inline? Só quando o tio Bill aderir ao OpenSource :) ou seja, nunca. Ou vc faz o programa em assembly (talvez em VC++) ou esqueça.

Sinceramente, até hoje só vi um tipo de aplicação utilizar isso: vírus. Se o seu objetivo não é esse, vc pode por exemplo guardar o EXE em forma de recurso e extraí-lo quando quiser executa-lo. Não é viável mas é o que se pode fazer. Em se tratando de programação sempre haverá uma segunda opção para se criar uma rotina. Diga o que quer fazer e tentaremos ajudar.

:?: :?:


GOSTEI 0
Rodrigovollo

Rodrigovollo

03/05/2004

Colegas, há diferença entre as instruções assembly. A que mais se encaixa seria: [color=olive:d07af69204]JMP DWORD PTR [$12345678][/color:d07af69204] Isso é diferente de [color=olive:d07af69204]JMP DWORD PTR $12345678[/color:d07af69204] que é diferente de [color=olive:d07af69204]MOV EAX, $12345678 CALL EAX[/color:d07af69204] que é diferente de muitas outras combinações. A instrução JMP $12345678 postada pelo Beepe não está errada. Só que ela não é permitida usando o assembler inline. Se fosse compilada no MASM, por exemplo, não geraria erro nenhum. Lembre-se Assembler Inline não é o mesmo que Assembly. Outra coisa: as instruções de um programa não começa no inicio do arquivo. Portanto [quote:d07af69204]Existe alguma forma de deviar a execução do programa para qualquer parte do mesmo programa, usando um comando do tipo ´execute as informações apartir (10124 Bytes)´


não vai funcionar. Todos os arquivos executáveis Win32 obedecem a um padrão de formato que chamamos de PE (Portable Executable). Sendo assim para que vc inicie um segundo EXE embutido vc teria que inicialmente descobrir o ´Entry Point´ do exe1 e modificar afim de apontá-lo para o ´Entry Point´ do seu EXE e, após executadas as intruções do seu EXE apontar novamente para que execute as instruções do EXE1.

Sabe quando vc vai conseguir o que pretende usando assembler inline? Só quando o tio Bill aderir ao OpenSource :) ou seja, nunca. Ou vc faz o programa em assembly (talvez em VC++) ou esqueça.

Sinceramente, até hoje só vi um tipo de aplicação utilizar isso: vírus. Se o seu objetivo não é esse, vc pode por exemplo guardar o EXE em forma de recurso e extraí-lo quando quiser executa-lo. Não é viável mas é o que se pode fazer. Em se tratando de programação sempre haverá uma segunda opção para se criar uma rotina. Diga o que quer fazer e tentaremos ajudar.

:?: :?:[/quote:d07af69204]


Beleza!!! Mas não entendi uma coisa porque uma pessoa q desenvolve um virus consegue fazer isso e eu nunca vou conseguir fazer isso :shock:


GOSTEI 0
Nildo

Nildo

03/05/2004

NUNCA diga ´NUNCA´.
nâo é que você não vá conseguir, é que existem pessoas que realmente levam jeito pra coisa. Esse tipo de pessoa que faz virus, não é alguem normal. Os melhores nunca resolvem do nada desenvolver um virus. Eles são pagos por, na maioria das vezes, empresas de anti virus para desenvolver virus maléficos. Se eles são contratados, quer dizer que não são qualquer um.


GOSTEI 0
Rodrigovollo

Rodrigovollo

03/05/2004

NUNCA diga ´NUNCA´. nâo é que você não vá conseguir, é que existem pessoas que realmente levam jeito pra coisa. Esse tipo de pessoa que faz virus, não é alguem normal. Os melhores nunca resolvem do nada desenvolver um virus. Eles são pagos por, na maioria das vezes, empresas de anti virus para desenvolver virus maléficos. Se eles são contratados, quer dizer que não são qualquer um.



Só acho o seguinte eu não vou para de tentar vou achar um jeito
se ele faz eu tb vou fazer !!!!!!!!


GOSTEI 0
Beppe

Beppe

03/05/2004

[quote:04463fdb3f=´nildo´]NUNCA diga ´NUNCA´. nâo é que você não vá conseguir, é que existem pessoas que realmente levam jeito pra coisa. Esse tipo de pessoa que faz virus, não é alguem normal. Os melhores nunca resolvem do nada desenvolver um virus. Eles são pagos por, na maioria das vezes, empresas de anti virus para desenvolver virus maléficos. Se eles são contratados, quer dizer que não são qualquer um.



Só acho o seguinte eu não vou para de tentar vou achar um jeito
se ele faz eu tb vou fazer !!!!!!!![/quote:04463fdb3f]
Jeito de fazer o q? Já foi lhe dito como desviar a execução...e o q falta?


GOSTEI 0
Khundalini

Khundalini

03/05/2004

Resumindo: isso só é possível editando o código do executável em Assembly. Pedir pro Delphi fazer isso, creio que seja impossível. O Delphi não é preparado pra esse tipo de operãção. E mais, se alguém conseguir fazer isso em assembly built-in do Object Pascal, vai ser a custo de muita queimação de neurônio, pois o programa terá que ser muito inteligente pra prever como o código será organizado nas seções do programa executável, coisa que quem organiza é o compilador.

[]s
Rubem Rocha
Manaus, AM


GOSTEI 0
Tatuweb

Tatuweb

03/05/2004

Beleza!!! Mas não entendi uma coisa porque uma pessoa q desenvolve um virus consegue fazer isso e eu nunca vou conseguir fazer isso :shock:


Só um esclarecimento. Talvez eu tenha sido mal interpretado. Não quiz dizer que vc nunca faria isso. Normalmente os vírus que se utilizam dessa técnica são escrito em assembly, usando compiladores como MASM, TASM ou NASM. Com o advento do VBS da Micro$oft essa técnica saiu de moda e hj quase não se vê mais vírus do tipo infectadores de executáveis. Então quando eu disse que vc nunca faria isso eu quiz dizer que nunca, ou melhor, dificilmente faria isso no delphi, mas utilizando outros compiladores seria perfeitamente possível.


GOSTEI 0
POSTAR