Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Karcrack en 3 Marzo 2010, 17:46 pm



Título: [FIX] Error sacar BaseAddress Kernel32 W7 {cInvoke,cRunPe...}
Publicado por: Karcrack en 3 Marzo 2010, 17:46 pm
Bueno, supongo que algunos se habran dado cuenta que en W7 algunos CallAPI no funcionan... Eso es porque el W7 pone primero NTDLL antes que KERNEL32 en los modules cargados (Peb->InInitOrder[0]->BaseAddress != &KERNEL32 ::) :xD)... Es por eso que he programado (Basandome en otros) este shellcode que saca el BaseAddress de K32 en cualquier W$ NT aqui tenies el codigo:
Código:
http://karcrack.pastebin.com/TWmj5G5c

Y bueno, para solucionar el problema en los codigos que utilizan un pequeño shellcode para sacar el BaseAddres basta con reemplazar la constante THUNK_KERNELBASE por estos OPCODES:
Código:
8B4C2408565531C0648B70308B760C8B761C8B6E088B7E208B3638471875F3803F6B7407803F4B7402EBE789295D5EC3

Saludos :D

Originalmente posteado (En Ingles):
Código:
http://www.advancevb.com.ar/?p=499
:)


Título: Re: [FIX] Error sacar BaseAddress Kernel32 W7 {cInvoke,cRunPe...}
Publicado por: el_c0c0 en 4 Marzo 2010, 22:16 pm
Bueno, supongo que algunos se habran dado cuenta que en W7 algunos CallAPI no funcionan... Eso es porque el W7 pone primero NTDLL antes que KERNEL32 en los modules cargados (Peb->InInitOrder[0]->BaseAddress != &KERNEL32 ::) :xD)... Es por eso que he programado (Basandome en otros) este shellcode que saca el BaseAddress de K32 en cualquier W$ NT aqui tenies el codigo:
Código:
http://karcrack.pastebin.com/TWmj5G5c

Y bueno, para solucionar el problema en los codigos que utilizan un pequeño shellcode para sacar el BaseAddres basta con reemplazar la constante THUNK_KERNELBASE por estos OPCODES:
Código:
8B4C2408565531C0648B70308B760C8B761C8B6E088B7E208B3638471875F3803F6B7407803F4B7402EBE789295D5EC3

Saludos :D

Originalmente posteado (En Ingles):
Código:
http://www.advancevb.com.ar/?p=499
:)
uf perfecto! yo no uso esos codigos, pero siempre que me pasaban alguno, no funcionaba en W7 y tenia que recurrir a la querida PC virtual.

ahora yo pregunto (para boludear), ese opcode que pusiste, si lo llamo con CallWindowProc, me devuelve el base address asi nomas no?

es un poco engañoso el tema de comparar la primera letra nomas, pero dudo que se cargue otra DLL que empieze con K antes que el k32 o el ntdll

en fin, perfecto, saludos


Título: Re: [FIX] Error sacar BaseAddress Kernel32 W7 {cInvoke,cRunPe...}
Publicado por: Karcrack en 4 Marzo 2010, 22:28 pm
uf perfecto! yo no uso esos codigos, pero siempre que me pasaban alguno, no funcionaba en W7 y tenia que recurrir a la querida PC virtual.

ahora yo pregunto (para boludear), ese opcode que pusiste, si lo llamo con CallWindowProc, me devuelve el base address asi nomas no?

es un poco engañoso el tema de comparar la primera letra nomas, pero dudo que se cargue otra DLL que empieze con K antes que el k32 o el ntdll

en fin, perfecto, saludos
Si llamas a esa ShellCode con CallWindowProc este devolvera 0, tienes que pasarle el puntero a un buffer (LONG) donde recibirás el Address en [ESP+8] (2ndo parametro)... Seria algo asi:
Código:
CallWindowProc VarPtr(bvCode(0)),byval 0&, byval varptr(lBuffer),byval 0&, byval 0&

Y no solo compara que el modulo cargado empiece por 'K'/'k' sino que mida tambien 12 caracteres (UNICODE)(24bytes)... osea que sea "KERNEL32.DLL"


Título: Re: [FIX] Error sacar BaseAddress Kernel32 W7 {cInvoke,cRunPe...}
Publicado por: el_c0c0 en 4 Marzo 2010, 22:31 pm
uf perfecto! yo no uso esos codigos, pero siempre que me pasaban alguno, no funcionaba en W7 y tenia que recurrir a la querida PC virtual.

ahora yo pregunto (para boludear), ese opcode que pusiste, si lo llamo con CallWindowProc, me devuelve el base address asi nomas no?

es un poco engañoso el tema de comparar la primera letra nomas, pero dudo que se cargue otra DLL que empieze con K antes que el k32 o el ntdll

en fin, perfecto, saludos
Si llamas a esa ShellCode con CallWindowProc este devolvera 0, tienes que pasarle el puntero a un buffer (LONG) donde recibirás el Address en [ESP+8] (2ndo parametro)... Seria algo asi:
Código:
CallWindowProc VarPtr(bvCode(0)),byval 0&, byval varptr(lBuffer),byval 0&, byval 0&

Y no solo compara que el modulo cargado empiece por 'K'/'k' sino que mida tambien 12 caracteres (UNICODE)(24bytes)... osea que sea "KERNEL32.DLL"
perfecto, todos los dias se aprende algo nuevo :D despues voy a indagar en ASM, tendria que aprenderlo de una vez por todas jajaj

saludos!


Título: Re: [FIX] Error sacar BaseAddress Kernel32 W7 {cInvoke,cRunPe...}
Publicado por: LeandroA en 10 Marzo 2010, 16:25 pm
Karcrak como aplicaria esto a CallApiByName

Código:
Function CallApiByName(ByVal sLib As String, ByVal sMod As String, ParamArray Params()) As Long
On Error Resume Next
    Dim lPtr                As Long
    Dim bvASM(&HEC00& - 1)  As Byte
    Dim i                   As Long
    Dim lMod                As Long
 
    lMod = GetProcAddress(LoadLibraryA(sLib), sMod)
    If lMod = 0 Then Exit Function
 
    lPtr = VarPtr(bvASM(0))
    RtlMoveMemory ByVal lPtr, &H59595958, &H4:              lPtr = lPtr + 4
    RtlMoveMemory ByVal lPtr, &H5059, &H2:                  lPtr = lPtr + 2
    For i = UBound(Params) To 0 Step -1
        RtlMoveMemory ByVal lPtr, &H68, &H1:                lPtr = lPtr + 1
        RtlMoveMemory ByVal lPtr, CLng(Params(i)), &H4:     lPtr = lPtr + 4
    Next
    RtlMoveMemory ByVal lPtr, &HE8, &H1:                    lPtr = lPtr + 1
    RtlMoveMemory ByVal lPtr, lMod - lPtr - 4, &H4:         lPtr = lPtr + 4
    RtlMoveMemory ByVal lPtr, &HC3, &H1:                    lPtr = lPtr + 1
    CallApiByName = CallWindowProcA(VarPtr(bvASM(0)), 0, 0, 0, 0)
 
End Function

Saludos.


Título: Re: [FIX] Error sacar BaseAddress Kernel32 W7 {cInvoke,cRunPe...}
Publicado por: cobein en 10 Marzo 2010, 19:29 pm
Lean, eso es para parchar las versiones que usan copymemory, las que estan en clases. Tenes que cambiar el thunk que esta como constante  para arreglar el problema con el shellcode del kernel base