Page 2 of 2

Re: Otra forma de leer una DLL

PostPosted: Wed Oct 12, 2011 1:32 am
by devtuxtla
Hola Willi.

Ya habia probado esta opcion, sin embargo el .EXE generado, es detectado por algunos antivurus (www.avira.com) como un virus.

Por lo tanto, por ahora y mientras no corrigan esta problema no podemos usarlo.

Tambien, para el conocimiento de quienes usan esta herramienta, ellos comentan que todo lo hacen en memoria, sin embargo, cada vez que utilizan un DLL, esta se desempaca en area temporal de usuario, asi que la DLL si se escribe en el HDD, aun que sea en un area tempoal.

Sin embargo es una buena alternativa.

Alguna otra idea ?

Saludos

Re: Otra forma de leer una DLL

PostPosted: Wed Oct 12, 2011 7:09 pm
by acuellar
devtuxtla

Hasta que actualices tu FWH podes salir con esta función de Biel y modificada por Daniel para restaurar el archivo incrustado en una direccion especifica.

En el programa principarl
Code: Select all  Expand view

Function Main()
  If !FILE("C:\WINDOWS\FREEIMAGE.DLL")
    RESTFILEI( "C:\WINDOWS\FREEIMAGE.DLL" )
  Endif
  If !FILE( "C:\WINDOWS\PREV32.DLL" )
     RESTFILEP( "C:\WINDOWS\PREV32.DLL" )
  Endif
*....
Return
*
#pragma BEGINDUMP
#include <Windows.h>
#include <mapiwin.h>
#include <hbApi.h>

HB_FUNC( RESTFILEI )
{
   HRSRC res=FindResource(NULL,"FREEIMAGE",RT_RCDATA);
   DWORD bytesWritten;
   INT size=SizeofResource(NULL,res);
   HGLOBAL hRes=LoadResource(NULL,res);
   unsigned char *pRes=(unsigned char *)LockResource(hRes);
   const char * name = hb_parc( 1 );
   HANDLE hFile=CreateFile( name, GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
   WriteFile(hFile, pRes,size,&bytesWritten,NULL);
   CloseHandle(hFile);
}
#pragma ENDDUMP
**
#pragma BEGINDUMP
#include <Windows.h>
#include <mapiwin.h>
#include <hbApi.h>

HB_FUNC( RESTFILEP )
{
   HRSRC res=FindResource(NULL,"PREV32",RT_RCDATA);
   DWORD bytesWritten;
   INT size=SizeofResource(NULL,res);
   HGLOBAL hRes=LoadResource(NULL,res);
   unsigned char *pRes=(unsigned char *)LockResource(hRes);
   const char * name = hb_parc( 1 );
   HANDLE hFile=CreateFile( name, GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
   WriteFile(hFile, pRes,size,&bytesWritten,NULL);
   CloseHandle(hFile);
}
#pragma ENDDUMP

 


El archivo .RC
Code: Select all  Expand view

ICON_1 ICON "MIAPLICA.ICO"
FREEIMAGE RCDATA "D:\SISTEMAS\DLLS\FREEIMAGE.DLL"
PREV32 RCDATA "D:\SISTEMAS\DLLS\PREV32.DLL"
 


Lo interesante seria mandar otro parametro que lleve el nombre del RCDATA a la función para no crear varias, no se como se hace.
Ej: RESTFILE("C:\WINDOWS\FREEIMAGE.DLL","FREEIMAGE")

No olvides comprimir tus archivos con UPX para que el .EXE no sea muy grande.

Espero te sirva.

Saludos,

Adhemar