Correct all the Endianness

This commit is contained in:
RamiLego4Game
2018-05-13 14:07:35 +03:00
parent f2b67d263a
commit 1a218ff7c3

View File

@@ -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