Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Belial & Grimoire en 6 Agosto 2013, 03:30 am



Título: no logro invocar a getprocaddress en masm 64 bits
Publicado por: Belial & Grimoire en 6 Agosto 2013, 03:30 am
hola

estuve investigando sobre el tema de rcx - r8, y encontre que hay que alinear reservando espacio para los registros que seria 20h, no tengo bien entendido si tambien hay que reservar espacio para las API o para los CALL, en un foro resolvieron un problema sumando 8

sub rsp, 20h

sub rsp, 20h + 8

pero en un tutorial dice que call manda de retorno 8 bytes, asi que si 20h son 32 bytes, serian 32 + 8 = 40 entonces seria

sub rsp, 28h

Código:
It is the caller's responsibility to allocate 32 bytes of "shadow space" (for storing RCX, RDX, R8, and R9 if needed) before calling the function.

asi lo he hecho en este momento y al parecer funciono al inicio, antes solo cargaba estas dll

 'C:\Windows\System32\ntdll.dll' cargado. Símbolos cargados.
 'C:\Windows\System32\kernel32.dll' cargado. Símbolos cargados.
 'C:\Windows\System32\KernelBase.dll' cargado. Símbolos cargados

cuando agregue 28h, cargaron las demas dll

'C:\Windows\System32\ntdll.dll' cargado. Símbolos cargados.
'C:\Windows\System32\kernel32.dll' cargado. Símbolos cargados.
'C:\Windows\System32\KernelBase.dll' cargado. Símbolos cargados.
'C:\Windows\System32\ws2_32.dll' cargado. Símbolos cargados.
'C:\Windows\System32\msvcrt.dll' cargado. Símbolos cargados.
'C:\Windows\System32\rpcrt4.dll' cargado. Símbolos cargados.
'C:\Windows\System32\nsi.dll' cargado. Símbolos cargados.

este es el codigo

Código
  1.  
  2. extrn LoadLibraryA:PROC
  3. extrn ExitProcess:PROC
  4.  
  5. .data
  6.  
  7. wsdll db "ws2_32.dll",0
  8. wsaddr dq ?
  9.  
  10.  
  11. .code
  12. Start proc
  13. push rbp
  14. mov rbp, rsp
  15. sub rsp, 28h
  16.  
  17. mov rcx, offset [wsdll]
  18. call LoadLibraryA
  19. mov[wsaddr], rax
  20.  
  21.  
  22. xor ecx, ecx
  23. call ExitProcess
  24.  
  25. mov rsp, rbp
  26. pop rbp
  27.  
  28. Start endp
  29.  
  30. End

ahora quise continuar con GetProcAddress, pero aqui no logro avanzar, ahora se interrumpe la ejecucion en el call de getprocaddress, lo que significa que vuelve a retornar 0, intente varias formas, por ejemplo

Código
  1. mov rcx, offset[WStp]
  2. mov rdx, [wsaddr]
  3. call GetProcAddress
  4. mov[wtaddr], rax

Código
  1. mov rdx, offset[WStp]
  2. mov r8, [wsaddr]
  3. call GetProcAddress
  4. mov[wtaddr], rax

tambien intente mover rsp, con 30h, 20h, etc, leyendo mas encontre

Código:
It is the caller's responsibility to clean the stack after the call.

asi que quise borrar usando add rsp, 28h y volviendo a reservar sub rsp, 28h,tambien add rsp, 8h, add rsp, 10h,  pero nada,
me podrian ayudar un poco con esto porfavor?

salu2


Título: Re: no logro invocar a getprocaddress en masm 64 bits
Publicado por: Flamer en 6 Agosto 2013, 04:20 am
hola Belial no te compliques la vida al llamar las apis asi, mejor usa el IDE de RadASM para programar junto con Masm32 usa una VM con xp aqui te dejo un link.

ricardonarvaja.info/WEB/OTROS/DE%20LA%20LISTA%20MASM32-RADSM/CURSO%20DE%20ASM%20DESDE%20CERO/
 (http://ricardonarvaja.info/WEB/OTROS/DE%20LA%20LISTA%20MASM32-RADSM/CURSO%20DE%20ASM%20DESDE%20CERO/)

saludos flamer


Título: Re: no logro invocar a getprocaddress en masm 64 bits
Publicado por: MCKSys Argentina en 6 Agosto 2013, 05:55 am
@Belial & Grimoire: No he usado MASM en 64 bits, pero he visto que JWASM es mejor: http://www.japheth.de/JWasm.html (http://www.japheth.de/JWasm.html).

Fijate los samples que hay, por ej.: http://www.japheth.de/JWasm/Win64_1.html (http://www.japheth.de/JWasm/Win64_1.html)

Eso te dará una idea del tema y aparte, es compatible con MASM... :)

Saludos!


Título: Re: no logro invocar a getprocaddress en masm 64 bits
Publicado por: Belial & Grimoire en 6 Agosto 2013, 06:10 am
hola flamer

gracias, se ve interesante y trae buenos ejemplos, lo estoy checando

lo que sucede es que estoy usando a nasm con gcc para programar en ensamblador, y lo estaba haciendo en windows 7 de 32 bits con virtualbox, pero necesitaba usar la particion de windows que tengo instalado en mi computadora , asi que pase el codigo que tenia en virtualbox a la particion con windows para seguir estudiando, pero investigando sobre socket, encontre algunos hechos para linux en 64 bits, entonces se me hizo interesante y quise hacerlo para windows, y me dio curiosidad de rehacer el mismo codigo que habia hecho en 32bits pero en 64bits para aprender mas

ahora buscando informacion y con la ayuda que he recibido, logre entender cosas que no habia logrado entender usando asm de 32bits, creo por eso me gusta complicarme, porque me ayuda a encontrar informacion o comprender cosas que no entendia en su momento

gracias nuevamente por el link, y espero puedan me ayudar con el codigo de arriba

salu2  ;D