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:
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:
8B4C2408565531C0648B70308B760C8B761C8B6E088B7E208B3638471875F3803F6B7407803F4B7402EBE789295D5EC3
Saludos :D
Originalmente posteado (En Ingles):
http://www.advancevb.com.ar/?p=499
:)
Cita de: 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:
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:
8B4C2408565531C0648B70308B760C8B761C8B6E088B7E208B3638471875F3803F6B7407803F4B7402EBE789295D5EC3
Saludos :D
Originalmente posteado (En Ingles):
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
Cita de: el_c0c0 en 4 Marzo 2010, 22:16 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:
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"
Cita de: Karcrack en 4 Marzo 2010, 22:28 PM
Cita de: el_c0c0 en 4 Marzo 2010, 22:16 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:
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!
Karcrak como aplicaria esto a CallApiByName
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.
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