Seite 1 von 1

Ressourcen aus EXE lesen

Verfasst: 12.04.2006 11:26
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.

Verfasst: 12.04.2006 20:45
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

Verfasst: 12.04.2006 20:49
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.

Verfasst: 12.04.2006 21:21
von ts-soft
Warum das ganze Binär auslesen :freak:
Vielleicht soll ja keine API verwendet werden?

Verfasst: 13.04.2006 20:43
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 !!!

Verfasst: 13.04.2006 21:25
von ts-soft
http://msdn.microsoft.com/library/defau ... etypes.asp
sollte Dir den Einstieg erleichtern.

Verfasst: 14.04.2006 12:39
von Leonhard
Danke, werds kleich mal versuchen, ein kleines Prog zu schreien :->

Verfasst: 14.04.2006 12:45
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?