• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

fLaSh_PT

Virtual Machine Detecção [transferido para wiki]

6 mensagens neste tópico

Vou postar aqui um modulo interessante que elaborei.. trata-se do ambiente em que a aplicação está a ser executada..

Com este modulo consegues detectar se a aplicação está a correr nos seguintes ambientes:

- Sandboxie : http://www.sandboxie.com/

- ThreatExpert : http://www.threatexpert.com/

- Anubis : http://anubis.iseclab.org/

- CWSandbox : http://www.cwsandbox.org/

- JoeBox : http://www.joebox.org/

Imports System
Imports System.Runtime.InteropServices
Imports System.Diagnostics
Imports Microsoft.Win32
Module DetectVM
    '---------------------------------------------------------------------------------------
    ' Module      : mDetectVM
    ' DateTime    : 20/06/2009 00:00
    ' Author      : fLaSh
    ' Purpose     : Mini Virtual Machine detection module
    ' Usage       : At your own risk
    '---------------------------------------------------------------------------------------
    '
    'Detect 5 Different Sandboxes:
    '   -> Sandboxie : http://www.sandboxie.com/
    '   -> ThreatExpert : http://www.threatexpert.com/
    '   -> Anubis : http://anubis.iseclab.org/
    '   -> CWSandbox : http://www.cwsandbox.org/
    '   -> JoeBox : http://www.joebox.org/
    '

    'Inner enum used only internally
    <Flags()> _
    Private Enum SnapshotFlags As Int32
        HeapList = &H1
        Process = &H2
        Thread = &H4
        [Module] = &H8
        Module32 = &H10
        Inherit = &H80000000
        All = &H1F
    End Enum

    Public Enum MyProcessEx As Byte
        NORMAL = 0
        VIRTUAL = 1
        VMWARE = 2
        Sandboxie = 3
        ThreatExpert = 4
        VBOX = 5
        Anubis = 6
        CWSandbox = 7
        JoeBox = 8
    End Enum

    'Inner struct used only internally
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
    Private Structure PROCESSENTRY32
        Const MAX_PATH As Integer = 260
        Friend dwSize As UInt32
        Friend cntUsage As UInt32
        Friend th32ProcessID As UInt32
        Friend th32DefaultHeapID As IntPtr
        Friend th32ModuleID As UInt32
        Friend cntThreads As UInt32
        Friend th32ParentProcessID As UInt32
        Friend pcPriClassBase As Int32
        Friend dwFlags As UInt32
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAX_PATH)> _
        Friend szExeFile As String
    End Structure

    <DllImport("kernel32", SetLastError:=True, CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
    Private Function CreateToolhelp32Snapshot(<[in]()> ByVal dwFlags As UInt32, <[in]()> ByVal th32ProcessID As UInt32) As IntPtr
    End Function

    <DllImport("kernel32", SetLastError:=True, CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
    Private Function Process32First(<[in]()> ByVal hSnapshot As IntPtr, ByRef lppe As PROCESSENTRY32) As Boolean
    End Function

    <DllImport("kernel32", SetLastError:=True, CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
    Private Function Process32Next(<[in]()> ByVal hSnapshot As IntPtr, ByRef lppe As PROCESSENTRY32) As Boolean
    End Function

    <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
    Private Function Module32First(ByVal handle As Integer, ByVal entry As IntPtr) As Boolean
    End Function

    ' Get the parent process given a pid
    Private Function GetParentProcess(ByVal pid As Integer) As Process

        Dim parentProc As Process = Nothing
        Try
            Dim procEntry As New PROCESSENTRY32()
            procEntry.dwSize = CType(Marshal.SizeOf(GetType(PROCESSENTRY32)), UInt32)
            Dim handleToSnapshot As IntPtr = CreateToolhelp32Snapshot(CUInt(SnapshotFlags.Process), 0)
            If Process32First(handleToSnapshot, procEntry) Then
                Do
                    If pid = procEntry.th32ProcessID Then
                        parentProc = Process.GetProcessById(CInt(procEntry.th32ParentProcessID))
                        Exit Do
                    End If
                Loop While Process32Next(handleToSnapshot, procEntry)
            Else
                Throw New ApplicationException(String.Format("Failed with win32 error code {0}", Marshal.GetLastWin32Error()))
            End If
        Catch ex As Exception
            Throw New ApplicationException("Can't get the process.", ex)
        End Try
        Return parentProc
    End Function

    ' Get the specific parent process
    Private ReadOnly Property CurrentParentProcess() As Process
        Get
            Return GetParentProcess(Process.GetCurrentProcess().Id)
        End Get
    End Property

    Private Function IsVirtualPCPresent() As MyProcessEx
        Dim oKey As RegistryKey = Registry.ClassesRoot.OpenSubKey("SYSTEM\ControlSet001\Services\Disk\Enum", False)
        If oKey IsNot Nothing Then
            Dim sBuffer As String = oKey.GetValue("0").ToString.ToLower
            Select Case True
                Case sBuffer.Contains("*VIRTUAL*") : Return MyProcessEx.VIRTUAL
                Case sBuffer.Contains("*VMWARE*") : Return MyProcessEx.VMWARE
                Case sBuffer.Contains("*VBOX*") : Return MyProcessEx.VBOX
            End Select
        End If
        Return MyProcessEx.NORMAL
    End Function

    Private Function IsInSandbox() As MyProcessEx

        Dim parentProc As Process = Nothing
        Try

            Dim procEntry As New PROCESSENTRY32()
            procEntry.dwSize = CType(Marshal.SizeOf(GetType(PROCESSENTRY32)), UInt32)
            Dim handleToSnapshot As IntPtr = CreateToolhelp32Snapshot(CUInt(SnapshotFlags.Process), 0)
            If Process32First(handleToSnapshot, procEntry) Then
                Do
                    If procEntry.szExeFile.Contains("sbiedll.dll") Then
                        Return MyProcessEx.Sandboxie
                    ElseIf procEntry.szExeFile.Contains("dbghelp.dll") Then
                        Return MyProcessEx.ThreatExpert
                    End If
                Loop While Process32Next(handleToSnapshot, procEntry)
            Else
                Throw New ApplicationException(String.Format("Failed with win32 error code {0}", Marshal.GetLastWin32Error()))
            End If

        Catch ex As Exception
            Throw New ApplicationException("Can't get the process.", ex)
        End Try

        Try

            Dim oKey As RegistryKey = Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows\CurrentVersion", False)
            If oKey IsNot Nothing Then
                Dim sBuffer As String = oKey.GetValue("ProductId").ToString.ToLower
                Select Case True
                    Case sBuffer.Contains("76487-337-8429955-22614") : Return MyProcessEx.Anubis
                    Case sBuffer.Contains("76487-644-3177037-23510") : Return MyProcessEx.CWSandbox
                    Case sBuffer.Contains("55274-640-2673064-23950") : Return MyProcessEx.JoeBox
                End Select
            End If

        Catch ex As Exception
            Throw ex
        End Try

    End Function

    Public Function CheckMyProcess() As MyProcessEx
        Dim oProcess As MyProcessEx

        'Check for virtual machine
        oProcess = IsVirtualPCPresent()
        If Not oProcess = MyProcessEx.NORMAL Then
            Return oProcess
        End If

        'Check for Sandbox
        oProcess = IsInSandbox()
        If Not oProcess = MyProcessEx.NORMAL Then
            Return oProcess
        End If

        Return MyProcessEx.NORMAL

    End Function

End Module

Simples exemplo com utilizar:

    Public Sub Main()

        If Not CheckMyProcess() = MyProcessEx.NORMAL Then
            'Crash me 
            Dim int As Integer = 0
            Dim Crash As Byte = (99 * 9) / int
            End
        End If

End Sub

Se o processo não for NORMAL a aplicação "crasha"..

Compr.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu uso VMWare... tem q ser incluido :)

Está mto fixe a tua aplicação.

Vendo bem, está VMware no enumerado, mas na tua descrição não dizes q inclui vmware...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, não quero criticar o código porque não o vi, mas para que fins planeaste desenvolver este módulo? Mais concretamente, qual o objectivo de detectar se uma máquina está a correr numa VM?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu uso VMWare... tem q ser incluido :)

Está mto fixe a tua aplicação.

Vendo bem, está VMware no enumerado, mas na tua descrição não dizes q inclui vmware...

A descrição não está completa.. eu foi adicionando novos suportes e esqueci me de actualizar o comentário do inicio..

Detecta os seguintes ambientes:

    Public Enum MyProcessEx As Byte
        NORMAL = 0
        VIRTUAL = 1
        VMWARE = 2
        Sandboxie = 3
        ThreatExpert = 4
        VBOX = 5
        Anubis = 6
        CWSandbox = 7
        JoeBox = 8
    End Enum

@softclean

Apenas curiosidade :P

@jpaulino

Sim e porque não.. eu irei traduzir para PT.. e comentar o código..

Obrigado por os comentários..

Compr.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é que me faça jeito (por enquanto, claro) mas sei ver que está muito bom!

Parabéns  :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora