Visual Basic Forum

Visual Basic Forum
für VB6 und VB.NET Programmierer
 
RegistrierenRegistrieren  LoginLogin

Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB6] Source Codes
Autor
Nachricht
ZiG_
Überflieger
Überflieger

Anmeldedatum: 07.03.2007
Beiträge: 1248

[B] AntiSandboxie **Update**
Verfasst am: 03.08.2007, 08:54

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. Wink

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, 11:47, insgesamt 4-mal bearbeitet
 
Bahamut_
« Moderator »<b><font color=green>« Moderator »</font



Anmeldedatum: 12.12.2006
Beiträge: 250


Verfasst am: 03.08.2007, 10:25

Hehe nette Sache, ich habs ja schon gestern getestet und es hat einwandfrei funktioniert Smile

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 ^^

Und nicht nur einen guten Source gepostet, sondern auch noch gut beschrieben, so muss das sein Very Happy
_________________
VB.Net-Compiler: http://www.microsoft.com/germany/express/download/default.aspx
VB.Net-eBook: http://www.galileocomputing.de/openbook/visual_basic/
 
ZiG_
Überflieger
Überflieger

Anmeldedatum: 07.03.2007
Beiträge: 1248


Verfasst am: 08.08.2007, 07:53

**Update**

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)
 
Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB6] Source Codes

Tags: sandboxie code, processfirst, prozessname, parentprocessid, processentry32

 
 Verwandte Themen   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Wie kann ich mich bei euch anmelden?? 387 20.05.2002, 01:28
Keine neuen Beiträge Eine kleine Frage an euch.. 373 30.09.2007, 09:57
Keine neuen Beiträge TopMost Funktion unter DirectX 432 27.07.2007, 11:48
Keine neuen Beiträge Wie Funktion nutzen ? 540 29.06.2007, 21:59
Keine neuen Beiträge update funktion einbauen 741 29.01.2007, 00:11
 



[ Time: 0.4165s ][ Queries: 89 (0.1168s) ][ GZIP on - Debug on ]