Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Vaagish en 4 Julio 2014, 02:17 am



Título: Problema con el PEB
Publicado por: Vaagish en 4 Julio 2014, 02:17 am
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
  1. ; ********************************************
  2. ; Hasta aca, en eax tengo a kernel32.dll
  3. ; en ebx tengo la ExportTable
  4. ; ********************************************
  5.  
  6. mov edx, -1
  7.  
  8. bucle: ; Bucle para comprobar si es la función buscada
  9.  
  10. inc edx ; Para saber en que posicion está la funcion
  11.  
  12. mov ebx, [ebx + edx * 4] ; Direcion del nombre de la funcion buscada + Siguiente funcion
  13.  
  14. add ebx, eax ; RVA->VA | add eax, Kernel32Dir
  15. mov esi, ebx ; Mover a esi la funcion actual
  16.  
  17. lea edi, [FuncionBuscada] ; Mover a edi la funcion buscada
  18. mov ecx, 0Eh ; [FuncionBuscadaLen] Necesario cargarla en cada vuelta, porque se decrementa
  19.  
  20. repe cmpsb       ; Compara esi y edi, con una longitud de ecx
  21.  
  22. jnz bucle

Codigo ensamblable:

Código
  1. .386
  2. .model flat, stdcall
  3. option casemap:none
  4.  
  5. include windows.inc
  6. include kernel32.inc
  7. includelib kernel32.lib
  8.  
  9. .data
  10. FuncionBuscada db "GetProcAddress",0
  11. .code
  12.  
  13. inicio:
  14.  
  15. ; *******************************
  16. ; Obtener Kernel32.dll
  17. ; *******************************
  18. assume fs: nothing
  19. mov eax, fs:[30h]
  20. mov eax, [eax + 0Ch]
  21. lea eax, [eax + 0Ch]
  22. NextModule:
  23. mov eax, [eax]
  24. mov ebx, [eax + 30h]
  25. cmp byte ptr[ebx + 6*2], '3'
  26. jne NextModule
  27. mov ebx, [eax + 18h]
  28. mov eax, ebx ; EAX guarda el valor de kernel32.dll
  29. ; *******************************
  30.  
  31. ; ********************************
  32. ; Obtener direccion de funcion
  33. ; ********************************
  34.  
  35. add ebx, [ebx + 3Ch]
  36. add ebx, 78h
  37. mov ebx, [ebx]
  38. add ebx, eax
  39.  
  40. ; push ebx ; Guardamos el valor [ET] / Antes: mov [ET], eax
  41.  
  42. add ebx, 20h
  43. mov ebx, [ebx]
  44. add ebx, eax
  45.  
  46. ; pop ebx ; Recuperamos el valor de [ET]
  47.  
  48.  
  49. ; ***********************************************************************
  50. ; Hasta aca, en eax tengo a kernel32.dll, en ebx tengo la ExportTable
  51. ; ***********************************************************************
  52.  
  53. mov edx, -1
  54.  
  55. bucle: ; Bucle para comprobar si es la función buscada
  56.  
  57. inc edx ; Para saber en que posicion está la funcion
  58.  
  59. mov ebx, [ebx + edx * 4] ; Direcion del nombre de la funcion buscada + Siguiente funcion
  60.  
  61. add ebx, eax ; RVA->VA | add eax, Kernel32Dir
  62. mov esi, ebx ; Mover a esi la funcion actual
  63.  
  64. lea edi, [FuncionBuscada] ; Mover a edi la funcion buscada
  65. mov ecx, 0Eh ; [FuncionBuscadaLen] Necesario cargarla en cada vuelta, porque se decrementa
  66.  
  67. repe cmpsb       ; Compara esi y edi, con una longitud de ecx
  68.  
  69. jnz bucle
  70.  
  71. invoke ExitProcess, 0
  72. 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!!!


Título: Re: Problema con el PEB
Publicado por: Eternal Idol en 4 Julio 2014, 08:39 am
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.


Título: Re: Problema con el PEB
Publicado por: Vaagish en 4 Julio 2014, 19:45 pm
Gracias EI! Eso funciona! Pero ayer lo logre solucionar asi:

Código
  1. xor edx, edx
  2.  
  3. bucle:
  4.  
  5. inc edx
  6.  
  7. mov esi, dword ptr[ebx]
  8. add esi, eax
  9. add ebx, 4
  10.  
  11. lea edi, [FuncionBuscada]
  12. mov ecx, 0Eh
  13.  
  14. repe cmpsb
  15. jnz bucle
  16.  

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:
Citar
EBX 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
  1. mov esi, dword ptr[ebx + edx*4 ]