Seite 1 von 1

Datei soll eiegenen Inhalt lesen/schreiben können

Verfasst: 23.08.2008 10:23
von Chef Wiggum
Guten Morgen,
Ich würde gerne wissen ob es möglich ist, dass sich eine Datei selber zur Laufzeit für Lese- bzw. Schreibzugriff öffnen lässt.
Denn

Code: Alles auswählen

OpenFile(0,GetCurrentDirectory() + "\Testdatei.exe")
gibt leider einen Wert <> 1 .
Extern auf diese Weise geöffnet, klappt alles wunderbar.


Danke
MFG

Verfasst: 23.08.2008 10:34
von Little John
Du musst nicht GetCurrentDirectory() benutzen, sondern ProgramFilename().
Bei Schreib-Zugriffen sollte man sehr genau wissen, was man macht.

Gruß, Little John

Verfasst: 23.08.2008 12:02
von Chef Wiggum
Huch - Das geht ja rasch mit den Antworten hier.
Danke - Mit ReadFile() klappt es wunderbar :)

MFG

Verfasst: 23.08.2008 23:02
von Thorium
Ja, schreiben geht auch.

Brauchst nur ein Tool mit dem du den PE-Header entsprechend anpassen kannst, oder du machst es selbst.

Du musst dem Characteristics-Feld im PE-Header #IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP hinzufügen. Dann solltest du die Datei nach dem starten bearbeiten und sogar löschen können.

Verfasst: 23.08.2008 23:41
von Thorium
Sorry sieht so aus als währe das Feature in Windows gestrichen worden. Habs grad mal ausprobiert mit XP Pro, funktioniert nicht. :? :(

How ever. Hier mal der Testcode:
Modifiziert eine exe so das sie sich bearbeiten lassen sollte, wenn sie läuft. Funktioniert aber leider nicht.

Code: Alles auswählen

;/-------------------\
;| Make PE Writable  |
;|                   |
;| Version 1.00      |
;| by Thorium        |
;|                   |
;| PureBasic 4.20    |
;\-------------------/

EnableExplicit

#IMAGE_DOS_SIGNATURE                = $5A4D
#IMAGE_NT_SIGNATURE                 = $00004550
#IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = $0400

Define.l hFile,HeaderOffset
Define.w Characteristics

;open the file
hFile = OpenFile(#PB_Any,"c:\your.exe")
If hFile = 0
  MessageRequester("Error","Can't open file!",16)
  End
EndIf

;check if file is a executable
If ReadWord(hFile) <> #IMAGE_DOS_SIGNATURE
    MessageRequester("Error","File is not a executable!",16)
  End
EndIf

;read offset of PE header
FileSeek(hFile,$3C)
HeaderOffset = ReadLong(hFile)
If HeaderOffset = 0
  MessageRequester("Error","File is not a PE!",16)
  End
EndIf

;check if file is a PE
FileSeek(hFile,HeaderOffset)
If ReadLong(hFile) <> #IMAGE_NT_SIGNATURE
  MessageRequester("Error","File is not a PE!",16)
  End
EndIf

;read characteristics from PE header
FileSeek(hFile,HeaderOffset + $16)
Characteristics = ReadWord(hFile)

;add IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP to characteristics
Characteristics = Characteristics | #IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP

;write characteristics to PE header
FileSeek(hFile,HeaderOffset + $16)
WriteWord(hFile,Characteristics)

;close file
CloseFile(hFile)

MessageRequester("Make PE Writable","Done!")
End