Autor
|
Tema: [FIX] Error sacar BaseAddress Kernel32 W7 {cInvoke,cRunPe...} (Leído 3,620 veces)
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
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 )... 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 Originalmente posteado (En Ingles):http://www.advancevb.com.ar/?p=499
|
|
« Última modificación: 3 Marzo 2010, 17:48 pm por Karcrack »
|
En línea
|
|
|
|
el_c0c0
Desconectado
Mensajes: 307
|
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 )... 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 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
|
|
|
En línea
|
'- coco "Te voy a romper el orto"- Las hemorroides
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
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"
|
|
|
En línea
|
|
|
|
el_c0c0
Desconectado
Mensajes: 307
|
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 despues voy a indagar en ASM, tendria que aprenderlo de una vez por todas jajaj saludos!
|
|
|
En línea
|
'- coco "Te voy a romper el orto"- Las hemorroides
|
|
|
LeandroA
|
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.
|
|
|
En línea
|
|
|
|
cobein
|
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
|
|
|
En línea
|
|
|
|
|
|