Seite 1 von 2

Exe Versions Infos ändern.

Verfasst: 08.09.2008 16:23
von cxAlex
Hallo.

Ich bin auf der suche nach einer Möglichkeit die Versions-Infos einer fertigen Exe zu ändern (Dateiversion,Firma,Autor,Interner Name....).
Das ganze ist für meinen PX Interpreter, damit der User die Möglichkeit hat Versioninfo und Icon zu ändern. Den Icon kann ich schon mit UpdateResource_() ändern, aber bei der Version weis ich nicht weiter. Auch den Typ der Ressource finde Ich nicht herraus, bei Icon ist es
#RT_ICON aber ich finde keine Konstante #RT_Version o.ä. Vielleich weis einer weiter, die Ressource sieht Raw so aus:
Resshacker hat geschrieben:PRODUCTVERSION 1,0,0,0
FILEOS 0x40004
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
BLOCK "000004b0"
{
VALUE "CompanyName", "Alexander Aigner"
VALUE "ProductName", "PaladiumX Interpreter"
VALUE "ProductVersion", "1.0.0.0 [b926c2442_w32x86]"
VALUE "FileVersion", "1.0.0.0"
VALUE "FileDescription", "PaladiumX Interpreter"
VALUE "InternalName", "paladiumcore.exe"
VALUE "OriginalFilename", "paladiumcore.exe"
}
}

BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0000 0x04B0
}
}

Verfasst: 08.09.2008 16:55
von Thorium
Das ist nicht Raw, das ist ein Script, welches in Bytecode kompiliert werden muss. Da du ja sowieso den Ressource Hacker nutzt, schau mal in die Hilfe da ist ein Eintrag "Show me the source" oder so ähnlich. Da gibts zwar nicht den Source aber einen ausführlichen Artikel zum PE-Fileformat.

Verfasst: 08.09.2008 17:05
von Knight_Rider_2000
Hatte das Problem frueher auch gehabt.
In meinem Beispiel musst du schon in der zu aendernen Datei vorher eine Versioninfo haben, da mein code darauf eingeht:

Code: Alles auswählen

;Dies Ist der Hauptquellcode um bestehende Versionsinfos in Executables zu aendern.
;Copyright (C) 2007 by Christian Seysen and Felix Kuberjans(C++)
;Website: http://www.desaster-games.com
#RT_VERSION = 16

Structure VS_VERSIONINFO
  wLength.w
  wValueLength.w
  wType.w
  szKey.w[16]
  Padding1.w
  Value.VS_FIXEDFILEINFO
  Padding2.w
  Children.w
EndStructure

Structure StringFileInfo
 CompanyName.s
 Productname.s
 ProductVersion.s
 FileVersion.s
 FileDescprition.s
 InternalName.s
 OriginalFilename.s
 LegalCopyright.s
 Website.s
EndStructure

Procedure.w MAKELANGID(p.w, s.w)
  ProcedureReturn (s << 10) | p
EndProcedure

Macro MAKEINTRESOURCE(I)
  (I)
EndMacro

Procedure ErrorHandler(Error.s)
 MessageRequester("ERROR",Error.s,#MB_OK | #MB_ICONEXCLAMATION)
EndProcedure

Procedure WriteStringFileInfo(pStringName.s,pValue.s,Buffer2.l,Coursor.l)
bPadding1.b
dwPadding2.l
dwStringNameLength = Len(pStringName);
dwValueLength = Len(pValue);
dwSize.w

If dwValueLength % 2 And Not dwStringNameLength % 2
 bPadding1 = #False;
Else
 bPadding1 = #True;
EndIf


dwSize=10+(dwStringNameLength + dwValueLength + bPadding1) * 2

dwPadding2 = dwSize % SizeOf(Long);

ReAllocateMemory(Buffer2,Coursor + dwSize + dwPadding2)

;1.laenge gesamt
PokeW(Buffer2+Coursor,dwSize) : Coursor=Coursor+2
;2.laenge inhaltslaenge
PokeW(Buffer2+Coursor,dwValueLength+1):Coursor=Coursor+2

;write a 1 ( 01 00)
PokeW(Buffer2+Coursor,1):a=a+2

;StringName
report1$=""
For StringName = 1 To dwStringNameLength
 PokeW(Buffer2+Coursor,Asc(Mid(pStringName,StringName,1))):Coursor=Coursor+2
 report1$=(report1$+Mid(pStringName,StringName,1)+" ")
Next
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2

If (bPadding1)
 PokeW(Buffer2+Coursor,0):Coursor=Coursor+2
EndIf

;Value
report2$=""
For ValueName = 1 To dwValueLength
 PokeW(Buffer2+Coursor,Asc(Mid(pValue,ValueName,1))):Coursor=Coursor+2
 report2$=(report2$+Mid(pValue,ValueName,1)+" ")
Next
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2

If (dwPadding2)
 ZeroMemory_(Buffer2+Coursor,dwPadding2)
 Coursor=Coursor+dwPadding2
EndIf
ProcedureReturn Coursor
EndProcedure

Procedure ChangeVersionData(pExe.s,*Information.StringFileInfo)

;Laden der Exe und kopieren der Resource in den Buffer1
hExe = LoadLibrary_(pExe); 
If hExe = #Null
    ErrorHandler("Could not load exe."); 
    Goto Except
EndIf
 
hRes = FindResource_(hExe, MAKEINTRESOURCE(1), #RT_VERSION)
If hRes = #Null 
    ErrorHandler("Could not locate dialog box."); 
    Goto Except
EndIf 


hResLoad = LoadResource_(hExe, hRes); 
lsz=SizeofResource_(hExe, hRes)
If hResLoad = #Null
    ErrorHandler("Could not load dialog box."); 
    Goto Except
EndIf
 
lpResLock = LockResource_(hResLoad); 
If lpResLock = #Null 
    ErrorHandler("Could not lock dialog box."); 
    Goto Except
EndIf

Buffer1=AllocateMemory(lsz); pointer zu den resource Daten 
MoveMemory(lpResLock, Buffer1, lsz)
;Erstelle Buffer2 fuer unsere neue Resource
Buffer2=AllocateMemory(152)

;#####Create VERSIONINFO#####
;public class Versionsinfo{
;#define SizeOfResource
PokeW(Buffer2,MemorySize(Buffer2))
;kopiere vorhandenes Matterial
For Coursor=2 To 90 Step 2
 PokeW(Buffer2+Coursor,PeekW(Buffer1+a))
Next Coursor

;einige Mathematische Vorkehrungen
;Laenge-160
PokeW(Buffer2+Coursor,(MemorySize(Buffer2)-160)) : Coursor=Coursor+2
;Kopiere
CopyMemory(Buffer1+Coursor,Buffer2+Coursor,34) : Coursor=Coursor+34
;Laenge-196
PokeW(Buffer2+Coursor,(MemorySize(Buffer2)-196)) : Coursor=Coursor+2
;Kopiere
CopyMemory(Buffer1+Coursor,Buffer2+Coursor,20) : Coursor=Coursor+20
;Null
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2

;Schreibe die Informationen in die exe
Coursor=WriteStringFileInfo("CompanyName",NewFileversion\CompanyName.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("FileDescription",NewFileversion\FileDescription.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("FileVersion",NewFileversion\FileVersion.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("InternalName",NewFileversion\InternalName.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("LegalCopyright",NewFileversion\LegalCopyright.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("OriginalFilename",NewFileversion\OriginalFilename.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("ProductName",NewFileversion\ProductName.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("ProductVersion",NewFileversion\ProductVersion.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("Website",NewFileversion\Website.s,Buffer2,Coursor)
;



ReAllocateMemory(Buffer2,Coursor+68)

CopyMemory(Buffer1+lsz-68,Buffer2+Coursor,68):Coursor=Coursor+68

;Laenge korrigieren
PokeW(Buffer2,MemorySize(Buffer2))
PokeW(Buffer2+92,(MemorySize(Buffer2)-160))
PokeW(Buffer2+128,(MemorySize(Buffer2)-196))
;#####Finished neue Resource#####

FreeResource_(hResLoad)
GetModuleFileName_(hExe,pExe,#MAX_PATH)
FreeLibrary_(hExe)

;Beginne mit dem schreiben der Versionsinfos
hUpdateRes = BeginUpdateResource_(pExe, #False); 
If hUpdateRes = #Null
    ErrorHandler("Could not open file for writing."); 
    Goto Except
EndIf

If Not UpdateResource_(hUpdateRes, #RT_VERSION, MAKEINTRESOURCE(#VS_VERSION_INFO), MAKELANGID(#LANG_ENGLISH, #SUBLANG_ENGLISH_US), Buffer2, MemorySize(Buffer2))
    ErrorHandler("Could not add resource."); 
    Goto Except
EndIf


If Not EndUpdateResource_(hUpdateRes, #False)
    ErrorHandler("Could not write changes to file."); 
    Goto Except
EndIf

;Wenn alles geklappt hat bekommen wir die Groesse in Bytes zurueck
ProcedureReturn Coursor

;Andernfalls -1
Except:
ProcedureReturn -1

EndProcedure

;Und nun testen wir es:

NewFileversion.StringFileInfo
NewFileversion\CompanyName.s="Test Company"
NewFileversion\Productname.s="Test Productname"
NewFileversion\ProductVersion.s=Test ProductVersion"
NewFileversion\FileVersion.s="Test FileVersion"
NewFileversion\FileDescprition.s="Test FileDescription"
NewFileversion\InternalName.s="Test Internal Name"
NewFileversion\OriginalFilename.s="Test OriginalFilename"
NewFileversion\LegalCopyright.s="Test LegalCopyright"
NewFileversion\Website.s="Test Website"

If ChangeVersionData("C:\Test.exe",NewFileversion)
 MessageRequester("Info","Suchsess")
Else
 MessageRequester("Info","Failed")
EndIf
Nicht zu Hart sein mit eurer Kritik :)

Verfasst: 08.09.2008 17:24
von cxAlex
genau sowas hab ich gesucht....

Big THX :D

Verfasst: 08.09.2008 19:44
von Knight_Rider_2000
wenn du meinen code benutzt waere ich sehr dankbar wenn du die Copyrights uebernimmst

Verfasst: 09.09.2008 11:33
von Rings
wenn er denn überhaupt zu kompilieren wäre...

Verfasst: 09.09.2008 11:36
von cxAlex
Es funzt nicht. Wenn man es auf eine Exe anwendet (die schon eine Versions Info hat) ist diese nacher hin. Sie ist auch nicht mit UPX o.ä. komprimiert, ich weis nicht weiter.

Verfasst: 09.09.2008 16:33
von Knight_Rider_2000
hmm
der code wurde mit 4.0 oder so geschrieben
weiss nicht woran der fehler liegt
vermutlich wieder die windows resource fehler

Verfasst: 09.09.2008 21:47
von Knight_Rider_2000
Code ueberarbeitet
waren ein paar laufzeitfehler drinne:

Code: Alles auswählen

;Dies Ist der Hauptquellcode um bestehende Versionsinfos in Executables zu aendern.
;Copyright (C) 2007 by Christian Seysen and Felix Kuberjans(C++)
;Website: http://www.desaster-games.com
#RT_VERSION = 16

Structure VS_VERSIONINFO
  wLength.w
  wValueLength.w
  wType.w
  szKey.w[16]
  Padding1.w
  Value.VS_FIXEDFILEINFO
  Padding2.w
  Children.w
EndStructure

Structure StringFileInfo
 CompanyName.s
 Productname.s
 ProductVersion.s
 FileVersion.s
 FileDescription.s
 InternalName.s
 OriginalFilename.s
 LegalCopyright.s
 Website.s
EndStructure

Procedure.w MAKELANGID(p.w, s.w)
  ProcedureReturn (s << 10) | p
EndProcedure

Macro MAKEINTRESOURCE(I)
  (I)
EndMacro

Procedure ErrorHandler(Error.s)
 MessageRequester("ERROR",Error.s,#MB_OK | #MB_ICONEXCLAMATION)
EndProcedure

Procedure WriteStringFileInfo(pStringName.s,pValue.s,Buffer2.l,Coursor.l)
bPadding1.b
dwPadding2.l
dwStringNameLength = Len(pStringName);
dwValueLength = Len(pValue);
dwSize.w

If dwValueLength % 2 And Not dwStringNameLength % 2
 bPadding1 = #False;
Else
 bPadding1 = #True;
EndIf


dwSize=10+(dwStringNameLength + dwValueLength + bPadding1) * 2

dwPadding2 = dwSize % SizeOf(Long);

ReAllocateMemory(Buffer2,Coursor + dwSize + dwPadding2)

;1.laenge gesamt
PokeW(Buffer2+Coursor,dwSize) : Coursor=Coursor+2
;2.laenge inhaltslaenge
PokeW(Buffer2+Coursor,dwValueLength+1):Coursor=Coursor+2

;write a 1 ( 01 00)
PokeW(Buffer2+Coursor,1):Coursor=Coursor+2

;StringName
report1$=""
For StringName = 1 To dwStringNameLength
 PokeW(Buffer2+Coursor,Asc(Mid(pStringName,StringName,1))):Coursor=Coursor+2
 report1$=(report1$+Mid(pStringName,StringName,1)+" ")
Next
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2

If (bPadding1)
 PokeW(Buffer2+Coursor,0):Coursor=Coursor+2
EndIf

;Value
report2$=""
For ValueName = 1 To dwValueLength
 PokeW(Buffer2+Coursor,Asc(Mid(pValue,ValueName,1))):Coursor=Coursor+2
 report2$=(report2$+Mid(pValue,ValueName,1)+" ")
Next
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2

If (dwPadding2)
 ZeroMemory_(Buffer2+Coursor,dwPadding2)
 Coursor=Coursor+dwPadding2
EndIf
ProcedureReturn Coursor
EndProcedure

Procedure ChangeVersionData(pExe.s,*Information.StringFileInfo)

;Laden der Exe und kopieren der Resource in den Buffer1
hExe = LoadLibrary_(pExe); 
If hExe = #Null
    ErrorHandler("Could not load exe."); 
    Goto Except
EndIf
 
hRes = FindResource_(hExe, MAKEINTRESOURCE(#VS_VERSION_INFO), #RT_VERSION)
If hRes = #Null 
    ErrorHandler("Could not locate dialog box."); 
    Goto Except
EndIf 


hResLoad = LoadResource_(hExe, hRes); 
lsz=SizeofResource_(hExe, hRes)
If hResLoad = #Null
    ErrorHandler("Could not load dialog box."); 
    Goto Except
EndIf
 
lpResLock = LockResource_(hResLoad); 
If lpResLock = #Null 
    ErrorHandler("Could not lock dialog box."); 
    Goto Except
EndIf

Buffer1=AllocateMemory(lsz); pointer zu den resource Daten 
MoveMemory(lpResLock, Buffer1, lsz)
;Erstelle Buffer2 fuer unsere neue Resource
Buffer2=AllocateMemory(152)

;#####Create VERSIONINFO#####
;public class Versionsinfo{
;#define SizeOfResource
PokeW(Buffer2,MemorySize(Buffer2))
;kopiere vorhandenes Matterial
For Coursor=2 To 90 Step 2
 PokeW(Buffer2+Coursor,PeekW(Buffer1+Coursor))
Next Coursor
;einige Mathematische Vorkehrungen
;Laenge-160
PokeW(Buffer2+Coursor,(MemorySize(Buffer2)-160)) : Coursor=Coursor+2
;Kopiere
CopyMemory(Buffer1+Coursor,Buffer2+Coursor,34) : Coursor=Coursor+34
;Laenge-196
PokeW(Buffer2+Coursor,(MemorySize(Buffer2)-196)) : Coursor=Coursor+2
;Kopiere
CopyMemory(Buffer1+Coursor,Buffer2+Coursor,20) : Coursor=Coursor+20
;Null
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2



;Schreibe die Informationen in die exe
Coursor=WriteStringFileInfo("CompanyName",*Information\CompanyName,Buffer2,Coursor)
Coursor=WriteStringFileInfo("FileDescription",*Information\FileDescription,Buffer2,Coursor)
Coursor=WriteStringFileInfo("FileVersion",*Information\FileVersion,Buffer2,Coursor)
Coursor=WriteStringFileInfo("ProductName",*Information\Productname,Buffer2,Coursor)
Coursor=WriteStringFileInfo("ProductVersion",*Information\ProductVersion,Buffer2,Coursor)
Coursor=WriteStringFileInfo("InternalName",*Information\InternalName,Buffer2,Coursor)
Coursor=WriteStringFileInfo("LegalCopyright",*Information\LegalCopyright,Buffer2,Coursor)
Coursor=WriteStringFileInfo("OriginalFilename",*Information\OriginalFilename,Buffer2,Coursor)
;


CopyMemory(Buffer1+lsz-68,Buffer2+Coursor,68):Coursor=Coursor+68

ReAllocateMemory(Buffer2,Coursor)

;Laenge korrigieren
PokeW(Buffer2,MemorySize(Buffer2))
PokeW(Buffer2+92,(MemorySize(Buffer2)-160))
PokeW(Buffer2+128,(MemorySize(Buffer2)-196))
;#####Finished neue Resource#####

FreeResource_(hResLoad)
GetModuleFileName_(hExe,pExe,#MAX_PATH)
FreeLibrary_(hExe)

;Beginne mit dem schreiben der Versionsinfos
hUpdateRes = BeginUpdateResource_(pExe, #False); 
If hUpdateRes = #Null
    ErrorHandler("Could not open file for writing."); 
    Goto Except
EndIf

If Not UpdateResource_(hUpdateRes, #RT_VERSION, MAKEINTRESOURCE(#VS_VERSION_INFO), MAKELANGID(#LANG_ENGLISH, #SUBLANG_ENGLISH_US), Buffer2, MemorySize(Buffer2))
    ErrorHandler("Could not add resource."); 
    Goto Except
EndIf


If Not  EndUpdateResource_(hUpdateRes, #False)
    ErrorHandler("Could not write changes to file."); 
    Goto Except
EndIf

;Wenn alles geklappt hat bekommen wir die Groesse in Bytes zurueck
ProcedureReturn Coursor

;Andernfalls -1
Except:
ProcedureReturn -1

EndProcedure

;Und nun testen wir es:

NewFileversion.StringFileInfo
NewFileversion\CompanyName="Test Company"
NewFileversion\Productname="Test Productname"
NewFileversion\ProductVersion="Test ProductVersion"
NewFileversion\FileVersion="Test FileVersion"
NewFileversion\FileDescription="Test FileDescription"
NewFileversion\InternalName="Test Internal Name"
NewFileversion\OriginalFilename="Test OriginalFilename"
NewFileversion\LegalCopyright="Test LegalCopyright"
NewFileversion\Website="Test Website"

change=ChangeVersionData("C:\Test.exe",NewFileversion)
If change
 MessageRequester("Info","Suchsess")
Else
 MessageRequester("Info","Failed")
EndIf

Verfasst: 09.09.2008 22:43
von cxAlex
Zerstört die Exe dateien immer noch.