mirror of
https://github.com/TangentFoxy/love-pe.git
synced 2025-07-28 02:02:16 +00:00
Correct all the Endianness
This commit is contained in:
116
love-pe.lua
116
love-pe.lua
@@ -115,10 +115,10 @@ local function encodeUTF16(str8)
|
|||||||
for pos, unicode in utf8.codes(str8) do
|
for pos, unicode in utf8.codes(str8) do
|
||||||
if unicode >= 0x10000 then --Encode as surrogate pair
|
if unicode >= 0x10000 then --Encode as surrogate pair
|
||||||
unicode = unicode - 0x01000
|
unicode = unicode - 0x01000
|
||||||
nstr[#nstr+1] = encodeNumber(rshift(unicode,10)+0xD800,2)
|
nstr[#nstr+1] = encodeNumber(rshift(unicode,10)+0xD800,2,false)
|
||||||
nstr[#nstr+1] = encodeNumber(band(unicode,0x3FF)+0xDC00,2)
|
nstr[#nstr+1] = encodeNumber(band(unicode,0x3FF)+0xDC00,2,false)
|
||||||
else
|
else
|
||||||
nstr[#nstr+1] = encodeNumber(unicode,2)
|
nstr[#nstr+1] = encodeNumber(unicode,2,false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -137,17 +137,17 @@ end
|
|||||||
local function readResourceDirectoryTable(exeFile,Sections,RootOffset,Level)
|
local function readResourceDirectoryTable(exeFile,Sections,RootOffset,Level)
|
||||||
local Tree = {}
|
local Tree = {}
|
||||||
|
|
||||||
local Characteristics = decodeNumber(exeFile:read(4))
|
local Characteristics = decodeNumber(exeFile:read(4),true)
|
||||||
local TimeDateStamp = decodeNumber(exeFile:read(4))
|
local TimeDateStamp = decodeNumber(exeFile:read(4),true)
|
||||||
local MajorVersion = decodeNumber(exeFile:read(2))
|
local MajorVersion = decodeNumber(exeFile:read(2),true)
|
||||||
local MinorVersion = decodeNumber(exeFile:read(2))
|
local MinorVersion = decodeNumber(exeFile:read(2),true)
|
||||||
local NumberOfNameEntries = decodeNumber(exeFile:read(2))
|
local NumberOfNameEntries = decodeNumber(exeFile:read(2),true)
|
||||||
local NumberOfIDEntries = decodeNumber(exeFile:read(2))
|
local NumberOfIDEntries = decodeNumber(exeFile:read(2),true)
|
||||||
|
|
||||||
--Parse Entries
|
--Parse Entries
|
||||||
for i=1,NumberOfNameEntries+NumberOfIDEntries do
|
for i=1,NumberOfNameEntries+NumberOfIDEntries do
|
||||||
local Name = decodeNumber(exeFile:read(4))
|
local Name = decodeNumber(exeFile:read(4),true)
|
||||||
local Offset = decodeNumber(exeFile:read(4))
|
local Offset = decodeNumber(exeFile:read(4),true)
|
||||||
|
|
||||||
local ReturnOffset = exeFile:tell()
|
local ReturnOffset = exeFile:tell()
|
||||||
|
|
||||||
@@ -158,7 +158,7 @@ local function readResourceDirectoryTable(exeFile,Sections,RootOffset,Level)
|
|||||||
|
|
||||||
exeFile:seek(NameOffset)
|
exeFile:seek(NameOffset)
|
||||||
|
|
||||||
local NameLength = decodeNumber(exeFile:read(2))
|
local NameLength = decodeNumber(exeFile:read(2),true)
|
||||||
--Decode UTF-16LE string
|
--Decode UTF-16LE string
|
||||||
Name = decodeUTF16(exeFile:read(NameLength*2))
|
Name = decodeUTF16(exeFile:read(NameLength*2))
|
||||||
else
|
else
|
||||||
@@ -181,9 +181,9 @@ local function readResourceDirectoryTable(exeFile,Sections,RootOffset,Level)
|
|||||||
--Data offset
|
--Data offset
|
||||||
exeFile:seek(RootOffset + band(Offset,0x7FFFFFFF))
|
exeFile:seek(RootOffset + band(Offset,0x7FFFFFFF))
|
||||||
|
|
||||||
local DataRVA = decodeNumber(exeFile:read(4))
|
local DataRVA = decodeNumber(exeFile:read(4),true)
|
||||||
local DataSize = decodeNumber(exeFile:read(4))
|
local DataSize = decodeNumber(exeFile:read(4),true)
|
||||||
local DataCodepage = decodeNumber(exeFile:read(4))
|
local DataCodepage = decodeNumber(exeFile:read(4),true)
|
||||||
|
|
||||||
local DataOffset = convertRVA2Offset(DataRVA,Sections)
|
local DataOffset = convertRVA2Offset(DataRVA,Sections)
|
||||||
|
|
||||||
@@ -221,12 +221,12 @@ local function buildResourcesDirectoryTable(ResourcesTree,VirtualAddress)
|
|||||||
end
|
end
|
||||||
|
|
||||||
--Write the resource directory table
|
--Write the resource directory table
|
||||||
Data[#Data+1] = encodeNumber(0,4,true) Offset = Offset + 4 --Characteristics
|
Data[#Data+1] = encodeNumber(0,4,false) Offset = Offset + 4 --Characteristics
|
||||||
Data[#Data+1] = encodeNumber(os.time(),4,true) Offset = Offset + 4 --Time/Date Stamp
|
Data[#Data+1] = encodeNumber(os.time(),4,false) Offset = Offset + 4 --Time/Date Stamp
|
||||||
Data[#Data+1] = encodeNumber(1,2,true) Offset = Offset + 2 --Major Version
|
Data[#Data+1] = encodeNumber(1,2,false) Offset = Offset + 2 --Major Version
|
||||||
Data[#Data+1] = encodeNumber(0,2,true) Offset = Offset + 2 --Minor Version
|
Data[#Data+1] = encodeNumber(0,2,false) Offset = Offset + 2 --Minor Version
|
||||||
Data[#Data+1] = encodeNumber(#NameEntries,2,true) Offset = Offset + 2 --Number of name entries
|
Data[#Data+1] = encodeNumber(#NameEntries,2,false) Offset = Offset + 2 --Number of name entries
|
||||||
Data[#Data+1] = encodeNumber(#IDEntries,2,true) Offset = Offset + 2 --Number of ID entries
|
Data[#Data+1] = encodeNumber(#IDEntries,2,false) Offset = Offset + 2 --Number of ID entries
|
||||||
|
|
||||||
local EntriesID = #Data --Where the entries data start
|
local EntriesID = #Data --Where the entries data start
|
||||||
|
|
||||||
@@ -242,7 +242,7 @@ local function buildResourcesDirectoryTable(ResourcesTree,VirtualAddress)
|
|||||||
local StringRVA = VirtualAddress+Offset
|
local StringRVA = VirtualAddress+Offset
|
||||||
local String = encodeUTF16(Entry[1])
|
local String = encodeUTF16(Entry[1])
|
||||||
|
|
||||||
Data[#Data+1] = encodeNumber(#String/2,2,true) Offset = Offset + 2 --String Length
|
Data[#Data+1] = encodeNumber(#String/2,2,false) Offset = Offset + 2 --String Length
|
||||||
Data[#Data+1] = String; Offset = Offset + #String --Unicode String
|
Data[#Data+1] = String; Offset = Offset + #String --Unicode String
|
||||||
|
|
||||||
Entry[3] = StringRVA + 0x80000000 --A string name
|
Entry[3] = StringRVA + 0x80000000 --A string name
|
||||||
@@ -252,10 +252,10 @@ local function buildResourcesDirectoryTable(ResourcesTree,VirtualAddress)
|
|||||||
Entry[4] = Entry[4] + 0x80000000 --Set sub-directory flag
|
Entry[4] = Entry[4] + 0x80000000 --Set sub-directory flag
|
||||||
writeDirectory(Entry[2])
|
writeDirectory(Entry[2])
|
||||||
else --Data
|
else --Data
|
||||||
Data[#Data+1] = encodeNumber(VirtualAddress+Offset+16,4,true) Offset = Offset + 4 --Predict the DataRVA
|
Data[#Data+1] = encodeNumber(VirtualAddress+Offset+16,4,false) Offset = Offset + 4 --Predict the DataRVA
|
||||||
Data[#Data+1] = encodeNumber(#Entry[2],4,true) Offset = Offset + 4 --Size
|
Data[#Data+1] = encodeNumber(#Entry[2],4,false) Offset = Offset + 4 --Size
|
||||||
Data[#Data+1] = encodeNumber(0,4,true) Offset = Offset + 4 --Codepoint
|
Data[#Data+1] = encodeNumber(0,4,false) Offset = Offset + 4 --Codepoint
|
||||||
Data[#Data+1] = encodeNumber(0,4,true) Offset = Offset + 4 --Reserved
|
Data[#Data+1] = encodeNumber(0,4,false) Offset = Offset + 4 --Reserved
|
||||||
Data[#Data+1] = Entry[2]; Offset = Offset + #Entry[2] --The actual data
|
Data[#Data+1] = Entry[2]; Offset = Offset + #Entry[2] --The actual data
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -268,10 +268,10 @@ local function buildResourcesDirectoryTable(ResourcesTree,VirtualAddress)
|
|||||||
Entry[4] = Entry[4] + 0x80000000 --Set sub-directory flag
|
Entry[4] = Entry[4] + 0x80000000 --Set sub-directory flag
|
||||||
writeDirectory(Entry[2])
|
writeDirectory(Entry[2])
|
||||||
else --Data
|
else --Data
|
||||||
Data[#Data+1] = encodeNumber(VirtualAddress+Offset+16,4,true) Offset = Offset + 4 --Predict the DataRVA
|
Data[#Data+1] = encodeNumber(VirtualAddress+Offset+16,4,false) Offset = Offset + 4 --Predict the DataRVA
|
||||||
Data[#Data+1] = encodeNumber(#Entry[2],4,true) Offset = Offset + 4 --Size
|
Data[#Data+1] = encodeNumber(#Entry[2],4,false) Offset = Offset + 4 --Size
|
||||||
Data[#Data+1] = encodeNumber(0,4,true) Offset = Offset + 4 --Codepoint
|
Data[#Data+1] = encodeNumber(0,4,false) Offset = Offset + 4 --Codepoint
|
||||||
Data[#Data+1] = encodeNumber(0,4,true) Offset = Offset + 4 --Reserved
|
Data[#Data+1] = encodeNumber(0,4,false) Offset = Offset + 4 --Reserved
|
||||||
Data[#Data+1] = Entry[2]; Offset = Offset + #Entry[2] --The actual data
|
Data[#Data+1] = Entry[2]; Offset = Offset + #Entry[2] --The actual data
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -332,7 +332,7 @@ local function extractGroupIcon(ResourcesTree,GroupID)
|
|||||||
|
|
||||||
local Length = #Icons[#Icons]
|
local Length = #Icons[#Icons]
|
||||||
|
|
||||||
IconGroup = IconGroup:sub(1,o-1) .. encodeNumber(DataOffset,4) .. IconGroup:sub(o+2,-1)
|
IconGroup = IconGroup:sub(1,o-1) .. encodeNumber(DataOffset,4,false) .. IconGroup:sub(o+2,-1)
|
||||||
|
|
||||||
o = o + 4
|
o = o + 4
|
||||||
|
|
||||||
@@ -375,7 +375,7 @@ local function addGroupIcon(ResourcesTree,GroupID,icoFile)
|
|||||||
|
|
||||||
local Count = decodeNumber(icoFile:read(2),true)
|
local Count = decodeNumber(icoFile:read(2),true)
|
||||||
|
|
||||||
IconGroup[#IconGroup+1] = encodeNumber(Count,2)
|
IconGroup[#IconGroup+1] = encodeNumber(Count,2,false)
|
||||||
|
|
||||||
for i=1,Count do
|
for i=1,Count do
|
||||||
IconGroup[#IconGroup+1] = icoFile:read(8)
|
IconGroup[#IconGroup+1] = icoFile:read(8)
|
||||||
@@ -383,14 +383,14 @@ local function addGroupIcon(ResourcesTree,GroupID,icoFile)
|
|||||||
local IcoSize = decodeNumber(icoFile:read(4),true)
|
local IcoSize = decodeNumber(icoFile:read(4),true)
|
||||||
local IcoOffset = decodeNumber(icoFile:read(4),true)
|
local IcoOffset = decodeNumber(icoFile:read(4),true)
|
||||||
|
|
||||||
IconGroup[#IconGroup+1] = encodeNumber(IcoSize,4)
|
IconGroup[#IconGroup+1] = encodeNumber(IcoSize,4,false)
|
||||||
|
|
||||||
--Find an empty slot for the icon data
|
--Find an empty slot for the icon data
|
||||||
while ResourcesTree["ICON"][NextIconID] do
|
while ResourcesTree["ICON"][NextIconID] do
|
||||||
NextIconID = NextIconID + 1
|
NextIconID = NextIconID + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
IconGroup[#IconGroup+1] = encodeNumber(NextIconID,2)
|
IconGroup[#IconGroup+1] = encodeNumber(NextIconID,2,false)
|
||||||
|
|
||||||
local ReturnOffset = icoFile:tell()
|
local ReturnOffset = icoFile:tell()
|
||||||
|
|
||||||
@@ -430,7 +430,7 @@ local function parseCOFFHeader(exeFile)
|
|||||||
|
|
||||||
exeFile:read(2) --Skip Machine.
|
exeFile:read(2) --Skip Machine.
|
||||||
|
|
||||||
values.NumberOfSections = decodeNumber(exeFile:read(2))
|
values.NumberOfSections = decodeNumber(exeFile:read(2),true)
|
||||||
|
|
||||||
exeFile:read(16) --Skip 3 long values (12 bytes) and 2 short values (4 bytes).
|
exeFile:read(16) --Skip 3 long values (12 bytes) and 2 short values (4 bytes).
|
||||||
|
|
||||||
@@ -440,7 +440,7 @@ end
|
|||||||
local function parsePEOptHeader(exeFile)
|
local function parsePEOptHeader(exeFile)
|
||||||
local values = {}
|
local values = {}
|
||||||
|
|
||||||
local PEOptionalHeaderSignature = decodeNumber(exeFile:read(2))
|
local PEOptionalHeaderSignature = decodeNumber(exeFile:read(2),true)
|
||||||
|
|
||||||
values.x86, values.x64 = false, false --Executable arch
|
values.x86, values.x64 = false, false --Executable arch
|
||||||
|
|
||||||
@@ -454,7 +454,7 @@ local function parsePEOptHeader(exeFile)
|
|||||||
|
|
||||||
exeFile:read(values.x64 and 106 or 90) --Skip 106 bytes for x64, and 90 bytes for x86
|
exeFile:read(values.x64 and 106 or 90) --Skip 106 bytes for x64, and 90 bytes for x86
|
||||||
|
|
||||||
values.NumberOfRvaAndSizes = decodeNumber(exeFile:read(4))
|
values.NumberOfRvaAndSizes = decodeNumber(exeFile:read(4),true)
|
||||||
|
|
||||||
return values
|
return values
|
||||||
end
|
end
|
||||||
@@ -463,7 +463,7 @@ local function parseDataTables(exeFile,NumberOfRvaAndSizes)
|
|||||||
local DataDirectories = {}
|
local DataDirectories = {}
|
||||||
|
|
||||||
for i=1, NumberOfRvaAndSizes do
|
for i=1, NumberOfRvaAndSizes do
|
||||||
DataDirectories[i] = {decodeNumber(exeFile:read(4)), decodeNumber(exeFile:read(4))}
|
DataDirectories[i] = {decodeNumber(exeFile:read(4),true), decodeNumber(exeFile:read(4),true)}
|
||||||
print("DataDirectory #"..i,DataDirectories[i][1],DataDirectories[i][2])
|
print("DataDirectory #"..i,DataDirectories[i][1],DataDirectories[i][2])
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -472,8 +472,8 @@ end
|
|||||||
|
|
||||||
local function writeDataDirectories(exeFile, DataDirectories)
|
local function writeDataDirectories(exeFile, DataDirectories)
|
||||||
for i, Directory in ipairs(DataDirectories) do
|
for i, Directory in ipairs(DataDirectories) do
|
||||||
exeFile:write(encodeNumber(Directory[1],4,true))
|
exeFile:write(encodeNumber(Directory[1],4,false))
|
||||||
exeFile:write(encodeNumber(Directory[2],4,true))
|
exeFile:write(encodeNumber(Directory[2],4,false))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -493,15 +493,15 @@ local function parseSectionsTable(exeFile,NumberOfSections)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Section.VirtualSize = decodeNumber(exeFile:read(4))
|
Section.VirtualSize = decodeNumber(exeFile:read(4),true)
|
||||||
Section.VirtualAddress = decodeNumber(exeFile:read(4))
|
Section.VirtualAddress = decodeNumber(exeFile:read(4),true)
|
||||||
Section.SizeOfRawData = decodeNumber(exeFile:read(4))
|
Section.SizeOfRawData = decodeNumber(exeFile:read(4),true)
|
||||||
Section.PointerToRawData = decodeNumber(exeFile:read(4))
|
Section.PointerToRawData = decodeNumber(exeFile:read(4),true)
|
||||||
Section.PointerToRelocations = decodeNumber(exeFile:read(4))
|
Section.PointerToRelocations = decodeNumber(exeFile:read(4),true)
|
||||||
Section.PointerToLinenumbers = decodeNumber(exeFile:read(4))
|
Section.PointerToLinenumbers = decodeNumber(exeFile:read(4),true)
|
||||||
Section.NumberOfRelocations = decodeNumber(exeFile:read(2))
|
Section.NumberOfRelocations = decodeNumber(exeFile:read(2),true)
|
||||||
Section.NumberOfLinenumbers = decodeNumber(exeFile:read(2))
|
Section.NumberOfLinenumbers = decodeNumber(exeFile:read(2),true)
|
||||||
Section.Characteristics = decodeNumber(exeFile:read(4))
|
Section.Characteristics = decodeNumber(exeFile:read(4),true)
|
||||||
|
|
||||||
for k,v in pairs(Section) do
|
for k,v in pairs(Section) do
|
||||||
print(k,v)
|
print(k,v)
|
||||||
@@ -516,15 +516,15 @@ end
|
|||||||
local function writeSectionsTable(exeFile,Sections)
|
local function writeSectionsTable(exeFile,Sections)
|
||||||
for id, Section in ipairs(Sections) do
|
for id, Section in ipairs(Sections) do
|
||||||
exeFile:write(Section.Name.."\0")
|
exeFile:write(Section.Name.."\0")
|
||||||
exeFile:write(Section.VirtualSize,4,true)
|
exeFile:write(encodeNumber(Section.VirtualSize,4,true))
|
||||||
exeFile:write(Section.VirtualAddress,4,true)
|
exeFile:write(encodeNumber(Section.VirtualAddress,4,true))
|
||||||
exeFile:write(Section.SizeOfRawData,4,true)
|
exeFile:write(encodeNumber(Section.SizeOfRawData,4,true))
|
||||||
exeFile:write(Section.PointerToRawData,4,true)
|
exeFile:write(encodeNumber(Section.PointerToRawData,4,true))
|
||||||
exeFile:write(Section.PointerToRelocations,4,true)
|
exeFile:write(encodeNumber(Section.PointerToRelocations,4,true))
|
||||||
exeFile:write(Section.PointerToLinenumbers,4,true)
|
exeFile:write(encodeNumber(Section.PointerToLinenumbers,4,true))
|
||||||
exeFile:write(Section.NumberOfRelocations,2,true)
|
exeFile:write(encodeNumber(Section.NumberOfRelocations,2,true))
|
||||||
exeFile:write(Section.NumberOfLinenumbers,2,true)
|
exeFile:write(encodeNumber(Section.NumberOfLinenumbers,2,true))
|
||||||
exeFile:write(Section.Characteristics,4,true)
|
exeFile:write(encodeNumber(Section.Characteristics,4,true))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user