fb:porticula NoPaste
hiddendata_dest.bas
Uploader: | ThePuppetMaster |
Datum/Zeit: | 20.06.2009 09:29:13 |
Hinweis: Dieser Quelltext ist Bestandteil des Projekts HiddenData, zu dem es auf FreeBASIC-Portal.de eine Projektseite gibt.
'######################################################################################
'Aufbau
'<APP_Data><Hidden_Data><4Byte_HiddenDataLen><4Byte_HiddenDataAllocLen><4Byte_AppLen>
'######################################################################################
Function HiddenData_Get() as String
'Programmname erfassen und aufbereiten
Dim XName as String = Command(0)
#If Defined(__fb_linux__)
XName = Mid(XName, InStrRev(XName, "/") + 1)
#ElseIf Defined(__fb_win32__)
XName = Mid(XName, InStrRev(XName, "\") + 1)
#EndIf
'Binärprogramm öffnen
Dim XFN1 as Integer = FreeFile
If Open(XName For Binary as #XFN1) <> 0 Then Return ""
'gesammtlänge der Datei erfassen
Dim XLen as UInteger = Lof(XFN1)
'12 Byte reservieren, welche die "Kopfdaten" der HiddenData speichert (Siehe Aufbau (ganz oben))
Dim D as String = Space(12)
'Die letzten 12 Byte aus dem Binärprogramm einlesen
Get #XFN1, XLen - 11, D
'von HiddenData gespeicherte Programmlänge, AllocateLänge udn DataLänge ausrechnen
Dim XALen as UInteger = (D[8] shl 24) or (D[9] shl 16) or (D[10] shl 8) or D[11]
Dim XLLen as UInteger = (D[4] shl 24) or (D[5] shl 16) or (D[6] shl 8) or D[7]
Dim XDLen as UInteger = (D[0] shl 24) or (D[1] shl 16) or (D[2] shl 8) or D[3]
'Sind eine der 3 Werte = 0 dann sind entweder die Daten nicht valid, oder nicht vorhanden.
If XALen = 0 Then Close #XFN1: Return ""
If XLLen = 0 Then Close #XFN1: Return ""
If XDLen = 0 Then Close #XFN1: Return ""
'Prüfen ob die Daten valid sind, indem die ursprüngliche Programmgrösse + der AllocateLänge + 12
'so gross ist, wie die aktuelle Dateigrösse. Wenn nicht, sidn die Daten invalid.
If XLen <> (XALen + XLLen + 12) Then Close #XFN1: Return ""
'Speicher reservieren der die Anzahl Bytes der HiddenData speichern kann
D = Space(XDLen)
'Daten einlesen
Get #XFN1, XALen + 1, D
Close #XFN1
'und zurückgeben
Return D
End Function
'######################################################################################
Sub HiddenData_Del()
'selbes verfahren wie bei "HiddenData_Get()"
Dim XName as String = Command(0)
#If Defined(__fb_linux__)
XName = Mid(XName, InStrRev(XName, "/") + 1)
#ElseIf Defined(__fb_win32__)
XName = Mid(XName, InStrRev(XName, "\") + 1)
#EndIf
'Da unter linux udn windows die Exedatei nicht direkt beschrieben werden kann, wärend sie arbeitet
'wird eine kopie der Datei erzeugt, udn anschliessend mit der Kopie gearbeitet.
Dim XFN2 as Integer = FreeFile
If Open(XName For Binary as #XFN2) <> 0 Then Exit Sub
Dim XFN1 as Integer = FreeFile
If Open(XName & " " For Binary as #XFN1) <> 0 Then Close #XFN2: Exit Sub
Dim XLen as UInteger = Lof(XFN2)
Dim D as String = Space(6000)
For X as UInteger = 1 to XLen Step 6000
If XLen - X < 6000 Then D = Space(XLen - X + 1)
Get #XFN2, X, D
Put #XFN1, X, D
Next
Close #XFN2
D = Space(12)
Get #XFN1, XLen - 11, D
Dim XALen as UInteger = (D[8] shl 24) or (D[9] shl 16) or (D[10] shl 8) or D[11]
Dim XLLen as UInteger = (D[4] shl 24) or (D[5] shl 16) or (D[6] shl 8) or D[7]
Dim XDLen as UInteger = (D[0] shl 24) or (D[1] shl 16) or (D[2] shl 8) or D[3]
If XALen = 0 Then Close #XFN1: Exit Sub
If XLLen = 0 Then Close #XFN1: Exit Sub
If XDLen = 0 Then Close #XFN1: Exit Sub
If XLen <> (XALen + XLLen + 12) Then Close #XFN1: Exit Sub
'In die Programmkopie wird zum löschen einfach der gesammte Header + die Länge an Daten mit 0 überschrieben.
Put #XFN1, XLen - (XDLen + 12), String(XDLen + 12, 0)
Close #XFN1
#If Defined(__fb_linux__)
'Zugriffsberechtigung für linux auslesen (X gesetzt?)
XFN1 = FreeFile
Open Pipe "ls -l " & XName for input as #XFN1
Do Until Eof(XFN1)
Line Input #XFN1, D
D = Left(D, 10)
Exit Do
Loop
Close #XFN1
#EndIf
'originalprogramm lsöchen
Kill XName
'kopie zu original umbenennen
Name XName & " " as XName
#If Defined(__fb_linux__)
'wenn X unter linux gesetzt, dann bei der kopie auch setzen.
If Right(D, 1) = "x" Then
XFN1 = FreeFile
Open Pipe "chmod +x " & XName for input as #XFN1
Do Until Eof(XFN1)
Exit Do
Loop
Close #XFN1
End If
#EndIf
End Sub
'######################################################################################
Sub HiddenData_Set(V_Data as String)
'erstmal die daten löschen
HiddenData_Del()
'selbes verfahren wie bei "HiddenData_Del()"
Dim XName as String = Command(0)
#If Defined(__fb_linux__)
XName = Mid(XName, InStrRev(XName, "/") + 1)
#ElseIf Defined(__fb_win32__)
XName = Mid(XName, InStrRev(XName, "\") + 1)
#EndIf
Dim XFN2 as Integer = FreeFile
If Open(XName For Binary as #XFN2) <> 0 Then Exit Sub
Dim XFN1 as Integer = FreeFile
If Open(XName & " " For Binary as #XFN1) <> 0 Then Close #XFN2: Exit Sub
Dim XLen as UInteger = Lof(XFN2)
Dim D as String = Space(6000)
For X as UInteger = 1 to XLen Step 6000
If XLen - X < 6000 Then D = Space(XLen - X + 1)
Get #XFN2, X, D
Put #XFN1, X, D
Next
Close #XFN2
D = Space(12)
Get #XFN1, XLen - 11, D
Dim XALen as UInteger = (D[8] shl 24) or (D[9] shl 16) or (D[10] shl 8) or D[11]
Dim XLLen as UInteger = (D[4] shl 24) or (D[5] shl 16) or (D[6] shl 8) or D[7]
'Als datenlänge wird die länge der "hiddenData" genutzt
Dim XDLen as UInteger = Len(V_Data)
'ist die Datenlänge kleiner der AllocateLänge, wird diese vergrössert
If XLLen < XDLen Then XLLen = XDLen
'längenangaben in den String umsetzen, um sie OS "Endian" unabhängig lesen zu können.
Dim XSAL as String = Chr((XALen shr 24) and 255) & Chr((XALen shr 16) and 255) & Chr((XALen shr 8) and 255) & Chr(XALen and 255)
Dim XSLL as String = Chr((XLLen shr 24) and 255) & Chr((XLLen shr 16) and 255) & Chr((XLLen shr 8) and 255) & Chr(XLLen and 255)
Dim XSDL as String = Chr((XDLen shr 24) and 255) & Chr((XDLen shr 16) and 255) & Chr((XDLen shr 8) and 255) & Chr(XDLen and 255)
'ist noch kein header vorhanden?
If XLen <> (XALen + XLLen + 12) Then
'dann neuen header erzeugen
'originla programmlänge erfassen
XALen = XLen
'allocatelänge = der datenlänge
XLLen = XDLen
'stings umsetzen
XSAL = Chr((XALen shr 24) and 255) & Chr((XALen shr 16) and 255) & Chr((XALen shr 8) and 255) & Chr(XALen and 255)
XSLL = Chr((XLLen shr 24) and 255) & Chr((XLLen shr 16) and 255) & Chr((XLLen shr 8) and 255) & Chr(XLLen and 255)
'daten und header in datei schreiben (ans ende hinzufügen)
Put #XFN1, XALen + 1, V_Data & XSDL & XSLL & XSAL
Else
'header schon vorhanden
'Daten ans ende der originalen porgrammlänge schreiben
Put #XFN1, XALen, V_Data
'udn header ans ende hinzufügen
Put #XFN1, (XALen + XLLen) - 11, XSDL & XSLL & XSAL
End If
Close #XFN1
'wieder wie bei "HiddenData_Get()"
#If Defined(__fb_linux__)
XFN1 = FreeFile
Open Pipe "ls -l " & XName for input as #XFN1
Do Until Eof(XFN1)
Line Input #XFN1, D
D = Left(D, 10)
Exit Do
Loop
Close #XFN1
#EndIf
Kill XName
Name XName & " " as XName
#If Defined(__fb_linux__)
If Right(D, 1) = "x" Then
XFN1 = FreeFile
Open Pipe "chmod +x " & XName for input as #XFN1
Do Until Eof(XFN1)
Exit Do
Loop
Close #XFN1
End If
#EndIf
End Sub
'######################################################################################
Dim D as String
'n bissi was zum testen....
D = HiddenData_Get()
Print "GET_Len: "; Str(Len(D))
Print "GET_Data:>"; D; "<"
Print
HiddenData_Set("Test")
Print "SET: >Test<"
Print
D = HiddenData_Get()
Print "GET_Len: "; Str(Len(D))
Print "GET_Data:>"; D; "<"
Print
HiddenData_Del()
Print "DEL"
Print
D = HiddenData_Get()
Print "GET_Len: "; Str(Len(D))
Print "GET_Data:>"; D; "<"
Print
HiddenData_Set("1234")
Print "SET: >1234<"
Print
D = HiddenData_Get()
Print "GET_Len: "; Str(Len(D))
Print "GET_Data:>"; D; "<"
Print
End 0