Buenas. Estoy intentando hacer un programa que haga un simple sleep en asm para funcionar en todas las versiones de windows. El procedimiento sería el siguiente :
· Obtener dirección de memoria de Kernel32.dll
· Obtener dirección de memoria de GetProcAddres()
· Obtener dirección de memoria de Sleep usando GetProcAddress()
Así que he escrito algo leyendo por allí maneras de hacerlo, pero hay una cosa que no entiendo para nada :
;Debemos encontrar la dirección de memoria de la función GetProcAddress, que encontramos
;dentro de Kernel32
;El método que uso para localizar su dirección de memoria es "Get Ordinal and calculate the
;address"
mov esi, dword ptr [ebx+3Ch] ;Metemos en esi la dirección de memoria del PE Header
add esi, ebx
mov esi, dword ptr [esi+78h] ;Metemos la dirección de la export table
add esi, ebx
mov esi, dword ptr [esi+20h] ;export table name
add edi, ebx
mov ecx, dword ptr [esi+14h] ;number of exported function "GetProcAddress"
push esi
xor eax, eax ;contador
Con esto conseguimos meter la dirección de memoria de GetProcAddres en ecx, correcto.
¿Porque, justo después, empujamos el registro esi a la pila?
Porque mirad, después metemos en edi esi (supongo que dentro de esi esta la dirección de memoria de GetProcAddress ...), ponemos ecx a 0 con un xor, metemos 3 en cl y llamamos a la función loadaddr ...
;Ahora que ya tenemos la dirección de memoria de GetProcAddress podemos encontrar la dirección
;de memoria de la función Sleep
mov edi, esi
xor ecx, ecx
mov cl, 3
call loadaddr
La verdad es que no entiendo demasiado el trozo de encontrar la dirección de GetProcAddress, ¿alguien me podria decir si esta bien codeado y explicarme que es lo que hace exactamente?
Os dejo aquí el codigo entero, ¡saludos y gracias!
;programa que calcula la dirección de memoria de Kernel32 en Windows y con esta informacion
;lanza un sleep de 5 segundos
[SECTION .text]
global _start
_start:
;Vamos a encontrar la dirección de memoria de Kernel32.dll en el sistema
mov eax, fs:[30h] ;Tenemos la dirección de PED_BASE en eax
mov eax, [eax+0ch] ;Situamos eax en PEB_LDR_DATA
mov esi, [eax+1ch] ;first entry in InInitializationOrderModuleList
lodsd ;forward to next LIST_ENTRY
mov ebx, [eax+08h] ;Metemos en ebx la dirección de memoria de Kernel32
;Debemos encontrar la dirección de memoria de la función GetProcAddress, que encontramos
;dentro de Kernel32
;El método que uso para localizar su dirección de memoria es "Get Ordinal and calculate the
;address"
mov esi, dword ptr [ebx+3Ch] ;Metemos en esi la dirección de memoria del PE Header
add esi, ebx
mov esi, dword ptr [esi+78h] ;Metemos la dirección de la export table
add esi, ebx
mov esi, dword ptr [esi+20h] ;export table name
add edi, ebx
mov ecx, dword ptr [esi+14h] ;number of exported function "GetProcAddress"
push esi
xor eax, eax ;contador
;Ahora que ya tenemos la dirección de memoria de GetProcAddress podemos encontrar la dirección
;de memoria de la función Sleep
mov edi, esi
xor ecx, ecx
mov cl, 3
call loadaddr
;Es hora de hacer el sleep ...
xor eax, eax
mov ebx, address_of_Sleep
mov ax, 5000 ;pausa de 5000ms
push eax
call ebx ;Sleep(ms)
loadaddr:
mov al, byte ptr [esi]
inc esi
test al, al
jne loadaddr
push ecx
push edx
push esi
push ebx
call edx
pop edx
pop ecx
stosd
loop loadaddr
ret










Autor



En línea



