Ressourcen aus EXE lesen
Ressourcen aus EXE lesen
Ich möchte gerne ein Programm schreiben, das Ressourcen aus einer EXE lesen kann.
Dazu sollen folgende dinge Ausgelesen werden können:
AVI
Interface/Classen/Enumeration -Befehle
Bitmaps
Menue
Dialoge
String
Cursor
Icon
Icon-Group
Versionsinformationen (kein problem)
alle Importierten/Benutzten dll/EXE-Dateien
alle ausgehenden Befehle (export) von DLL/EXE mit Adresse, Ordinal und Name (eventuell Parameter)
alle Macros, Labels, Proceduren, ...
Die eingespielte XML-Datei und weiter z.B. HTML-Dateien
Das wird warscheinlich ein kleiner DisAssebler werden.
Dazu sollen folgende dinge Ausgelesen werden können:
AVI
Interface/Classen/Enumeration -Befehle
Bitmaps
Menue
Dialoge
String
Cursor
Icon
Icon-Group
Versionsinformationen (kein problem)
alle Importierten/Benutzten dll/EXE-Dateien
alle ausgehenden Befehle (export) von DLL/EXE mit Adresse, Ordinal und Name (eventuell Parameter)
alle Macros, Labels, Proceduren, ...
Die eingespielte XML-Datei und weiter z.B. HTML-Dateien
Das wird warscheinlich ein kleiner DisAssebler werden.
Ich hab da mal ein bischen dran gebastelt. Dieser Code liest aus eine *.res die Structure aus. Ein Feheler ist leider nocht drin !!!
Ab einer Structure mit einer Variable mit Liste z.B. Var.b[75] gibt es einen Fehler.
Ab einer Structure mit einer Variable mit Liste z.B. Var.b[75] gibt es einen Fehler.
Code: Alles auswählen
Procedure GetRes_Type(String$)
Select String$
Case "Ë" : ProcedureReturn 1
Case "|ß" : ProcedureReturn 2
Default : ProcedureReturn #False
EndSelect
EndProcedure
Enumeration
#File1 = 1
EndEnumeration
If ReadFile(#File1,"Compiler\res\Windows.res") = 0
MessageRequester("","ÖffnungsERROR Datei #File1.")
End
EndIf
OpenConsole()
PrintN("Auslesen der Datei")
NewList StringInFile.s()
While Eof(#File1) = 0
AddElement(StringInFile())
StringInFile() = ReadString()
Wend
CloseFile(#File1)
ForEach StringInFile()
;Dieser Durchlauf benötigt die volgenden Variablen:
DefType.l NextCommingDate ; Gibt an, was als nächstes Declamiert wird
; 1=Enumeration
; 2=Structure
DefType.l LastCommingDate ; Enthält das gleiche wie NextCommingDate. Es
; handelt sich hir nur um den zuletzt bearbeiteten Type.
DefType.b IsEnd ; Gibt das Ende an z.B. in einem Durchlauf einer Structure
DefType.b IsStart ; Gibt den Start an z.B. in einem Durchlauf einer Structure
DefType.b IsList ; Gibt an, ob eine List vorhanden ist z.B. in einer Structure (VAR.TYPE[ANZ])
If ListIndex(StringInFile()) <= 350
;PrintN(StringInFile())
Else
Break
EndIf
;{ Überprüfe, ob anfang OK
If ListIndex(StringInFile())=0
If StringInFile()="ERUP"
PrintN("->("+Str(ListIndex(StringInFile()))+")OK")
SelectElement(StringInFile(),ListIndex(StringInFile())+4)
PrintN(StringInFile())
If Left(StringInFile(),Len("3SERTCRS"))="3SERTCRS"
PrintN("->("+Str(ListIndex(StringInFile()))+")OK (2)")
NextCommingDate=GetRes_Type(Right(StringInFile(),Len(StringInFile())-Len("3SERTCRS")))
If NextCommingDate=#False
PrintN("->("+Str(ListIndex(StringInFile()))+")Fehler !!! Unbekannter Type: '"+Right(StringInFile(),Len(StringInFile())-Len("3SERTCRS"))+"'")
Input()
End
EndIf
Else
PrintN("->("+Str(ListIndex(StringInFile()))+")NOT OK (2)")
PrintN("->("+Str(ListIndex(StringInFile()))+")Die von ihnen angegebene Datei ist keine *.res-Datei, die von diesem Programm ausgelesen werden kann.")
Input()
End
EndIf
Else
PrintN("->("+Str(ListIndex(StringInFile()))+")NOT OK")
PrintN("->("+Str(ListIndex(StringInFile()))+")Die von ihnen angegebene Datei ist keine *.res-Datei, die von diesem Programm ausgelesen werden kann.")
Input()
End
EndIf
Continue
EndIf
;}
;{ Lese Structure-Daten
If NextCommingDate = 2
IsEnd = #False
IsStart = #True
PrintN("->("+Str(ListIndex(StringInFile()))+")Next is Sctructure")
PrintN("->("+Str(ListIndex(StringInFile()))+")StructureName: '"+StringInFile()+"'")
SelectElement(StringInFile(),ListIndex(StringInFile())+5)
If LastCommingDate = NextCommingDate
SelectElement(StringInFile(),ListIndex(StringInFile()))
EndIf
Repeat
SelectElement(StringInFile(),ListIndex(StringInFile())+4)
If StringInFile() = ""
IsEnd=#True
;PrintN("->("+Str(ListIndex(StringInFile()))+")Letztes Element der Structure")
SelectElement(StringInFile(),ListIndex(StringInFile())+10+3)
Else
;PrintN("->("+Str(ListIndex(StringInFile()))+")Structure-Element-Pram: '"+StringInFile()+"'")
SelectElement(StringInFile(),ListIndex(StringInFile())+9)
EndIf
If (LastCommingDate = NextCommingDate) And (IsStart = #True)
SelectElement(StringInFile(),ListIndex(StringInFile())+1)
IsStart = #False
EndIf
If Right(StringInFile(),Len(StringInFile())-4) = "" ; Wenn ein Pointer angegeben ist
SelectElement(StringInFile(),ListIndex(StringInFile())-1)
If Right(StringInFile(),Len(StringInFile())-4) = "" ; Wenn eine Liste (VAR.TYPE[ANZ]) angegeben ist
SelectElement(StringInFile(),ListIndex(StringInFile())+4)
Print ("->("+Str(ListIndex(StringInFile()))+")Structure-Feld-Name: '"+StringInFile()+".")
IsList=#True
Else
Print ("->("+Str(ListIndex(StringInFile()))+")Structure-Feld-Name: '*"+Right(StringInFile(),Len(StringInFile())-4)+".")
IsList=#False
EndIf
Else
Print ("->("+Str(ListIndex(StringInFile()))+")Structure-Feld-Name: '"+Right(StringInFile(),Len(StringInFile())-4)+".")
EndIf
SelectElement(StringInFile(),ListIndex(StringInFile())+1)
Print(StringInFile())
If IsList=#True
SelectElement(StringInFile(),ListIndex(StringInFile())+1)
Print("["+StringInFile()+"]")
EndIf
PrintN("'")
Until IsEnd=#True
LastCommingDate = NextCommingDate
NextCommingDate = 0
EndIf
;}
;{ Lese Enumeraion-Daten
If NextCommingDate = 1
PrintN("->("+Str(ListIndex(StringInFile()))+")Found a Enumaration")
LastCommingDate = NextCommingDate
NextCommingDate = 0
EndIf
;}
;{ Lese den nächst kommenden Type aus
If NextCommingDate = 0
NextCommingDate = LastCommingDate
; SelectElement(StringInFile(),ListIndex(StringInFile())+1)
; PrintN("->("+Str(ListIndex(StringInFile()))+")NextType"+Str(GetRes_Type(StringInFile())))
; PrintN(StringInFile())
EndIf
;}
Next
;PrintN("Schreibe Listen-Inhalt in Datei")
;{ Schreibe Listen-Inhalt in Windows.res.txt
;CreateFile(#File1,"Compiler\res\Windows.res.txt")
;ForEach StringInFile()
; WriteStringN(StringInFile())
;Next
;CloseFile(#File1)
;}
Print("Fertig")
Input()
CloseConsole()
End
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Warum das ganze Binär auslesen
Vielleicht soll ja keine API verwendet werden?

Vielleicht soll ja keine API verwendet werden?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
http://msdn.microsoft.com/library/defau ... etypes.asp
sollte Dir den Einstieg erleichtern.
sollte Dir den Einstieg erleichtern.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Leonhard hat geschrieben:Ich hab da mal ein bischen dran gebastelt. Dieser Code liest aus einer *.res die Structure aus. Ein Feheler ist leider nocht drin !!!
Ab einer Structure mit einer Variable mit Liste z.B. Var.b[75] gibt es einen Fehler.
Wieviel promille?Leonhard hat geschrieben:Danke, werds kleich mal versuchen, ein kleines Prog zu schreiben :->
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.