elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Re: Llamar a una funcion de una DLL cargada dinamicamente en: 13 Julio 2021, 13:11 pm
Gracias RayR por tus comentarios.
Se trata de un interprete, o sea, en tiempo de ejecucion va a cargar un dll y llamar a funciones, no es ningun ejemplo para practicar.
Es cierto que no se que pasara cuando el parametro en punto flotante, veremos cuando use una dll para graficos 3d y como podria solucionar lo
aca subi el proyecto porque ya funciona !
https://github.com/phreda4/r3evm

Bien por el codigo generadp por Eternal Idol, cuando construya el compilador voy a necesitar realizar esto automaticamente, aunque quizas tome el mismo camino que el interprete al inicio, una funcion por cada cantidad de parametros.
El compilador de las versiones anteriores no usaba este mecanismo.

2  Programación / Programación C/C++ / Re: Llamar a una funcion de una DLL cargada dinamicamente en: 12 Julio 2021, 15:57 pm
habia entendido mal !
trataba de llamar a GetProcAddressA !!!!

3  Programación / Programación C/C++ / Re: Llamar a una funcion de una DLL cargada dinamicamente en: 12 Julio 2021, 15:04 pm
Ante todo, gracias por la respuesta.

efectivamente me da 0 el getprocaddress, pero parece que no existe la version A, en todo caso mas raro aun es que dentro del interprete parace estar funcionando ya que obtengo valores

el codigo del interprete que ejecuta estas funciones:

Código:
	
        case LOADLIB: // "" -- hmo
TOS=(int64_t)LoadLibraryA((char*)TOS);goto next;
case GETPROCA: // hmo "" -- ad
TOS=(int64_t)GetProcAddress((HMODULE)*NOS,(char*)TOS);NOS--;goto next;
case SYSCALL0: // adr -- rs
TOS=sys0(TOS);goto next;

y el codigo de sys0 que es la llamada con tus indicaciones

Código:
int64_t sys0(int64_t fn) { return ((int64_t (__stdcall *)())fn)(); }

estoy compilando esto en gcc-4.9.2 64 bits en dev-ccp

el main de prueba es este
Código:
////////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{

int64_t hFunc;
HMODULE hLib=LoadLibraryA((LPCSTR)"Kernel32.dll");
if (!hLib) {
     printf("Load Error\n");
     return 0;
}else{
     //printf("Load OK\n");
     hFunc=(int64_t)GetProcAddress((HMODULE)hLib,"WriteConsole");
     printf("Address=%p ",hFunc);
    
HANDLE hStdout;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    
// hFunc=(int64_t)(* (int64_t(*)(int64_t,int64_t,int64_t,int64_t,int64_t))hFunc)((int64_t)hStdout,(int64_t)"coso",5,0,0) ;
//sys5((int64_t)hFunc,(int64_t)hStdout,(int64_t)"coso",5,0,0);
WriteConsole(hStdout, "coso", 5, 0, 0);

printf("ok?");
   }      

char filename[1024];
if (argc>1)
strcpy(filename,argv[1]);
else
strcpy(filename,"main.r3");
if (!r3compile(filename)) return -1;
runr3(boot);
return 0;
}

la salida del codigo en
Código:
Address=0000000000000000 coso ok?
r3vm - PHREDA
compile:main.r3... ok.
inc:0 - words:24 - code:0Kb - data:0Kb - free:1023Kb

hola fe400000 fe425290 fe41e0a0 fe41d490 fe424ee0 fe424fd0 fe4252f0 fe4253a0 0 allocfe425290
--------------------------------
Process exited after 2.451 seconds with return value 3221225477
Press any key to continue . . .

efectivamente sigue obteniedo 0 pero los numeros que aparecen despues de hola son los  valores que obtiene dentro del interprete

Seguire intentando alternativas.

La razon por el que los parametros son todos interos es que en forth todos los parametros son pasados por una pila de numeros.




recien me di cuenta, WriteConsole, da 0 el resto no..

seguire probando..
gracias compañero !



Lo encontre!, no estaba guardando los 64bits en la memoria que almacena las direcciones de las funciones...
4  Programación / Programación C/C++ / Llamar a una funcion de una DLL cargada dinamicamente en: 12 Julio 2021, 03:08 am
Hola:

Estoy haciendo un interprete y necesito llamar a una funcion tomada de una dll cargada dinamicamente, esto es asi ya que quiero que el programa interpretado cargue la dll y no el interprete. Ademas necesito que los parametros se encuentren en un pila de enteros.

aqui tengo un fragmento del codigo que estoy probando

Código:
HANDLE hStdout;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
 
HMODULE hLib=LoadLibraryA("KERNEL32.DLL");
if (!hLib) {
     printf("Load Error");
     return 0;
   }else{
     printf("Load OK");
     hFunc=(int64_t)GetProcAddress(hLib,"WriteConsole");
     printf("Address=%x ",hFunc);
 
// WriteConsole(hStdout, "coso", 5, 0, 0);  // Esto funciona correctamente
 
// **** quiero que funcione de esta manera ***
      hFunc=(int64_t)(* (int64_t(*)(int64_t,int64_t,int64_t,int64_t,int64_t))hFunc)((int64_t)hStdout,(int64_t)"coso",5,0,0) ;
 
printf("ok?");
   }

la llamada comentada funciona ok ya que no lo esta haciendo por la direccion de la funcion (hFunc)

pero quiero llamarla por esta direccion y le hago un cast para poder llamarla, aqui quiero aclara que necesito que todos los valores sean pasados int64, me imagina que la funcion a la que llame interpretara el valor segun le corresponda (esto no se como funciona)

Alguien sabe como puedo hacer esto?, desde ya gracias.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines