// ShellCode que obtiene la direccion de Kernel32.DLL en el proceso
// Programada por Juan fary (mDrinky)
// [email protected]
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
char code[] = "\x31\xFF\x64\x03\x7F\x30\x8B\x7F\x0C\x8B\x7F\x1C\x8B\x3F\x8B\x57"\
"\x20\x8B\x4F\x08\x52\x51\x57\x56\xE8\x00\x00\x00\x00\x5B\x81\xEB"\
"\x1D\x10\x40\x00\x53\x59\x81\xC1\x8A\x10\x40\x00\x53\x81\xC3\x46"\
"\x10\x40\x00\x51\x52\xFF\xD3\x5B\x5E\x5F\x59\x5A\x8B\x3F\x83\xF8"\
"\x01\x75\xCB\x89\xC8\xC3\xE8\x00\x00\x00\x00\x5B\x81\xEB\x4B\x10"\
"\x40\x00\x81\xC3\x62\x10\x40\x00\x55\x89\xE5\x8B\x75\x08\x8B\x4D"\
"\x0C\x49\x41\xAC\x38\x01\x75\x0D\x3C\x00\x74\x02\xFF\xE3\x80\x39"\
"\x00\x74\x0B\x75\x00\xB8\x00\x00\x00\x00\x5D\xC2\x08\x00\xB8\x01"\
"\x00\x00\x00\x5D\xC2\x08\x00\x0A\x0D\x00\x6B\x00\x65\x00\x72\x00"\
"\x6E\x00\x65\x00\x6C\x00\x33\x00\x32\x00\x2E\x00\x64\x00\x6C\x00\x6C\x00";
int main()
{
int (*func)();
func = (int (*)()) code;
printf("Kernel32 Shellcode: 0x%x\n",(int)(*func)());
printf("KernelGetModuleHandle: 0x%x\n",GetModuleHandle("KERNEL32.DLL"));
system("PAUSE");
return 0;
}
; mDrinky
format PE Console
include 'win32ax.inc'
entry start
section '.text' code readable executable
start:
;db 0x31,0xFF,0x64,0x03,0x7F,0x30,0x8B,0x7F,0x0C,0x8B,0x7F,0x1C,0x8B,0x3F,0x8B,0x57
;db 0x20,0x8B,0x4F,0x08,0x52,0x51,0x57,0x56,0xE8,0x00,0x00,0x00,0x00,0x5B,0x81,0xEB
;db 0x1D,0x10,0x40,0x00,0x53,0x59,0x81,0xC1,0x88,0x10,0x40,0x00,0x53,0x81,0xC3,0x44
;db 0x10,0x40,0x00,0x51,0x52,0xFF,0xD3,0x5B,0x5E,0x5F,0x59,0x5A,0x8B,0x3F,0x83,0xF8
;db 0x01,0x75,0xCB,0xC3,0xE8,0x00,0x00,0x00,0x00,0x5B,0x81,0xEB,0x49,0x10,0x40,0x00
;db 0x81,0xC3,0x60,0x10,0x40,0x00,0x55,0x89,0xE5,0x8B,0x75,0x08,0x8B,0x4D,0x0C,0x49
;db 0x41,0xAC,0x38,0x01,0x75,0x0D,0x3C,0x00,0x74,0x02,0xFF,0xE3,0x80,0x39,0x00,0x74
;db 0x0B,0x75,0x00,0xB8,0x00,0x00,0x00,0x00,0x5D,0xC2,0x08,0x00,0xB8,0x01,0x00,0x00
;db 0x00,0x5D,0xC2,0x08,0x00,0x0A,0x0D,0x00,0x6B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00
;db 0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00
;db 0x00
xor edi,edi
add edi,[fs:edi+30h]
mov edi,[edi+0ch]
mov edi,[edi+1ch]
mov edi,[edi]
next_module:
mov edx,[edi+0x20]
mov ecx,[edi+0x8]
push edx
push ecx
push edi ;..
push esi ;..
call offset1
offset1:
pop ebx
sub ebx,offset1
push ebx
pop ecx ; Para calcular kernel
add ecx,Kernel
push ebx ; guardamos delta
add ebx,CompararCadenas
push ecx
push edx
call ebx ; Funcion comparar
;stdcall ebx,edx,ecx
pop ebx ; salvamos el delta
pop esi ;..
pop edi ;..
pop ecx
pop edx
mov edi,[edi]
;add ebx,next_module
cmp eax,1
jne next_module
mov eax,ecx ; EAX = KERNEL32.DLL
cinvoke printf,"Mediante el PEB: %x",eax;ecx
cinvoke printf,salto
cinvoke GetModuleHandleW,Kernel
cinvoke printf,"Mediante GetModuleHandle: %x",eax
cinvoke printf,salto
ret
CompararCadenas:
; registros que usa EAX, ECX, ESI, EDI, EBX
call offset2 ; delta offset
offset2:
pop ebx
sub ebx,offset2
add ebx, bucle ; delta para la etiquta bucle
push ebp
mov ebp, esp
mov esi,dword[ebp+8]
mov ecx,dword[ebp+12]
dec ecx
bucle:
inc ecx
lodsb
cmp byte[ecx],al
jne diferentes
cmp al,0
je comprobar
jmp ebx
comprobar:
cmp byte[ecx],0
je iguales
jne diferentes
diferentes:
mov eax,0
pop ebp
ret 8
iguales:
mov eax,1
pop ebp
ret 8
salto db 10,13,0
Kernel db 0x6B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00
section '.idata' import data readable writeable
library MSVCRT,'msvcrt.dll',\
KERNEL32,'KERNEL32.DLL'
import MSVCRT,printf,'printf'
import KERNEL32,lstrcmpW,'lstrcmpW',\
GetModuleHandleW,'GetModuleHandleW'
saludos.
Pedazo de codigo!
Muchisimas gracias bro!
Te dare tu primer karma!
Excelente mDrinky. me podrias decir porque en W7 x64 el código en FASM se cuelga. osea muestra los datos bien pero deja de funcionar.
con C funciona perfecto.
No tienes permitido ver los links.
Registrarse o Entrar a mi cuenta
Excelente mDrinky. me podrias decir porque en W7 x64 el código en FASM se cuelga. osea muestra los datos bien pero deja de funcionar.
con C funciona perfecto.
Hola, no tengo x64 y no lo puedo probar bien pero vamos así mirando por encima he he dado cuenta de que aqui:
cinvoke GetModuleHandleW,Kernel
No sería con cinvoke sino con invoke
invoke GetModuleHandleW,Kernel
Ya que es una llamada stdcall y no _cdecl
Prueba haber si es eso y me comentas ;)
un saludo!
Como no me di cuenta >:( Excelente Capo era eso. ;D gracias
No tienes permitido ver los links.
Registrarse o Entrar a mi cuenta
Como no me di cuenta >:( Excelente Capo era eso. ;D gracias
El fallo era mio, nada de gracias.
Un saludo. ;)
Funciona en wVista para arriba? Si no mal recuerdo en el orden de inicialización que se cargan los módulos es ntdl.dll, kernelbase.dll, kernel32.dll y tú estás cogiendo el segundo módulo, dando por entendido que es kernel32.dll sin tener en cuenta que kernelbase se carga antes...
Saludos,
Nox.
Hola iNox, si lees el código completo, vas a ver que va comparando todos los modulos con la cadena "KERNEL32.DLL", hasta que encuentra la cadena verdadera y a apartir de ahí obtiene el modulo.
Creo que funciona en todas las versiones de windows incluso en windows 8.
un saludo!
uh! tienes razón, no le di al scroll para bajar jeje, sin embargo el código se puede reducir bastante, yo hice hace tiempo un escrito acerca del peb y como obtener los módulos:
http://www.noxsoft.net/2012/06/undocumented-peb-accediendo-los-modulos/
Saludos,
Nox.
Muy bueno iNox, me lo voy a leer sin duda :)
un saludo!
La verdad es que la shellcode sale 3 veces mas reducida, lo que nose es hasta que punto puede ser fiable comprobar el '3' en la posición 12 :-\
Para FASM.
db 0x64,0x8B,0x40,0x30,0x8B,0x40,0x0C,0x8D,0x40,0x14,0x31,0xC0,0x64,0x8B,0x40,0x30
db 0x8B,0x40,0x0C,0x8B,0x40,0x14,0x8B,0x00,0x89,0xC2,0x8B,0x52,0x28,0x80,0x7A,0x0C
db 0x33,0x75,0xF3,0x8B,0x40,0x10 ;,0xC3
; eax = Kernel32.dll
Muy interesante tu web!! ;D
Es muy fiable :D, no me ha dado problemas hasta ahora ;)