Ressourcen aus EXE lesen

Du brauchst Grafiken, gute Programme oder Leute die dir helfen? Frag hier.
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Ressourcen aus EXE lesen

Beitrag von Leonhard »

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.
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

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.

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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Ab einer Structure mit einer Variable mit Liste z.B. Var.b[75] gibt es einen Fehler.

...äh... SYNTAX ERROR

ich les den satz jetzt zum fünften mal, ich versteh ihn nicht.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
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

Beitrag von ts-soft »

Warum das ganze Binär auslesen :freak:
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.
Bild
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

ts-soft hat geschrieben:Warum das ganze Binär auslesen :freak:
Vielleicht soll ja keine API verwendet werden?
Wie kann man den so was machen???

Das wäre sehr hilfreich !!!
Benutzeravatar
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

Beitrag von ts-soft »

http://msdn.microsoft.com/library/defau ... etypes.asp
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.
Bild
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Danke, werds kleich mal versuchen, ein kleines Prog zu schreien :->
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

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.
Leonhard hat geschrieben:Danke, werds kleich mal versuchen, ein kleines Prog zu schreiben :->
Wieviel promille?
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.
Antworten