Test Foro de elhacker.net SMF 2.1

Programación => .NET (C#, VB.NET, ASP) => Programación General => Programación Visual Basic => Mensaje iniciado por: APOKLIPTICO en 8 Diciembre 2009, 00:42 AM

Título: Crasheando un Proceso.
Publicado por: APOKLIPTICO en 8 Diciembre 2009, 00:42 AM
Hola gente, tengo un problemon, estoy haciendo un pequeño programita q cada tanto crashea un programa editando partes aleatorias de la memoria con datos aleatorios tengo dos preguntas:

1) Que parte de la memoria me conviene editar para tener mayor probabilidad de crashear el proceso? Cual es la direccion de esa memoria?

2) Por qué este codigo no anda?:
Código (vb) [Seleccionar]
Private Sub Timer2_Timer()
'appcrash
Dim i As Integer
For i = 0 To 1
DoEvents
Call WriteAInt(APP_MEM_START, Rnd * 255, 796)
Next i
Timer2.Enabled = False
If DEBUGON = False Then
Timer1.Enabled = True
End If
End Sub

Function WriteAInt(ByVal Address As Long, ByVal Value As Long, ByVal PID As Long)
Dim Handle As Long
Handle = OpenProcess(PROCESS_ALL_ACCESS, False, PID)
Dim ret As Variant
ret = WriteProcessMemory(Handle, Address, Value, 4, 0&)
Call CloseHandle(Handle)
End Function


Me abre el proceso, xq el handle me devuelve un valor non-zero, pero el writeprocessmemory me devuelve "0" siempre, sin importar que valor en la memoria le ponga...
Y si uso el getlasterror, esta tambien me devuelve "0", osea q no se cual es el error q estoy teniendo, tengo privilegios de admin.

Cual puede ser el problema???
Título: Re: Crasheando un Proceso.
Publicado por: APOKLIPTICO en 8 Diciembre 2009, 19:02 PM
Nadie???
Título: Re: Crasheando un Proceso.
Publicado por: Karcrack en 8 Diciembre 2009, 22:14 PM
Tal vez no haya ningun problema :huh:
No tiene porque crashear porque escribas en memoria...

Que proceso pretendes Crashear? Tal vez hay una forma mas sencilla...

Si es una APP de VB existe una forma muy simple ;D
Título: Re: Crasheando un Proceso.
Publicado por: MCKSys Argentina en 8 Diciembre 2009, 22:47 PM
Hola!

Si te abre el proceso con el máximo acceso, porqué no usas TerminateProcess ??

Con esa lo terminas. Ahora, si quieres "tocar" el proceso a mano, puedes intentar obtener el PEB y luego modificar las instrucciones a las que apuntará EIP. Con eso lo crasheas también (ó cambiando EIP).

Sinó también, si tienes acceso al EXE (o DLL) que se ejecuta, puedes ver que instrucción modificar, para que crashee. (eso si, asegúrate que esa parte no tenga control de excepciones, y que si lo tiene, salga de todas formas).

Saludos!
Título: Re: Crasheando un Proceso.
Publicado por: APOKLIPTICO en 8 Diciembre 2009, 23:28 PM
No quiero terminar el proceso, xq eso puede ser un poco sospechoso. Habia pensado lo de modificar el EIP para causar un access violation. Como hago para encontrar esa address??
Y otro problema, no te olvides q todavia sigue sin andar el codigo q postee, osea q aunque quiera modificar la EIP y tenga la direccion de memoria, no podría hacerlo xq no anda ¬¬ jejej...
Tenes idea q puede estar mal en el codigo?
Gracias!
Título: Re: Crasheando un Proceso.
Publicado por: cobein en 9 Diciembre 2009, 08:34 AM
Fijate en este source, tiene casi todo lo que necesitas. http://www.advancevb.com.ar/?p=159
Título: Re: Crasheando un Proceso.
Publicado por: APOKLIPTICO en 9 Diciembre 2009, 13:04 PM
MMh, muy interesante, muchas gracias x el aporte, ya lo incorporé a mi programa, está sobreescribiendo bien, la funcion writeaddress me está devolviendo nonzero. Okay, estuve googleando un poco, y encontre esto: +0x000 InheritedAddressSpace : 0 ''
   +0x001 ReadImageFileExecOptions : 0 ''
   +0x002 BeingDebugged    : 0x1 ''
   +0x003 SpareBool        : 0 ''
   +0x004 Mutant           : 0xffffffff
   +0x008 ImageBaseAddress : 0x00400000
   +0x00c Ldr              : 0x00241ea0 _PEB_LDR_DATA
   +0x010 ProcessParameters : 0x00020000 _RTL_USER_PROCESS_PARAMETERS
   +0x014 SubSystemData    : (null)
   +0x018 ProcessHeap      : 0x00140000
   +0x01c FastPebLock      : 0x77fc49e0 _RTL_CRITICAL_SECTION
   +0x020 FastPebLockRoutine : 0x77f5b2a0
   +0x024 FastPebUnlockRoutine : 0x77f5b380
   +0x028 EnvironmentUpdateCount : 1
   +0x02c KernelCallbackTable : (null)
   +0x030 SystemReserved   : [1] 0
   +0x034 ExecuteOptions   : 0y00
   +0x034 SpareBits        : 0y000000000000000000000000000000 (0)
   +0x038 FreeList         : (null)
   +0x03c TlsExpansionCounter : 0
   +0x040 TlsBitmap        : 0x77fc4680
   +0x044 TlsBitmapBits    : [2] 0
   +0x04c ReadOnlySharedMemoryBase : 0x7f6f0000
   +0x050 ReadOnlySharedMemoryHeap : 0x7f6f0000
   +0x054 ReadOnlyStaticServerData : 0x7f6f0688  -> (null)
   +0x058 AnsiCodePageData : 0x7ffb0000
   +0x05c OemCodePageData  : 0x7ffc1000
   +0x060 UnicodeCaseTableData : 0x7ffd2000
   +0x064 NumberOfProcessors : 1
   +0x068 NtGlobalFlag     : 0x70
   +0x070 CriticalSectionTimeout : _LARGE_INTEGER 0xffffe86d`079b8000
   +0x078 HeapSegmentReserve : 0x100000
   +0x07c HeapSegmentCommit : 0x2000
   +0x080 HeapDeCommitTotalFreeThreshold : 0x10000
   +0x084 HeapDeCommitFreeBlockThreshold : 0x1000
   +0x088 NumberOfHeaps    : 3
   +0x08c MaximumNumberOfHeaps : 0x10
   +0x090 ProcessHeaps     : 0x77fc5a80  -> 0x00140000
   +0x094 GdiSharedHandleTable : (null)
   +0x098 ProcessStarterHelper : (null)
   +0x09c GdiDCAttributeList : 0
   +0x0a0 LoaderLock       : 0x77fc1774
   +0x0a4 OSMajorVersion   : 5
   +0x0a8 OSMinorVersion   : 1
   +0x0ac OSBuildNumber    : 0xa28
   +0x0ae OSCSDVersion     : 0x100
   +0x0b0 OSPlatformId     : 2
   +0x0b4 ImageSubsystem   : 3
   +0x0b8 ImageSubsystemMajorVersion : 4
   +0x0bc ImageSubsystemMinorVersion : 0
   +0x0c0 ImageProcessAffinityMask : 0
   +0x0c4 GdiHandleBuffer  : [34] 0
   +0x14c PostProcessInitRoutine : (null)
   +0x150 TlsExpansionBitmap : 0x77fc4660
   +0x154 TlsExpansionBitmapBits : [32] 0
   +0x1d4 SessionId        : 0
   +0x1d8 AppCompatFlags   : _ULARGE_INTEGER 0x0
   +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER 0x0
   +0x1e8 pShimData        : (null)
   +0x1ec AppCompatInfo    : (null)
   +0x1f0 CSDVersion       : _UNICODE_STRING "Service Pack 1"
   +0x1f8 ActivationContextData : (null)
   +0x1fc ProcessAssemblyStorageMap : (null)
   +0x200 SystemDefaultActivationContextData : 0x00130000
   +0x204 SystemAssemblyStorageMap : (null)
   +0x208 MinimumStackCommit : 0


Que parte debería sobreescribir para crashear el programa con un heap/stack overflow???
Título: Re: Crasheando un Proceso.
Publicado por: Karcrack en 9 Diciembre 2009, 15:34 PM
Si el programa no esta realizando ninguna acción en ese momento no lo crashearas tan facilmente...

Porque no simplemente le inyectas un pequeño codigo en ASM?
Código (asm) [Seleccionar]
xor eax, eax
mov [eax], eax

:D
Título: Re: Crasheando un Proceso.
Publicado por: APOKLIPTICO en 9 Diciembre 2009, 16:53 PM
Igual el proceso va a estar haciendo, de eso estoy seguro, es un programa q utiliza internet, osea q siempre tiene q mandar o recibir algo (keep-alives, requests, etc).
Como hago para sobreescribir la EIP teniendo la direccion del EPB???
Título: Re: Crasheando un Proceso.
Publicado por: MCKSys Argentina en 9 Diciembre 2009, 21:17 PM
Si usa alguna API que conozcas, puedes parchearla para que genere una excepcion.

Asi, si no la controla, queda frito...

Saludos!

Título: Re: Crasheando un Proceso.
Publicado por: Karcrack en 9 Diciembre 2009, 22:08 PM
Cita de: MCKSys Argentina en  9 Diciembre 2009, 21:17 PM
Si usa alguna API que conozcas, puedes parchearla para que genere una excepcion.

Asi, si no la controla, queda frito...

Saludos!


Creo que es mas facil inyectar code como dije..
Título: Re: Crasheando un Proceso.
Publicado por: APOKLIPTICO en 10 Diciembre 2009, 00:32 AM
Okay, gente no quiero ser rudo, pero estuve toooooda la tarde estudiando una materia que no me gusta nada de nada y estoy bastante cranky asi q work with me guys:
Necesito saber como se puede hacer en vb (si se puede) una de estas dos cosas:
1) Inyectar el código que propuso Karcrack.
2) Conseguir la Address donde se guarda la EIP del programa para poder sobreescribirla.

Ahora, necesito saber como se hace, paso a paso, mis conocimientos de manejo de memoria y registros son bastante escasos, no sabia lo que era la PEB hasta q no lo googlee, no les pido q me hagan el código de eso me ocupo yo, simplemente necesito saber como tengo q leer/escribir el código en la memoria usando las API WriteProcessMemory y ReadProcessMemory y que addresses tengo q usar.
Plis no le den muchas vueltas al asunto, simplemente vayan directo al grano.
Muchas gracias x su ayuda y sorry si estoy siendo un gigant pain in the ass.
Un abrazo
APOKLIPTICO

PS: Despues de un rato de googlear, encontre la manera de sacar la BaseAddress con una API, ahora el tema es q me está fallando la funcion WriteProcessMemory (me devuelve 0) cada vez q intento escribir en la BaseAddress Que está pasando? q estoy haciendo mal? Incluso probé sumarle H01000000 a la direccion. Bueno, no se me fui a dormir, esto es muy frustrante...
Título: Re: Crasheando un Proceso.
Publicado por: MCKSys Argentina en 10 Diciembre 2009, 21:46 PM
Hola!

Lo que pasa es que en la dirección de la ImageBase está el PE Header del ejecutable. NORMALMENTE esta parte de la memoria no tiene permisos de escritura. Pero se los puedes dar con VirtualProtect  :)

Saludos!
Título: Re: Crasheando un Proceso.
Publicado por: Karcrack en 10 Diciembre 2009, 22:27 PM
Código (vb) [Seleccionar]
'KERNEL32
Private Declare Function CreateRemoteThread Lib "KERNEL32" (ByVal hProcess As Long, ByRef lpThreadAttributes As Any, ByVal dwStackSize As Long, ByRef lpStartAddress As Long, ByRef lpParameter As Any, ByVal dwCreationFlags As Long, ByRef lpThreadId As Long) As Long
Private Declare Function OpenProcess Lib "KERNEL32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Public Function CrashProc(ByVal lPID As Long) As Boolean
    CrashProc = CreateRemoteThread(OpenProcess(&H1F0FFF, ByVal 0&, lPID), ByVal 0&, 0, ByVal &HCACACACA, ByVal 0&, 0, ByVal 0&)
End Function

:silbar:
Título: Re: Crasheando un Proceso.
Publicado por: MCKSys Argentina en 11 Diciembre 2009, 00:51 AM
Je,je,je,je... Muy Bueno!!!  ;-)

PD: BADC0DE es otra dirección bonita para empezar el thread...  :)

Saludos!
Título: Re: Crasheando un Proceso.
Publicado por: BlackZeroX en 11 Diciembre 2009, 01:52 AM
Cita de: Karcrack en 10 Diciembre 2009, 22:27 PM
Código (vb) [Seleccionar]


yVal 0&, lPID), ByVal 0&, 0, ByVal &HCACACACA, ByVal 0&, 0, ByVal 0&)


:silbar:

Como no lo va a Crashear le anda dando con doble CACA

Perdon no me aguante xP

Dulces Lunas!¡.
Título: Re: Crasheando un Proceso.
Publicado por: APOKLIPTICO en 11 Diciembre 2009, 02:53 AM
Cita de: Karcrack en 10 Diciembre 2009, 22:27 PM
Código (vb) [Seleccionar]
'KERNEL32
Private Declare Function CreateRemoteThread Lib "KERNEL32" (ByVal hProcess As Long, ByRef lpThreadAttributes As Any, ByVal dwStackSize As Long, ByRef lpStartAddress As Long, ByRef lpParameter As Any, ByVal dwCreationFlags As Long, ByRef lpThreadId As Long) As Long
Private Declare Function OpenProcess Lib "KERNEL32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Public Function CrashProc(ByVal lPID As Long) As Boolean
   CrashProc = CreateRemoteThread(OpenProcess(&H1F0FFF, ByVal 0&, lPID), ByVal 0&, 0, ByVal &HCACACACA, ByVal 0&, 0, ByVal 0&)
End Function

:silbar:

YES! Esto es lo q necesitaba, en cuanto pueda lo pruebo.
Ahora estoy muy ocupado jugando CoD4 MW y viendo the big bang theory XD
GRACIAS!!!
Título: Re: Crasheando un Proceso.
Publicado por: Karcrack en 11 Diciembre 2009, 15:23 PM
Otra direccion para crashear bonita tambien es 0xDEADBEEF :xD
Título: Re: Crasheando un Proceso.
Publicado por: APOKLIPTICO en 11 Diciembre 2009, 15:30 PM
Gente, muchas gracias, funciona de maravillas.
Aki esta la funcion completa:

Código (vb) [Seleccionar]
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal Hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "KERNEL32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "KERNEL32" (ByVal hObject As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal Classname As String, ByVal WindowName As String) As Long
Private Declare Function CreateRemoteThread Lib "KERNEL32" (ByVal hProcess As Long, ByRef lpThreadAttributes As Any, ByVal dwStackSize As Long, ByRef lpStartAddress As Long, ByRef lpParameter As Any, ByVal dwCreationFlags As Long, ByRef lpThreadId As Long) As Long
Private Const PROCESS_ALL_ACCESS = &H1F0FFF

Function CrashProg(ByVal Address As Long, ByVal WindowName As String)
Dim Handle As Long
Dim PID As Long
Dim Hwnd As Long
Dim ret
Hwnd = FindWindow(vbNullString, WindowName)
GetWindowThreadProcessId Hwnd, PID
Handle = OpenProcess(PROCESS_ALL_ACCESS, False, PID)
ret = CreateRemoteThread(Handle, ByVal 0&, 0, Address, ByVal 0&, 0, ByVal 0&)
Call CloseHandle(Handle)
End Function


Un abrazo
APOKLIPTICO
Título: Re: Crasheando un Proceso.
Publicado por: APOKLIPTICO en 18 Diciembre 2009, 17:52 PM
Perdón x revivir el post (son solo 7 dias), esta funcionando bien, el problema es que algunos procesos no se les puede inyectar memoria aleatoriamente, x ejemplo, el zonealarm, para crashearlo, me tira un acceso denegado...
Otros procesos falla la inyección de memoria...
Hay alguna manera de que ande?
Título: Re: Crasheando un Proceso.
Publicado por: Karcrack en 18 Diciembre 2009, 20:16 PM
Cita de: APOKLIPTICO en 18 Diciembre 2009, 17:52 PM
Perdón x revivir el post (son solo 7 dias), esta funcionando bien, el problema es que algunos procesos no se les puede inyectar memoria aleatoriamente, x ejemplo, el zonealarm, para crashearlo, me tira un acceso denegado...
Otros procesos falla la inyección de memoria...
Hay alguna manera de que ande?
Prueba obtiendo los privilegios necesarios, SeDebugPrivilege
Título: Re: Crasheando un Proceso.
Publicado por: APOKLIPTICO en 19 Diciembre 2009, 19:06 PM
Okay, creo q ya tengo el sedebugprivileges (hay alguna manera de comprobarlo???)
El problema es que me sigue sin inyectar la memoria...
El proceso q estoy tratando de crashear es el zlclient.exe del zonealarm

PD: El cheatengine tiene una funcion createprocess y crashea el zonealarm, pero no se como lo hace... Supongo que dbe hacerlo en modo kernel cargando un driver, pero no estoy seguro...
Título: Re: Crasheando un Proceso.
Publicado por: APOKLIPTICO en 20 Diciembre 2009, 02:32 AM
Perdon x el double posting.
Descubrí q el problema es q el zlclient.exe me está bloqueando la llamada al openprocess, con o sin el sedebugprivileges. Hay alguna manera de bypassear eso? Sin tener q usar drivers...

PD: En caso de que no se pueda, alguien me orientaría a algun site q me pueda explicar bien como programar un driver para este fin??? (Se C++, me imagino q no se puede hacer un driver en VB).
Título: Re: Crasheando un Proceso.
Publicado por: Karcrack en 20 Diciembre 2009, 16:00 PM
Cita de: APOKLIPTICO en 20 Diciembre 2009, 02:32 AM
Perdon x el double posting.
Descubrí q el problema es q el zlclient.exe me está bloqueando la llamada al openprocess, con o sin el sedebugprivileges. Hay alguna manera de bypassear eso? Sin tener q usar drivers...

PD: En caso de que no se pueda, alguien me orientaría a algun site q me pueda explicar bien como programar un driver para este fin??? (Se C++, me imagino q no se puede hacer un driver en VB).
Necesitas unHookear las APIs, hay un code en la sección de VB, creo que lo posteo XCryptOR ;)

Y bueno, lo del driver, en VB no se puede... por ahora... :P
Título: Re: Crasheando un Proceso.
Publicado por: APOKLIPTICO en 25 Diciembre 2009, 22:35 PM
Bueno, no me queda otra, unhookear las APIs a nivel usuario no me sirve, asi q voy a ponerme a aprender como unhookearlas a nivel kernel, supongo q voy a tener q hacerlo en C++...
Se puede hacer el driver en C++ pero usarlo en VB? Como si fuese una dll??? O quizas hacer un driver en C++, una DLL en C++ que cargue el driver y despues cargar el driver en VB?? Que opción me conviene mas?
Título: Re: Crasheando un Proceso.
Publicado por: Karcrack en 26 Diciembre 2009, 00:09 AM
Si que puedes cargar el Driver desde VB sin ningun problema... Lo que todavia no se puede hacer es un driver decente en VB... estoy trabajando en ello :rolleyes: :P