26/06/2006, 08:50
|
| | Fecha de Ingreso: enero-2006 Ubicación: mi casa
Mensajes: 255
Antigüedad: 19 años Puntos: 0 | |
Inline Assembly, C y Pe Header. Buenas a todos, he estado haciendo este codigo desde hace unos meses.. Y tengo problemas al buscar la API de windows en la memoria (GetProcAddress)
no me la encuentra ya que en el debugger veo que a la hora de recorrer la memoria se la salta (ya que la recorre de 4 en 4 y puff)
Código:
#include<Windows.h>
#include "minimo.h"
#include<stdio.h>
#include<stdlib.h>
#include<winnt.h>
int main(void) {
DWORD dwAddress,dwPEHeader,dwEAT,dwContador;
__asm {
mov eax, dword ptr[ebp+04h]
xor ax, ax
};
{
intentar:
__try
{
__asm
{
cmp word ptr[eax],'ZM' // MZ?
je found // yes, found!
sub eax,10000h // No? substract 10000h
jmp intentar // try again...
};
} __except(EXCEPTION_EXECUTE_HANDLER) {
goto intentar;
};
}
/*"kernel base not found"*/
return 0;
found:
__asm{
mov [dwAddress],eax // eax = 0x7C800000
push ebx // salvamos ebx
push edx // salvamos edx
xor ebx,ebx // ebx = 0
xor edx,edx // edx =0
mov ebx,[eax+3Ch] // ebx = 0xE8
add ebx,eax // ebx = 0x7C800000 + 0xE8 = 0x7C8000E8
mov [dwPEHeader],ebx // PEHeader = 0x7C8000E8
mov ebx,[ebx+78h] // PEHeader + 0x78 = Export Address Table
mov [dwEAT],ebx // EAT = RVA de la Export Address Table (0x262C)
add ebx,eax // 0x7C800000 + 0x262C = 0x7C80262C (edata + 20h)
mov ecx,[ebx + 18h]
mov ebx,[ebx + 20h]
add ebx,eax // 0x7C80262C + 20h = 0x7C80264C
// ebx = RVA de AddressOfNames (0x3528)
dec ecx
mov esi,[ebx + ecx * 4]
add esi, eax
buscar_apis:
/* Empieza rutina de busqueda de API GetProcAddress */
// 0x7C800000 + 0x3528 = 0x7C803528
//no encuentro el error!!!!
mov ebx,esi
cmp dword ptr[ebx],'PteG'
add esi,4
jne buscar_apis
cmp dword ptr[ebx+4],'Acor'
add esi,4
jne buscar_apis
cmp dword ptr[ebx+8],'erdd'
add esi,4
jne buscar_apis
/*
mov esi, [dwEAT]
add esi,24h
add ecx,ecx
add esi,ecx
add esi,eax
mov esi,[esi]
*/
};
return 1;
}
un saludo y gracias de antemano =) |