Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Vaagish en 27 Agosto 2013, 23:38 pm



Título: Ayuda! Problema con MASM Inline
Publicado por: Vaagish en 27 Agosto 2013, 23:38 pm
Hola amigos! Alguien con un poco de tiempo se anima a revisar por que no funciona este code! El error salta cuando busco la direccion de "socket",, me da mal el Ordinal de la funcion, y no me devuelve la direccion... Gracias!
Código:
#include <windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;

int Kernel32();
DWORD GetOffset(DWORD Modulo, char *Funcion, DWORD Tamaño);
int LoadLibrari(char *Modulo);

DWORD Krn32 = 0;
DWORD Ws2_32 = 0;
//**************************
DWORD GetProcA = 0;
DWORD LoadLibA = 0;
DWORD Sock = 0;
//**************************
DWORD Contador;
DWORD PEHeader = 0;
DWORD ET = 0;
WORD PosicionEAT = 0;

DWORD Retorno = 0;

int main()
{

Kernel32();
printf("\n\nLa direccion de Memoria de Kernel32.dll es: %8X", Krn32);
printf("\nLa direccion de Memoria de Kernel32.dll con LoadLibraryA es: %8X", LoadLibraryA("Kernel32.dll"));

cout << "\n\n*****************************************************************" << endl;

GetProcA = GetOffset( Krn32, "GetProcAddress", 14 );
printf("La direccion de Memoria de GetProcAddress es: %8X", GetProcA);
printf("\nLa direccion de Memoria de GetProcAddress con GetProcAddress es: %8X", GetProcAddress((HMODULE)Krn32,"GetProcAddress"));

cout << "\n\n*********************************************************************" << endl;

LoadLibA = GetOffset( Krn32, "LoadLibraryA", 12 );
printf("La direccion de Memoria de LoadLibraryA es: %8X", LoadLibA);
printf("\nLa direccion de Memoria de LoadLibraryA con GetProcAddress es: %8X", GetProcAddress((HMODULE)Krn32,"LoadLibraryA"));

cout << "\n\n*********************************************************************" << endl;

Ws2_32 = LoadLibrari("ws2_32.dll");
printf("\nLa direccion de Memoria de Ws2_32.dll es: %8X", Ws2_32);
printf("\nLa direccion de Memoria de Ws2_32.dll con LoadLibraryA es: %8X", LoadLibraryA("Ws2_32.dll"));

cout << "\n\n*********************************************************************" << endl;

Sock = GetOffset( Ws2_32, "socket", 6 );
printf("\nLa direccion de Memoria de socket es: %8X", Sock);
printf("\nLa direccion de Memoria de socket con GetProcAddress es: %8X", GetProcAddress((HMODULE)Ws2_32,"socket"));

cin.get();
}

int Kernel32()
{

__asm{
mov eax, fs:[0x30]
mov eax, [eax + 0x0C]
lea eax, [eax + 0x0C]
NextModule:
mov eax, [eax]
mov ebx, [eax + 0x30]
cmp byte ptr[ebx + 6*2], '3'
jne NextModule
mov ebx, [eax + 0x18]
mov Krn32, ebx
}

return 0;
}
DWORD GetOffset(DWORD Modulo, char *Funcion, DWORD Tamaño)
{

__asm {

mov Contador, -1

mov eax, Modulo
  add eax, [eax+3Ch]
  mov [PEHeader], eax
  add eax, 78h
  mov eax, [eax]
  add eax, Modulo
  mov [ET], eax
  add eax, 20h
mov eax, [eax]
  add eax, Modulo

bucle:

  inc Contador
  mov ebx, [eax]
  add ebx, Modulo
  mov esi, ebx
  add eax, 4
mov edi, Funcion
  mov ecx, Tamaño
  repe cmpsb
  jnz bucle

  mov ecx, [ET]
  mov ecx, [ecx+24h]
  add ecx, [Modulo]
  mov eax, [Contador]
  add eax, eax
  add ecx, eax
  mov ax, word ptr [ecx]
  mov [PosicionEAT], ax

mov eax, [ET]
  mov eax, [eax+1Ch]
  add eax, Modulo
  mov ebx, [Contador]
  rol ebx, 2
  add eax, ebx
  mov eax, [eax]
  add eax, Modulo
mov Retorno, eax

}
cout << "\nEl Ordinal es: " << Contador << endl;
return Retorno;
}
int LoadLibrari(char *Modulo)
{
__asm{
push [Modulo]
call [LoadLibA]
mov Retorno, eax
}

return Retorno;
}


Título: Re: Ayuda! Problema con MASM Inline
Publicado por: MCKSys Argentina en 27 Agosto 2013, 23:43 pm
Si tenes uno compilado, subilo asi lo puedo ver con un dbg y te doy mas info...

Tengo unos minutos libres.. :)

Saludos!


Título: Re: Ayuda! Problema con MASM Inline
Publicado por: Vaagish en 27 Agosto 2013, 23:56 pm
Listo... http://www.4shared.com/file/BqAR2or0/Coso.html


Título: Re: Ayuda! Problema con MASM Inline
Publicado por: MCKSys Argentina en 27 Agosto 2013, 23:57 pm
@Vaagish: Revisa tus MP's


Título: Re: Ayuda! Problema con MASM Inline
Publicado por: Vaagish en 28 Agosto 2013, 00:06 am
Sii,, vi! Gracias MCK!


Título: Re: Ayuda! Problema con MASM Inline
Publicado por: MCKSys Argentina en 28 Agosto 2013, 00:13 am
Bajando a ver...

EDIT: Tengo los redist de VC2008, pero estas DLLs no estan (wtf??)

MSVCP90D.DLL
MSVCR90D.DLL

Osea, esas son las de debug, no? Podes armar uno que linkee a las DLLs del redist?


Título: Re: Ayuda! Problema con MASM Inline
Publicado por: Vaagish en 28 Agosto 2013, 00:40 am
Si,, el anterior es modo debug,, este es release !

http://www.4shared.com/file/raoh5eiv/Coso_1.html



Título: Re: Ayuda! Problema con MASM Inline
Publicado por: MCKSys Argentina en 28 Agosto 2013, 00:42 am
A ver...

EDIT:

OK, en Win XP SP3 EN, Si miro la DLL ws2_32 con el Dependency Walker de Visual Studio (tengo esa app del VS 6 :) ), veo que socket tiene un ordinal de 23 (17h) y un hint de 116 (74h).

En GetOffset, en la linea donde haces mov eax, [Contador], a eax se mueve el contador, que vale 74h, osea el valor del hint, el cual no es el ordinal...

Creo que ahi esta el problema...

Saludos!

EDIT 2:

No tengo mas tiempo libre (por una horas, al menos), pero te dejo por las dudas para que revises si has cometido algun error en un offset: http://msdn.microsoft.com/library/windows/hardware/gg463125 (http://msdn.microsoft.com/library/windows/hardware/gg463125)

Saludos!


Título: Re: Ayuda! Problema con MASM Inline
Publicado por: Vaagish en 28 Agosto 2013, 01:25 am
Gracias MCK! Pero no se arreglo cambiando [Contador] por Contador.. Igual no entiendo porque Contador tiene el valor de hint, Contador se va incrementando en 1 a medida que recorre las funciones "exportables" dentro del modulo... 116 son todas las funciones que exporta Ws2_32.dll,, o sea que.. llega al final de la export table y no encuentra la funcion "socket",, pero algo esta buscando! y no encuentra!!! Me tiene mal ya.. desde las 14:00 estoy con esto.. y son casi las 21 aca!! jaja

Saludos!!


Título: Re: Ayuda! Problema con MASM Inline
Publicado por: Eternal Idol en 28 Agosto 2013, 10:52 am
No hace falta usar inline assembly para GetOffset, podrias usar las estructuras correctamente en lugar de sumar offsets, de esa manera facilmente podrias aprovechar NumberOfNames para tu bucle, ahora no estas comprobando ningun limite, seguis comparando como si la tabla fuera infinita (osea que una funcion que no este exportada tirara abajo el programa). En fin, que no se entiende nada el codigo sin depurarlo ...

Código
  1. LPVOID myGetOffset(LPVOID Modulo, char *fName)
  2. {
  3.  PIMAGE_DOS_HEADER dosh = (PIMAGE_DOS_HEADER)Modulo;
  4.   PIMAGE_NT_HEADERS nth = (PIMAGE_NT_HEADERS)((ULONG_PTR)Modulo + (ULONG_PTR)dosh->e_lfanew);
  5.  PIMAGE_EXPORT_DIRECTORY exp_dir = (PIMAGE_EXPORT_DIRECTORY)((ULONG_PTR)Modulo + (ULONG_PTR)nth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
  6.  LPDWORD Names = (LPDWORD)((ULONG_PTR)exp_dir->AddressOfNames + (ULONG_PTR)Modulo);
  7.  for (int x = 0; x < exp_dir->NumberOfNames; ++x)
  8.  {
  9.    if (!strcmp((char*)((ULONG_PTR)*Names + (ULONG_PTR)Modulo), fName))
  10.    {
  11.      LPWORD Ordinals = (LPWORD)((ULONG_PTR)exp_dir->AddressOfNameOrdinals + (ULONG_PTR)Modulo);
  12.      LPDWORD Functions = (LPDWORD)((ULONG_PTR)exp_dir->AddressOfFunctions + (ULONG_PTR)Modulo);
  13.      return (LPVOID)((ULONG_PTR)Functions[Ordinals[x]] + (ULONG_PTR)Modulo);
  14.    }
  15.    ++Names;
  16.  }
  17.  return NULL;
  18. }



Tu problema esta al final de GetOffset, en EBX estas poniendo el valor de Contador y en realidad necesitas usar el ORDINAL que guardaste en PosicionEAT. En definitiva los otros te funcionan de casualidad al coincidir el indice  ::)


Título: Re: Ayuda! Problema con MASM Inline
Publicado por: Vaagish en 28 Agosto 2013, 16:16 pm
Fa,, que grandes que son loco!! Hoy lo voy a probar,, Muchas gracias a ambos!! Podrian decirme que herramientas usan para depurar? ASM todavia me cuesta pila, pero saber usar las herramientas es una gran ayuda :p jeje


Título: Re: Ayuda! Problema con MASM Inline
Publicado por: Eternal Idol en 28 Agosto 2013, 18:52 pm
WinDbg, el mejor por lejos.


Título: Re: Ayuda! Problema con MASM Inline
Publicado por: Vaagish en 30 Agosto 2013, 18:48 pm
Perdon por responder tarde.. Ya esta solucionado el problema! Y de paso ya me puedo sumergir en el WinDbg,, a ver si aprendo a depurar de paso jeje Saludos! Gracias!


Título: Re: Ayuda! Problema con MASM Inline
Publicado por: Eternal Idol en 30 Agosto 2013, 18:49 pm
De nadas  ::)