Does the old technique of kernel32.dll search (find .dll base address) not work anymore?
Nel seguente codice, prendo prima l'indirizzo kernel32.dll (restituito) all'avvio dell'applicazione, quindi proverò a localizzarne la base.
La dimensione della pagina del sistema - in questo caso Windows 10 x64 - è 4096
byte, quindi la base dell'immagine è allineata a un limite di 0x1000
?
Tuttavia, quando diminuisco ripetutamente l'indirizzo (AND'd) di 0x1000
, ottengo improvvisamente il punto di un errore di segmentazione della memoria e la base non viene trovata.
Dopo aver studiato l'esecuzione usando GDB sembra che l'ultimo indirizzo di lavoro sia:
0x74400010 <KERNEL32!BasepAppContainerEnvironmentExtension+0>: mov edi,edi
Qualcuno può spiegare le mie osservazioni?
Ecco il codice per la ricerca kernel32.dll:
mov ebx, [esp] ; kernel address
and ebx, 0xfffff000 ; align value (base is aligned to 0x1000)
mov ecx, 0x50 ; page counter
loop_api:
mov ax, "MZ"
cmp ax, word [ebx] ; check DOS header
je found_dos
next_api:
sub ebx, 0x1000 ; subtract on page
dec ecx
jnz loop_api
jmp exit_normal
found_dos:
mov eax, ebx
add eax, [eax + 0x3c]
cmp word [eax], "PE" ; check PE header
jne next_api
found_kernel: