Ayuda! Problema con MASM Inline

Iniciado por Vaagish, 27 Agosto 2013, 23:38 PM

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

Vaagish

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!

#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;
}

MCKSys Argentina

Si tenes uno compilado, subilo asi lo puedo ver con un dbg y te doy mas info...

Tengo unos minutos libres.. :)

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Vaagish

#2

MCKSys Argentina

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Vaagish


MCKSys Argentina

#5
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?
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Vaagish


MCKSys Argentina

#7
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

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Vaagish

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!!

Eternal Idol

#9
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 (cpp) [Seleccionar]
LPVOID myGetOffset(LPVOID Modulo, char *fName)
{
 PIMAGE_DOS_HEADER dosh = (PIMAGE_DOS_HEADER)Modulo;
  PIMAGE_NT_HEADERS nth = (PIMAGE_NT_HEADERS)((ULONG_PTR)Modulo + (ULONG_PTR)dosh->e_lfanew);
 PIMAGE_EXPORT_DIRECTORY exp_dir = (PIMAGE_EXPORT_DIRECTORY)((ULONG_PTR)Modulo + (ULONG_PTR)nth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
 LPDWORD Names = (LPDWORD)((ULONG_PTR)exp_dir->AddressOfNames + (ULONG_PTR)Modulo);
 for (int x = 0; x < exp_dir->NumberOfNames; ++x)
 {
   if (!strcmp((char*)((ULONG_PTR)*Names + (ULONG_PTR)Modulo), fName))
   {
     LPWORD Ordinals = (LPWORD)((ULONG_PTR)exp_dir->AddressOfNameOrdinals + (ULONG_PTR)Modulo);
     LPDWORD Functions = (LPDWORD)((ULONG_PTR)exp_dir->AddressOfFunctions + (ULONG_PTR)Modulo);
     return (LPVOID)((ULONG_PTR)Functions[Ordinals[x]] + (ULONG_PTR)Modulo);
   }
   ++Names;
 }
 return NULL;
}





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  ::)
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