una pregunta
he visto que despues de encontrar kernel32 buscan las funciones
por ejemplo
Código
push offset kernelbase ; direccion de kernel32.dll push offset nLoadLibrary ; cadena de texto con: LoadLibraryA push 0Dh ; longitud de LoadLibraryA + 1 call busca_libreria ; buscamos LoadLibraryA dentro de kernel32.dll mov eax, fs:[30h] ; puntero al PEB mov eax, [eax+0ch] ; puntero a la estructura de datos mov esi, [eax+1ch] ; extrae la primera entrada lodsd ; avanza a la siguiente mov eax, [eax+08h] ; obtiene la direccion base y la guarda en eax ret ; *************************************************************************** ; Buscamos la direccion de una funcion dada la direccion base de una libreria ; *************************************************************************** busca_funcion: mov eax, [esp+8] ; funcion apunta al nombre de la funcion (ej: LoadLibraryA) mov funcion, eax mov eax, [esp+12] ; base apunta a la base de la libreria (ej: kernel32.dll) mov eax, [eax] mov base, eax
Tengo una duda sobre las funciones
al inicio de busca_funcion... hay mov eax, [esp+8]
yo al principio creia o talvez no lo entiendo bien, que esp+8 era donde se habia guardado MZ
Código
mov eax, [eax+08h]
entonces quise hacer algo como esto para ir guardando en la pila los datos
Código
mov eax, [fs:0x30] mov eax, [eax + 0x0C] mov eax, [eax + 0x1C] mov eax, [eax] mov eax, [eax + 0x08] push ebp mov ebp, esp sub esp, 12 mov edi, [ebp + 0x08] mov edx, edi add edx, [edi + 0x3C] mov [ebp - 0x0C], edx
al compilarlo no tuve problemas pero al ejecutarlo salia un error y se cerraba la aplicacion, pero...bueno, como uso windows 7 hay otra forma de encontrar kernel
Código
xor eax, eax mov eax, [fs:0x30] mov eax, [eax+0x0C] mov eax, [eax+0x0C] mov eax, [eax] mov eax, [eax] mov eax, [eax+0x18]
Entonces quise hacer algo como esto
Código
xor eax, eax mov eax, [fs:0x30] mov eax, [eax+0x0C] mov eax, [eax+0x0C] mov eax, [eax] mov eax, [eax] mov eax, [eax+0x18] push ebp mov ebp, esp sub esp, 12 mov edi, [ebp + 0x08] mov edx, edi add edx, [edi + 0x3C] mov [ebp - 0x0C], edx
y tampoco tuve problemas y el error no me parecio, pero si se dan cuenta de algo, puse
Código
mov edi, [ebp + 0x08]
lo cual me parecio que debia ser
Código
mov edi, [ebp + 0x18]
al compilarlo tampoco hubo algun problema, pero al investigar mas me encontre con otro ejemplo, donde hace lo mismo que el primer ejemplo
Código
LoadK32Function: mov eax, [fs:0x30] ; address of PEB mov eax, [eax + 0x0C] ; PEB->Ldr mov eax, [eax + 0x1C] ; Ldr->InMemoryOrderModuleList (first element is ntdll.dll) mov eax, [eax] ; InMemoryOrderModuleList->Flink (second element is kernel32.dll) mov eax, [eax + 0x08] ; DllBase push ebp mov ebp, esp sub esp, 12 ; make room for 3 DWORDS mov edi, [ebp + 0x08] ; edi = DosHeader cmp word [edi], 'MZ' mov edx, edi add edx, [edi + 0x3C] cmp word [edx], 'PE' jne LoadK32Function_fail mov [ebp - 0x0C], edx _WinMain@16: push LoadLibraryName push dword [Kernel32Addr] call LoadK32Function
Y aqui ya estoy confundido, que hace realmente ebp+0x08? porque al segundo ejemplo que puse de WinMain, si cambio de igual forma como encontrar kernel en sistemas windows 7, sigue funcionando ebp+0x08 pero si lo cambio a 0x18 ya no funciona
Código
xor eax, eax mov eax, [fs:0x30] mov eax, [eax+0x0C] mov eax, [eax+0x0C] mov eax, [eax] mov eax, [eax] mov eax, [eax+0x18] push ebp mov ebp, esp sub esp, 12 ; make room for 3 DWORDS mov edi, [ebp + 0x18] ; edi = DosHeader cmp word [edi], 'MZ' mov edx, edi add edx, [edi + 0x3C] cmp word [edx], 'PE' jne LoadK32Function_fail mov [ebp - 0x0C], edx
Esta es una explicacion que dieron pero no entiendo porque comenzar con 0x08
Citar
;------------------------------------
; +-----------------------+
; ebp-0x0C | PE Header |
; +-----------------------+
; ebp-0x08 | Export table addr |
; +-----------------------+
; ebp-0x04 | AddressOfNames |
; +-----------------------+
; .....
; +-----------------------+
; ebp+0x08 | kernel32 base address |
; +-----------------------+
; ebp+0x0C | function name |
; +-----------------------+
;------------------------------------
; +-----------------------+
; ebp-0x0C | PE Header |
; +-----------------------+
; ebp-0x08 | Export table addr |
; +-----------------------+
; ebp-0x04 | AddressOfNames |
; +-----------------------+
; .....
; +-----------------------+
; ebp+0x08 | kernel32 base address |
; +-----------------------+
; ebp+0x0C | function name |
; +-----------------------+
;------------------------------------
espero me puedan ayudar con esta duda, porque me gustaria saber porque ebp tendria que comenzar con 0x08, porque no se si tambien podria haber comenzado con 0x04 y "function name" comenzar con 0x08 y si es "MZ" porque no comienza con 0x18, al principio tambien crei que era porque MZ era un DWORD pero es WORD, pero ahora no tengo idea sobre ebp, espero me puedan explicar
salu2