elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Creando un proceso crítico !!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Creando un proceso crítico !!  (Leído 9,576 veces)
TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Creando un proceso crítico !!
« en: 10 Abril 2016, 08:31 am »

Holas,

Tuve un codigo hace ya un tiempo que convertia mi programa en un proceso critico del sistema si tratabas de cerrarlo forzozo daba un pantallazo azul.

Dicho codigo lo perdi alguien tendra algo que me resuelva..

Salu2


En línea

HCK.

Desconectado Desconectado

Mensajes: 181



Ver Perfil
Re: Creando un proceso crítico !!
« Respuesta #1 en: 10 Abril 2016, 12:16 pm »

Tienes el programa hecho?, descompilalo con ILSPY o Reflector y sacas el código. Me interesaría bastante, si lo sacas y lo cuelgas lo agradecería mucho.

Si no cuelga el ejecutable (si es que con suerte tienes alguno compilado con ese código y te cuelgo su código yo).

Un saludo


En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Creando un proceso crítico !!
« Respuesta #2 en: 10 Abril 2016, 18:28 pm »

No bro lo perdí el codigo estaba en C# .Net y tuve que convertirlo a VB.NET y trabajaba super bien, cuando iba a cerrar mi programa tenia que quitarle lo del proceso critico porque sino era pantallazo azul..

Salu2
En línea

Slava_TZD
Wiki

Desconectado Desconectado

Mensajes: 1.466

♪ [8675309] ♪


Ver Perfil WWW
Re: Creando un proceso crítico !!
« Respuesta #3 en: 10 Abril 2016, 21:06 pm »

http://foro.elhacker.net/programacion_visual_basic/api_rtlsetprocessiscritical-t234756.0.html
En línea


The fact is, even if you were to stop bombing us, imprisoning us, torturing us, vilifying us, and usurping our lands, we would continue to hate you because our primary reason for hating you will not cease to exist until you embrace Islam.
TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Creando un proceso crítico !!
« Respuesta #4 en: 11 Abril 2016, 23:21 pm »

Este codigo no estan elaborado como el que me distes (muchas gracias, juro que busque pero no me sabia el nombre de la API), pero funciona....

Código
  1. Imports System.Diagnostics
  2. Imports System.Runtime.InteropServices
  3.  
  4. Public Class Form1
  5.  
  6.    <DllImport("ntdll.dll", SetLastError:=True)> _
  7.    Public Shared Function NtSetInformationProcess(ByVal hProcess As IntPtr, ByVal processInformationClass As Integer, ByRef processInformation As Integer, ByVal processInformationLength As Integer) As Integer
  8.    End Function
  9.  
  10.    ' we want this to be a Critical Process
  11.    Dim isCritical As Integer = 1
  12.    ' we want this to be a Critical Process
  13.    Dim NoNCritical As Integer = 0
  14.    ' value for BreakOnTermination (flag)
  15.    Dim BreakOnTermination As Integer = &H1D
  16.  
  17.  
  18.    Sub Critico()
  19.        ' setting the BreakOnTermination = 1 for the current process
  20.        NtSetInformationProcess(Process.GetCurrentProcess().Handle, BreakOnTermination, isCritical, 4)
  21.  
  22.    End Sub
  23.  
  24.    Sub NoCritical()
  25.        ' setting the BreakOnTermination = 0 for the current process
  26.        NtSetInformationProcess(Process.GetCurrentProcess().Handle, BreakOnTermination, NoNCritical, 4)
  27.  
  28.    End Sub
  29.  
  30.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  31.        Process.EnterDebugMode()
  32.        'acquire Debug Privileges
  33.    End Sub
  34. End Class
  35.  
En línea

HCK.

Desconectado Desconectado

Mensajes: 181



Ver Perfil
Re: Creando un proceso crítico !!
« Respuesta #5 en: 12 Abril 2016, 10:45 am »

Muchas gracias por subirlo compañero!!, no sabía que había una API que creará un proceso crítico... Vamos, tampoco me había hecho falta nunca y no lo había buscado, pero ya sabiéndolo perfecto  ;-)

Un saludo
En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Creando un proceso crítico !!
« Respuesta #6 en: 12 Abril 2016, 16:01 pm »

Ahhh es que nunca sabes cuando te hara falta, jajaja, creo que se puede mejorar para evitar que algun inteligente lo vuelva hacer normal desde otra aplicación si encuentro algo lo subo..

Salu2
En línea

HCK.

Desconectado Desconectado

Mensajes: 181



Ver Perfil
Re: Creando un proceso crítico !!
« Respuesta #7 en: 14 Abril 2016, 03:12 am »

Tengo que investigarlo cuando tenga un rato... Quizás la idea podría pasar en crear un nuevo thread con un bucle while o en un timer, que fuerce constantemente el estado de proceso crítico... Aunque eso sería un apaño algo cutre que haría a la CPU a consumir un cacho de recursos...  :rolleyes:

Esto que digo quizás podría ser algo más eficiente si en la API podríamos encontrar alguna función que permita comprobar el estado del proceso, y si varía, cambiarlo a crítico de nuevo... No se, todo es mirarlo, si doy con algo lo posteo  ;D

Un saludo
En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Creando un proceso crítico !!
« Respuesta #8 en: 14 Abril 2016, 05:37 am »

Pues si algo elaborare tambien para impedir algo como eso por ahora no me apura, ok !!

Salu2
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Creando un proceso crítico !!
« Respuesta #9 en: 15 Abril 2016, 14:58 pm »

Otra forma de llevarlo a cabo sería utilizando el método Win32 RtlSetProcessIsCritical, el cual lo considero más apropiado o "directo" puesto que afecta al proceso actual desde el que se invocó dicho método, pero claro está, si queremos que afecte a un proceso distinto, entonces hay que usar la ya mencionada función Win32 NTSetInformationProcess.

Hay que tener en cuenta también, que para poder establecer un proceso cómo "crítico", dicho proceso necesita tener establecido el privilegio de proceso "SE_DEBUG_NAME" (y si usasemos la función NtSetInformationProcess, es necesario que el proceso sea abierto con el privilegio "PROCESS_SET_INFORMATION"), por lo que esto aumenta considerablemente el tamaño del código fuente, declarando y utilizando los P/Invokes para asegurarnos (o al menos intentarlo) que todo salga de forma esperada.

Para determinar si un proceso es crítico o no lo es, en versiones superiores a Windows XP podemos llamar a la función Win32 IsProcessCritical, la cual es muy cómoda y abstracta, pero en Windows XP deberemos utilizar la función NtQueryInformationProcess, la cual es insegura llamarla dependiendo de la versión de Windows desde la que se llame (como indica la documentación de dicha función en MSDN), y como Windows XP es un sistema operativo obsoleto, no me he molestado en implementar dicha función.

Aquí está mi solución (probado en Windows 10 y Windows XP), un "todo en uno", tanto para establecer el proceso actual como "Crítico", "Normal", y averiguar si un proceso es crítico o no lo es:

( Todos los P/Invokes del código fuente, excepto el método 'RtlSetProcessIsCritical', los he sacado de mi framework ElektroKit, lo comento por que con mi librería podeis hacer muchas virguerías al poder utilizar todos estos miembros Win32...y una infinidad más en el namespace Elektro.Interop.Win32:
)

Clase para definir el P/Invoking:
Código
  1. Namespace Win32
  2.  
  3.    Friend NotInheritable Class NativeMethods
  4.  
  5.        <DebuggerNonUserCode>
  6.        Private Sub New()
  7.        End Sub
  8.  
  9.        <Flags>
  10.        Friend Enum TokenPrivilegesFlags As UInteger
  11.            PrivilegeEnabledBYDefault = &H1UI
  12.            PrivilegeEnabled = &H2UI
  13.            PrivilegeRemoved = &H4UI
  14.            PrivilegeUsedForAccess = &H80000000UI
  15.        End Enum
  16.  
  17.        <Flags>
  18.        Friend Enum AccessRights As UInteger
  19.            TokenAdjustPrivileges = &H32UI
  20.            TokenQuery = &H8UI
  21.        End Enum
  22.  
  23.        <StructLayout(LayoutKind.Sequential)>
  24.        Friend Structure TokenPrivileges
  25.            <MarshalAs(UnmanagedType.I4)>
  26.            Public PrivilegeCount As Integer
  27.  
  28.            <MarshalAs(UnmanagedType.Struct)>
  29.            Public Privileges As LuIdAndAttributes
  30.        End Structure
  31.  
  32.        <StructLayout(LayoutKind.Sequential)>
  33.        Friend Structure LuIdAndAttributes
  34.            <MarshalAs(UnmanagedType.Struct)>
  35.            Public PLuid As Luid
  36.  
  37.            <MarshalAs(UnmanagedType.U4)>
  38.            Public Attributes As TokenPrivilegesFlags
  39.        End Structure
  40.  
  41.        <StructLayout(LayoutKind.Sequential)>
  42.        Friend Structure Luid
  43.            <MarshalAs(UnmanagedType.U4)>
  44.            Public LowPart As UInteger
  45.  
  46.            <MarshalAs(UnmanagedType.I4)>
  47.            Public HighPart As Integer
  48.        End Structure
  49.  
  50.        <DllImport("advapi32.dll", SetLastError:=True)>
  51.        Friend Shared Function AdjustTokenPrivileges(
  52.                   <MarshalAs(UnmanagedType.SysInt)> ByVal tokenHandle As IntPtr,
  53.                     <MarshalAs(UnmanagedType.Bool)> ByVal disableAllPrivileges As Boolean,
  54.                   <MarshalAs(UnmanagedType.Struct)> ByRef newState As TokenPrivileges,
  55.                       <MarshalAs(UnmanagedType.U4)> ByVal bufferLength As UInteger,
  56.                   <MarshalAs(UnmanagedType.SysInt)> ByVal previousState As IntPtr,
  57.                   <MarshalAs(UnmanagedType.SysInt)> ByVal returnLength As IntPtr
  58.        ) As <MarshalAs(UnmanagedType.Bool)> Boolean
  59.        End Function
  60.  
  61.        <DllImport("advapi32.dll", SetLastError:=True)>
  62.        Friend Shared Function OpenProcessToken(
  63.              <MarshalAs(UnmanagedType.SysInt)> ByVal processHandle As IntPtr,
  64.                  <MarshalAs(UnmanagedType.U4)> ByVal desiredAccess As AccessRights,
  65.              <MarshalAs(UnmanagedType.SysInt)> ByRef tokenHandle As IntPtr
  66.        ) As <MarshalAs(UnmanagedType.I4)> Integer
  67.        End Function
  68.  
  69.        <DllImport("advapi32.dll", SetLastError:=True, CharSet:=CharSet.Unicode, BestFitMapping:=False, ThrowOnUnmappableChar:=True)>
  70.        Friend Shared Function LookupPrivilegeValue(
  71.                  <MarshalAs(UnmanagedType.LPWStr)> ByVal lpSystemName As String,
  72.                  <MarshalAs(UnmanagedType.LPWStr)> ByVal lpName As String,
  73.                  <MarshalAs(UnmanagedType.Struct)> ByRef lpLuid As Luid
  74.        ) As <MarshalAs(UnmanagedType.I4)> Integer
  75.        End Function
  76.  
  77.        <DllImport("Kernel32.dll", SetLastError:=True)>
  78.        Friend Shared Function IsProcessCritical(
  79.               <MarshalAs(UnmanagedType.SysInt)> ByVal hProcess As IntPtr,
  80.                 <MarshalAs(UnmanagedType.Bool)> ByRef refIsCritical As Boolean
  81.        ) As <MarshalAs(UnmanagedType.Bool)> Boolean
  82.        End Function
  83.  
  84.        <DllImport("ntdll.dll", EntryPoint:="RtlSetProcessIsCritical", SetLastError:=True)>
  85.        Friend Shared Sub SetCurrentProcessIsCritical(
  86.                      <MarshalAs(UnmanagedType.Bool)> ByVal isCritical As Boolean,
  87.                      <MarshalAs(UnmanagedType.Bool)> ByRef refWasCritical As Boolean,
  88.                      <MarshalAs(UnmanagedType.Bool)> ByVal needSystemCriticalBreaks As Boolean)
  89.        End Sub
  90.  
  91.    End Class
  92.  
  93. End Namespace

Clase para definir los métodos o abstracción de los algoritmos:
Código
  1. Imports Win32
  2. Imports Win32.NativeMethods
  3.  
  4. Namespace Tools
  5.  
  6.    Public NotInheritable Class ProcessUtil
  7.  
  8.        <DebuggerNonUserCode>
  9.        Private Sub New()
  10.        End Sub
  11.  
  12.        ''' ----------------------------------------------------------------------------------------------------
  13.        ''' <summary>
  14.        ''' Specifies a critical state of a process.
  15.        ''' </summary>
  16.        ''' ----------------------------------------------------------------------------------------------------
  17.        Public Enum ProcessCriticalState As Integer
  18.  
  19.            ''' <summary>
  20.            ''' Process isn't critical.
  21.            ''' </summary>
  22.            NonCritical = 0
  23.  
  24.            ''' <summary>
  25.            ''' Process is critical.
  26.            ''' </summary>
  27.            Critical = 1
  28.  
  29.        End Enum
  30.  
  31.        ''' ----------------------------------------------------------------------------------------------------
  32.        ''' <summary>
  33.        ''' Determines whether the specified process is considered <c>critical</c>.
  34.        ''' </summary>
  35.        ''' ----------------------------------------------------------------------------------------------------
  36.        ''' <param name="handle">
  37.        ''' A handle (<see cref="IntPtr"/>) to the process to query.
  38.        ''' </param>
  39.        ''' ----------------------------------------------------------------------------------------------------
  40.        ''' <returns>
  41.        ''' A <see cref="ProcessCriticalState"/> enumeration value indicating the critical state.
  42.        ''' </returns>
  43.        ''' ----------------------------------------------------------------------------------------------------
  44.        <DebuggerStepThrough>
  45.        Public Shared Function GetProcessCriticalState(ByVal handle As IntPtr) As ProcessCriticalState
  46.  
  47.            If (handle = IntPtr.Zero) Then
  48.                Throw New ArgumentNullException(paramName:="handle")
  49.  
  50.            Else
  51.                Dim result As Boolean
  52.                Dim win32Err As Integer
  53.  
  54.                NativeMethods.IsProcessCritical(handle, result)
  55.                win32Err = Marshal.GetLastWin32Error()
  56.  
  57.                If (win32Err <> 0) Then
  58.                    Throw New Win32Exception(win32Err)
  59.  
  60.                Else
  61.                    Select Case result
  62.                        Case True
  63.                            Return ProcessCriticalState.Critical
  64.  
  65.                        Case Else
  66.                            Return ProcessCriticalState.NonCritical
  67.  
  68.                    End Select
  69.  
  70.                End If
  71.  
  72.            End If
  73.  
  74.        End Function
  75.  
  76.        ''' ----------------------------------------------------------------------------------------------------
  77.        ''' <summary>
  78.        ''' Determines whether the caller process is considered <c>critical</c>.
  79.        ''' </summary>
  80.        ''' ----------------------------------------------------------------------------------------------------
  81.        ''' <returns>
  82.        ''' A <see cref="ProcessCriticalState"/> enumeration value indicating the critical state.
  83.        ''' </returns>
  84.        ''' ----------------------------------------------------------------------------------------------------
  85.        <DebuggerStepThrough>
  86.        Public Shared Function GetCurrentProcessCriticalState() As ProcessCriticalState
  87.  
  88.            Return ProcessUtil.GetProcessCriticalState(Process.GetCurrentProcess().Handle)
  89.  
  90.        End Function
  91.  
  92.        ''' ----------------------------------------------------------------------------------------------------
  93.        ''' <summary>
  94.        ''' Sets the critical state for the caller process.
  95.        ''' </summary>
  96.        ''' ----------------------------------------------------------------------------------------------------
  97.        ''' <param name="state">
  98.        ''' The new critical state.
  99.        ''' </param>
  100.        ''' ----------------------------------------------------------------------------------------------------
  101.        ''' <exception cref="InvalidEnumArgumentException">
  102.        ''' state
  103.        ''' </exception>
  104.        ''' ----------------------------------------------------------------------------------------------------
  105.        <DebuggerStepThrough>
  106.        Public Shared Sub SetCurrentProcessCriticalState(ByVal state As ProcessCriticalState)
  107.  
  108.            Dim isCritical As Boolean
  109.            Dim wasCritical As Boolean
  110.            Dim needSystemCriticalBreaks As Boolean = False
  111.  
  112.            Select Case state
  113.  
  114.                Case ProcessCriticalState.Critical
  115.                    isCritical = True
  116.  
  117.                Case ProcessCriticalState.NonCritical
  118.                    isCritical = False
  119.  
  120.                Case Else
  121.                    Throw New InvalidEnumArgumentException(argumentName:="state", invalidValue:=state,
  122.                                                       enumClass:=GetType(ProcessCriticalState))
  123.                    Exit Sub
  124.  
  125.            End Select
  126.  
  127.            ' Set "SE_DEBUG_NAME" process privilege,
  128.            ' required to debug and adjust the memory of a process owned by another account.
  129.            ProcessUtil.SetCurrentProcessPrivilege("SE_DEBUG_NAME")
  130.  
  131.            ' Set the critical state.
  132.            NativeMethods.SetCurrentProcessIsCritical(isCritical, wasCritical, needSystemCriticalBreaks)
  133.  
  134. #If DEBUG Then
  135.            Debug.WriteLine(String.Format("Current process was critical?: {0}", wasCritical))
  136. #End If
  137.  
  138.        End Sub
  139.  
  140.        ''' ----------------------------------------------------------------------------------------------------
  141.        ''' <summary>
  142.        ''' Sets a process privilege for the caller process.
  143.        ''' </summary>
  144.        ''' ----------------------------------------------------------------------------------------------------
  145.        ''' <remarks>
  146.        ''' <see href="https://msdn.microsoft.com/en-us/library/windows/desktop/bb530716%28v=vs.85%29.aspx"/>
  147.        ''' </remarks>
  148.        ''' ----------------------------------------------------------------------------------------------------
  149.        Private Shared Sub SetCurrentProcessPrivilege(ByVal privilegeName As String)
  150.  
  151.            Dim hToken As IntPtr
  152.            Dim tkp As New TokenPrivileges
  153.  
  154.            NativeMethods.OpenProcessToken(Process.GetCurrentProcess().Handle,
  155.                                           AccessRights.TokenAdjustPrivileges Or
  156.                                           AccessRights.TokenQuery,
  157.                                           hToken)
  158.  
  159.            With tkp
  160.                .PrivilegeCount = 1
  161.                .Privileges.Attributes = TokenPrivilegesFlags.PrivilegeEnabled
  162.            End With
  163.  
  164.            NativeMethods.LookupPrivilegeValue(Nothing, privilegeName, tkp.Privileges.PLuid)
  165.            NativeMethods.AdjustTokenPrivileges(hToken, False, tkp, 0UI, IntPtr.Zero, IntPtr.Zero)
  166.  
  167.        End Sub
  168.  
  169.    End Class
  170.  
  171. End Namespace

Clase (cualquiera) donde utilizar los miembros definidos:
Código
  1. Imports Tools
  2. Imports Tools.ProcessUtil
  3.  
  4. Public NotInheritable Class Form1 : Inherits Form
  5.  
  6.    ' Establecer el estado del proceso actual a: crítico.
  7.    Private Sub Button1_Click() Handles Button1.Click
  8.        ProcessUtil.SetCurrentProcessCriticalState(ProcessCriticalState.Critical)
  9.    End Sub
  10.  
  11.    ' Establecer el estado del proceso actual a: no-crítico.
  12.    Private Sub Button2_Click() Handles Button2.Click
  13.        ProcessUtil.SetCurrentProcessCriticalState(ProcessCriticalState.NonCritical)
  14.    End Sub
  15.  
  16.    ' Determinar el estado del proceso actual.
  17.    Private Sub Button3_Click() Handles Button3.Click
  18.        Dim state As ProcessCriticalState = ProcessUtil.GetCurrentProcessCriticalState()
  19.        MessageBox.Show(String.Format("Is process critical?: {0}", CBool(state)))
  20.    End Sub
  21.  
  22. End Class
« Última modificación: 15 Abril 2016, 15:53 pm por Eleкtro » En línea



Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines