Autor
|
Tema: Ayuda! Problema con MASM Inline (Leído 7,783 veces)
|
Vaagish
Desconectado
Mensajes: 875
|
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; }
|
|
|
En línea
|
|
|
|
MCKSys Argentina
|
Si tenes uno compilado, subilo asi lo puedo ver con un dbg y te doy mas info... Tengo unos minutos libres.. Saludos!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
Vaagish
Desconectado
Mensajes: 875
|
|
|
« Última modificación: 28 Agosto 2013, 00:04 am por Vaagish »
|
En línea
|
|
|
|
MCKSys Argentina
|
@Vaagish: Revisa tus MP's
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
Vaagish
Desconectado
Mensajes: 875
|
Sii,, vi! Gracias MCK!
|
|
|
En línea
|
|
|
|
MCKSys Argentina
|
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?
|
|
« Última modificación: 28 Agosto 2013, 00:23 am por MCKSys Argentina »
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
|
MCKSys Argentina
|
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/gg463125Saludos!
|
|
« Última modificación: 28 Agosto 2013, 01:05 am por MCKSys Argentina »
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
Vaagish
Desconectado
Mensajes: 875
|
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!!
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
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 ... 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
|
|
« Última modificación: 28 Agosto 2013, 10:55 am por Eternal Idol »
|
En línea
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
problema con la propiedad display:inline-block en navegadores moviles
Desarrollo Web
|
Pirat3net
|
1
|
3,518
|
18 Mayo 2013, 21:50 pm
por #!drvy
|
|
|
problema con masm para 64bits
ASM
|
Belial & Grimoire
|
4
|
5,143
|
8 Agosto 2013, 20:35 pm
por x64core
|
|
|
Problema winexec y rmdir MASM
ASM
|
.:UND3R:.
|
2
|
2,970
|
26 Mayo 2014, 17:36 pm
por Eternal Idol
|
|
|
[masm][pregunta]problema con variables
« 1 2 »
ASM
|
daryo
|
16
|
8,256
|
5 Agosto 2014, 11:28 am
por Eternal Idol
|
|
|
Centrar pagina, problema al usar display inline
Desarrollo Web
|
RamaB
|
0
|
2,130
|
16 Octubre 2016, 16:38 pm
por RamaB
|
|