Einige von euch kennen sicher das Programm "Sandboxie". Wenn nicht, dann seht euch mal auf deren Homepage um: Sandboxie.com
Ich hab mir mal einen Weg überlegt wie man im Programm erkennen kann ob es in der Sandbox läuft oder nicht. Ein einfaches überprüfen ob Sandboxie läuft wäre denke ich nicht sinnvoll, da es ja nicht zwingend bedeuted, dass das Programm über Sandboxie gestartet wurde.
Manche fragen sich vielleicht jetzt wozu man das braucht. Ganz einfach. Wenn jemand eurem Programm nicht traut wird er es vielleicht mit Sandboxie mal testen. Wenn sich eurer Programm dann nicht auffällig verhält wird er es wahrscheinlich normal starten.
Hier mal die Erklärung wie es funktioniert.
Im Grunde ist es sehr einfach.
Zuerst suche ich unter allen Prozessen den vom eigenen Programm heraus. Und dann erhalte ich die ParentProcessID. Das ist der Prozess, der unser Programm erstellt/gestartet hat. Normal ist das "explorer.exe". Bei Sandboxie ist das nicht der Fall. Wenn das Programm per Sandboxie gestartet wird, erhält man eine ParentProcessID zurück die aber keinen einzigen Process zugewiesen ist. Warum das so ist, weiß ich nicht genau. Aber ich denke das dieser Process beendet wurde und deshalb nicht mehr läuft.
Hier noch zwei Bilder um das zu verdeutlichen.
So ist es normal.
Und so sieht es aus, wenn das Programm per Sandboxie gestartet wurde.
Ich habe euch eine nette Funktion dazu gebastelt, die ihr nur in ein Modul einfügen braucht.
Code:
' =========================================================
' Anti Sandboxie Code by ZiG for vb-x.org =
' =
' For testing purposes only! =
' I'm not responsible for anything you do with this code! =
' =========================================================
Option Explicit
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "kernel32" (ByVal hObject As Long)
Private Const TH32CS_SNAPPROCESS = &H2
Private Const MAX_PATH As Long = 260
Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH
End Type
Public Function Sandboxed(ByVal nFilename As String) As Boolean
Dim nSnapshot As Long, nProcess As PROCESSENTRY32
Dim nResult As Long, ParentID As Long, IDCheck As Boolean
'Abbild der Prozesse machen
nSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
If nSnapshot <> 0 Then
nProcess.dwSize = Len(nProcess)
'Zeiger auf ersten Prozess bewegen
nResult = ProcessFirst(nSnapshot, nProcess)
Do Until nResult = 0
'Überprüfen ob der Prozessname mit dem Namen der exe übereinstimmt.
If InStr(LCase$(nProcess.szExeFile), LCase$(nFilename)) <> 0 Then
'Wir merken uns die ParentProcessID
ParentID = nProcess.th32ParentProcessID
'Wir beginnen nochmal beim ersten Prozess
nResult = ProcessFirst(nSnapshot, nProcess)
Do Until nResult = 0
'Wir suchen den Process mit der ParentID
If nProcess.th32ProcessID = ParentID Then
'Falls so ein Prozess vorhanden ist, dann ist das Programm nicht sandboxed
IDCheck = False
Exit Do
Else
IDCheck = True
nResult = ProcessNext(nSnapshot, nProcess)
End If
Loop
'Falls check True ist, dann ist das Programm Sandboxed
Sandboxed = IDCheck
Exit Do
End If
'Zum nächsten Prozess
nResult = ProcessNext(nSnapshot, nProcess)
Loop
' Handle wird geschloßen
CloseHandle nSnapshot
End If
End Function
Aufrufen könnt ihr das ganze dann so:
Code:
Private Sub Form_Load()
If Sandboxed(App.EXEName) Then
'Programm läuft in der Sandbox
Else
'Programm läuft nicht in der Sandbox
'Programm kann normal weiterlaufen
End If
End Sub
Ich bitte um Feedback.
hf, ZiG
Edit//
Noch eine Information zum Code. Der Code wird erst funktionieren wenn ihr das Programm kompiliert habt, da sonst nicht der richtige Name bei App.EXEName übergeben wird. _________________
Zuletzt bearbeitet von ZiG_ am 20.12.2007, 10:47, insgesamt 4-mal bearbeitet
Bahamut_ « Moderator »
Anmeldedatum: 12.12.2006 Beiträge: 250
Verfasst am: 03.08.2007, 09:25
Hehe nette Sache, ich habs ja schon gestern getestet und es hat einwandfrei funktioniert
Programm wird normal gestartet: Not Sandboxed
Programm wird normal gestartet, Sandbox läuft aber im Hintergrund: Not Sandboxed
Programm wird über Sandbox gestartet: Sandboxed!
Ich hätte es eben mit Prozesse überprüfen gemacht und geschaut ob Sandbox läuft, aber das macht nicht so viel Sinn, wie du ja schon geschrieben hast ^^
Hab den code nochmal etwas überarbeitet, da mir die Methode noch nicht ganz gefallen hat.
Jetzt wird die ProcessID nicht über den Namen des Programmes ermittelt, sondern direkt über einen Api Aufruf.
Code:
' ========================================================
' Anti Sandboxie Code v2 by ZiG for vb-x.org =
' =
' For testing purposes only! =
' I'm not responible for anything you do with this code! =
' ========================================================
Option Explicit
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "kernel32" (ByVal hObject As Long)
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Const TH32CS_SNAPPROCESS = &H2
Private Const MAX_PATH As Long = 260
Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH
End Type
Public Function Sandboxed() As Boolean
Dim nSnapshot As Long, nProcess As PROCESSENTRY32
Dim nResult As Long, ParentID As Long, IDCheck As Boolean
Dim nProcessID As Long
'Eigene ProcessID ermitteln
nProcessID = GetCurrentProcessId
If nProcessID <> 0 Then
'Abbild der Prozesse machen
nSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
If nSnapshot <> 0 Then
nProcess.dwSize = Len(nProcess)
'Zeiger auf ersten Prozess bewegen
nResult = ProcessFirst(nSnapshot, nProcess)
Do Until nResult = 0
'Nach der eigenen ProcessID suchen.
If nProcess.th32ProcessID = nProcessID Then
'Wir merken uns die ParentProcessID
ParentID = nProcess.th32ParentProcessID
'Wir beginnen nochmal beim ersten Prozess
nResult = ProcessFirst(nSnapshot, nProcess)
Do Until nResult = 0
'Wir suchen den Process mit der ParentID
If nProcess.th32ProcessID = ParentID Then
'Falls so ein Prozess vorhanden ist, dann ist das Programm nicht sandboxed
IDCheck = False
Exit Do
Else
IDCheck = True
nResult = ProcessNext(nSnapshot, nProcess)
End If
Loop
'Falls check True ist, dann ist das Programm Sandboxed
Sandboxed = IDCheck
Exit Do
Else
'Zum nächsten Prozess
nResult = ProcessNext(nSnapshot, nProcess)
End If
Loop
' Handle wird geschloßen
CloseHandle nSnapshot
End If
End If
End Function
Code:
Private Sub Form_Load()
If Sandboxed() Then
Call MsgBox("File is sandboxed!")
Unload Me
Else
Call MsgBox("File is not sandboxed.")
'Programm kann normal weiterlaufen
End If
End Sub
hf _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)