Problema con el PEB

Iniciado por Vaagish, 4 Julio 2014, 02:17 AM

0 Miembros y 1 Visitante están viendo este tema.

Vaagish

Buenas!
Tengo el siguiente problema, estoy leyendo el peb, necesito que cada vuelta que da ese bucle, ebx se posicione sobre el nombre de la funcion exportada. Aclaro que la primer vuelta que da, ebx es correcto, apunta a ActivateActCtx cuando le sumo la direccion de kernel32 que tengo en eax

Código (asm) [Seleccionar]
; ********************************************
; Hasta aca, en eax tengo a kernel32.dll
; en ebx tengo la ExportTable
; ********************************************

mov edx, -1

bucle: ; Bucle para comprobar si es la función buscada

inc edx ; Para saber en que posicion está la funcion

mov ebx, [ebx + edx * 4] ; Direcion del nombre de la funcion buscada + Siguiente funcion

add ebx, eax ; RVA->VA | add eax, Kernel32Dir
mov esi, ebx ; Mover a esi la funcion actual

lea edi, [FuncionBuscada] ; Mover a edi la funcion buscada
mov ecx, 0Eh ; [FuncionBuscadaLen] Necesario cargarla en cada vuelta, porque se decrementa

repe cmpsb      ; Compara esi y edi, con una longitud de ecx

jnz bucle


Codigo ensamblable:

Código (asm) [Seleccionar]
.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
includelib kernel32.lib

.data
FuncionBuscada db "GetProcAddress",0
.code

inicio:

; *******************************
; Obtener Kernel32.dll
; *******************************
assume fs: nothing
mov eax, fs:[30h]
mov eax, [eax + 0Ch]
lea eax, [eax + 0Ch]
NextModule:
mov eax, [eax]
mov ebx, [eax + 30h]
cmp byte ptr[ebx + 6*2], '3'
jne NextModule
mov ebx, [eax + 18h]
mov eax, ebx ; EAX guarda el valor de kernel32.dll
; *******************************

; ********************************
; Obtener direccion de funcion
; ********************************

add ebx, [ebx + 3Ch]
add ebx, 78h
mov ebx, [ebx]
add ebx, eax

; push ebx ; Guardamos el valor [ET] / Antes: mov [ET], eax

add ebx, 20h
mov ebx, [ebx]
add ebx, eax

; pop ebx ; Recuperamos el valor de [ET]


; ***********************************************************************
; Hasta aca, en eax tengo a kernel32.dll, en ebx tengo la ExportTable
; ***********************************************************************

mov edx, -1

bucle: ; Bucle para comprobar si es la función buscada

inc edx ; Para saber en que posicion está la funcion

mov ebx, [ebx + edx * 4] ; Direcion del nombre de la funcion buscada + Siguiente funcion

add ebx, eax ; RVA->VA | add eax, Kernel32Dir
mov esi, ebx ; Mover a esi la funcion actual

lea edi, [FuncionBuscada] ; Mover a edi la funcion buscada
mov ecx, 0Eh ; [FuncionBuscadaLen] Necesario cargarla en cada vuelta, porque se decrementa

repe cmpsb      ; Compara esi y edi, con una longitud de ecx

jnz bucle

invoke ExitProcess, 0
end inicio


Entiendo que el error esta en la linea 59, cuando edx vale 0, la direccion esta bien, cuando edx vale 1, la direccion salta para no se donde..

Gracias!!!

Eternal Idol

#1
Y si, el error esta en esa linea, EBX ya no es mas un puntero a AddressOfFunctions (no a la ExportTable como dice tu comentario en el codigo) sino que apunta a la cadena de la primera funcion exportada. Con un simple push/pop EBX entre el inc EDX y el mov ESI, EBX se soluciona.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

#2
Gracias EI! Eso funciona! Pero ayer lo logre solucionar asi:

Código (asm) [Seleccionar]

xor edx, edx

bucle:

inc edx

mov esi, dword ptr[ebx]
add esi, eax
add ebx, 4

lea edi, [FuncionBuscada]
mov ecx, 0Eh

repe cmpsb
jnz bucle


Igual no estoy seguro de dejarlo asi,, pasan cosas raras cuando lo depuro.. por ejemplo, a veces no funciona el lea de la linea 11, entonces saco la sección .data y pongo a "FuncionBuscada" dentro de .code y funciona, pero donde cambie algo, deja de funcionar y tengo que volver a la sección .data..  :huh:

Creo que voy a tener que hacer otra pregunta, pero dentro de un rato.. cuando vea que no puedo..

Saludos! Gracias!

PD:
CitarEBX ya no es mas un puntero a AddressOfFunctions (no a la ExportTable como dice tu comentario en el codigo)
Gracias por la aclaracion!  ;D

EDITO:

Ahora quedo asi:
Código (asm) [Seleccionar]
mov esi, dword ptr[ebx + edx*4 ]