PDA

Ver la Versión Completa : Aplicacion en delphi que se ejecute en el bootexecute


leonelpereda
05-06-2006, 20:36:18
Hola a todos

Necesito hacer una aplicacion que se ejecute en el bootexecute, segun estuve leyendo en ese momento solo pueden ejecutarse aplicaciones "nativa", pero no se como generar una en delphi. Me descargue un ejemplo http://www.sysinternals.com/Files/Native.zip y la explicacion. Incluso lo rescribi en delphi pero no logro que se ejecute en el HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\bootexecute

Alguien me puede ayudar, Gracias

Saludos,
Leonel Pereda

dec
05-06-2006, 21:01:12
Hola,

He estado echando un vistazo al código fuente que enlazas, por cierto, de mi admirado Mark Russinovich (http://sysinternals.com/). A me llaman muchas cosas la atención, pero, para empezar, una de ellas.

Dices que incluso probaste a traducir el código fuente del ejemplo (en lenguaje C) a Delphi, pero que no logras que te funcione el asunto. Ahora bien, ¿cómo se supone que has traducido el código fuente?

Lo digo porque me llama la atención que en el código de Russinovich, en el tipo de proyecto "Aplicación nativa de Windows NT", no existe el punto de entrada "main" habitual en los programas escritos en el lenguaje C.

De hecho, el resultado de la compilación del ejemplo (que también se adjunta), el archivo ejecutable, no lo es bajo Win32, quiere decirse, no parece un ejecutable "al uso".

Entonces, y sin saber absolutamente nada del tema, ¿cómo se supone que has tratado de traducir el código fuente? ¿Has creado una aplicación de "consola"? Pero esta no cuenta con el método "principal" conque cuenta el código fuente de Russinovich, y de hecho crea un ejecutable para Win32,... lo contrario que el código fuente de Russinovich.

En definitiva, lo que me gustaría saber es qué has intentado, más que nada por ver si a partir de ahí se puede aportar algo, y, por otro lado, me planteo si no será que con Delphi no se pueda llevar a cabo una "Aplicación nativa para Windows NT", simple y llanamente.

seoane
05-06-2006, 21:17:33
Delphi no puede generar ese tipo de ejecutables por si mismo, pero puede que en esta pagina encuentres algo de informacion http://hxdef.org/download.php En ella puedes encontrar una serie de "trucos" y herramientas para crear un driver utilizando Delphi. Ya se que no quieres hacer un driver pero leyendo el articulo de Russinovich parece que utiliza el DDK (Driver Development Kit) para construir su ejecutable, asi que por ahi debe de estar la clave.

Asi lo describen en la pagina:

Fourth release of DDDK. Still just proof of concept showing the possibility of making working Delphi driver. There are several improvements in this version that made possible to rewrite hook1, hook2 and hook3 from Driver coding tutorial to Delphi.


PD: La pagina es del mismo programador que creo el "Hacker Defender" un famoso RootKit, es interesante echarle un vistazo aunque solo sea para ver las tecnicas que usan estos "bichitos" :)

dec
05-06-2006, 21:26:27
Hola,

Así es como dice Seoane. Es posible que pueda lograrse algo a partir de eso. Suena interesante eso de las "aplicaciones nativas", lo malo es que como dice Russinovich la documentación sea poca e incompleta.

En todo caso me quedo con lo que al final del artículo de Russinovich (que por cierto, es este (http://www.sysinternals.com/Information/NativeApplications.html)) se dice, y es que "If you want to build Native you must have the Windows NT Device Driver Kit. Copy the makefile.def included with Native's sources to \ddk\inc and then you can run Build.".

O sea, que lo que dice Seoane tiene buena pinta, en lo que toca a Delphi. Y, por otro lado, tal vez para lo que se pretenda hacer baste y sobre con el "Windows NT Device Driver Kit (http://www.microsoft.com/whdc/devtools/ddk/default.mspx)" ese, del que, por cierto, no sabía nada hasta esta tarde. :D

leonelpereda
05-06-2006, 21:34:01
Dices que incluso probaste a traducir el código fuente del ejemplo (en lenguaje C) a Delphi, pero que no logras que te funcione el asunto. Ahora bien, ¿cómo se supone que has traducido el código fuente?


Si de hecho si traduje el codigo de sysinternals a delphi,


// (c) Alex Konshin mailto:alexk@mtgroup.ru (alexk@mtgroup.ru) 20 jul 2000
program NativeApp;
// PURPOSE: Simple Windows NT/2000 console application that calls Native API functions
{$APPTYPE CONSOLE}
uses
Windows, SysUtils, ntdll;
var Heap : THANDLE;

procedure NtProcessStartup(Argument : PStartUp_Argument);
var
CommandLine : PNtUnicodeString;
StringBuffer,
ArgPtr : PWideChar;
HelloWorld : TNtUnicodeString;
HeapParams : TRTL_Heap_Definition;
begin
//
// Initialize some heap
//
FillChar(HeapParams, SizeOf(TRTL_Heap_Definition), 0);
HeapParams.Length := SizeOf(TRTL_Heap_Definition);
Heap := RtlCreateHeap( 2, 0, $100000, $1000, 0, @heapParams );

//
// Point at command line
//
CommandLine := @(Argument^.Environment.CommandLine);
//
// Locate the argument
//
ArgPtr := CommandLine.Buffer;
while (ArgPtr[0] <> ' ') do Inc(ArgPtr);
Inc(ArgPtr);
//
// Print out the argument
//
StringBuffer := RtlAllocateHeap( Heap, 0, 256 );
//swprintf( stringBuffer, L"\n%s", argPtr );
HelloWorld.Buffer := stringBuffer;
HelloWorld.Length := Length(StringBuffer) * SizeOf(WideCHAR);
HelloWorld.MaximumLength := HelloWorld.Length + SizeOf(WideCHAR);
RtlDisplayString( @helloWorld );
//
// Free heap
//
RtlFreeHeap( Heap, 0, stringBuffer );
//
// Terminate
//
RtlTerminateProcess( THandle(-1), 0 );
end;
end.



Lo digo porque me llama la atención que en el código de Russinovich, en el tipo de proyecto "Aplicación nativa de Windows NT", no existe el punto de entrada "main" habitual en los programas escritos en el lenguaje C.


Si, a mi tambien me sorprendio, pero segun lo que entendi que explican en la pagina de sysinternal es que este tipo de aplicacion no necesita main que solo con la funcion NtProcessStartup la utilizan como entrada, parecido a una dll,



De hecho, el resultado de la compilación del ejemplo (que también se adjunta), el archivo ejecutable, no lo es bajo Win32, quiere decirse, no parece un ejecutable "al uso".


De hecho apesar de que trae extension ".exe" no es una aplicacion Win32, incluso si la tratas de ejecutar directamente te marca error.


Entonces, y sin saber absolutamente nada del tema, ¿cómo se supone que has tratado de traducir el código fuente? ¿Has creado una aplicación de "consola"? Pero esta no cuenta con el método "principal" conque cuenta el código fuente de Russinovich, y de hecho crea un ejecutable para Win32,... lo contrario que el código fuente de Russinovich.

En definitiva, lo que me gustaría saber es qué has intentado, más que nada por ver si a partir de ahí se puede aportar algo, y, por otro lado, me planteo si no será que con Delphi no se pueda llevar a cabo una "Aplicación nativa para Windows NT", simple y llanamente.


Arriba te relacione parte del fuente que traduje y ademas trate de contactar con Mark Russinovich (mark@sysinternals.com) pero no obtuve mucha ayuda.

dec
05-06-2006, 21:43:16
Hola,


Si, a mi tambien me sorprendio, pero segun lo que entendi que explican en la pagina de sysinternal es que este tipo de aplicacion no necesita main que solo con la funcion NtProcessStartup la utilizan como entrada, parecido a una dll,


Así lo entendí yo también, pero...


De hecho apesar de que trae extension ".exe" no es una aplicacion Win32, incluso si la tratas de ejecutar directamente te marca error.


Pues no sé qué decirte. El código que muestras comienza con un "program ...", lo que da a entender que no resultará en un archivo "DLL", sino en un archivo ejecutable... me temo que para Win32. ¿O me estoy perdiendo algo? :D

dec
05-06-2006, 21:47:38
Hola,

Me llama la atención del código que has expuesto el comentario siguiente:


PURPOSE: Simple Windows NT/2000 console application that calls Native API functions


Es decir, se deja claro que es una aplicación de "consola" para Windows, que va a utilizar ciertas funciones del API "nativa" (de NT, supongo), pero, no se puede extrapolar de ahí que lo que se vaya a producir sea una aplicación "nativa" propiamente dicha. ¿O me equivoco? ;)

O sea, que:


Si de hecho si traduje el codigo de sysinternals a delphi,


No puede considerarse correcto (si no me equivoco), puesto que el código de más arriba hace uso de funciones de que también se hace uso en el ejemplo de Russinovich, pero el ejemplo de Russinovich es, propiamente, una aplicación "nativa" para Windows NT, y el código de ejemplo que tú has expuesto es el de una aplicación de tipo "consola" para Win32.

leonelpereda
05-06-2006, 21:57:28
No puede considerarse correcto (si no me equivoco), puesto que el código de más arriba hace uso de funciones de que también se hace uso en el ejemplo de Russinovich, pero el ejemplo de Russinovich es, propiamente, una aplicación "nativa" para Windows NT, y el código de ejemplo que tú has expuesto es el de una aplicación de tipo "consola" para Win32.

Por supuesto que el codigo que les he enviado es solo un intento que evidentemente no esta correcto o esta incompleto, de hecho es el tema del hilo, en ese ejemplo solo traduje "literalmente" a delphi el ejemplo de sysinternal. Pero como explicaba en mi mensaje inicial cuando compilo esto en delphi me genera una aplicacion win32 y no una nativa.

dec
05-06-2006, 22:40:13
Hola,


Pero como explicaba en mi mensaje inicial cuando compilo esto en delphi me genera una aplicacion win32 y no una nativa.


Pues entonces habrá que concluir que con Delphi no pueden generarse este tipo de aplicaciones "nativas". Vamos, ni con Delphi ni con Visual Studio 2005 con ninguno de los lenguajes que soporta. Estos son los entornos en que he podido "intentar" crear una aplicación "nativa" y no lo he conseguido.

Habría que seguir la pista sobre la que nos pone Seoane, o, en su defecto, utilizar el Windows "NT Device Driver Kit (http://www.microsoft.com/whdc/devtools/ddk/default.mspx)". Vamos, digo yo, ¿eh? Se adminten otras sugerencias. ;)

leonelpereda
05-06-2006, 23:02:26
Gracias David por tus aportes