初始化仓库
This commit is contained in:
commit
1d997ecd1c
|
@ -0,0 +1,8 @@
|
||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="Go" enabled="true" />
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/PePase.iml" filepath="$PROJECT_DIR$/.idea/PePase.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -0,0 +1,199 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type IMAGE_DOS_HEADER struct {
|
||||||
|
Emagic uint16
|
||||||
|
Ecblp uint16
|
||||||
|
Ecp uint16
|
||||||
|
Ecrlc uint16
|
||||||
|
Ecparhdr uint16
|
||||||
|
Eminalloc uint16
|
||||||
|
Emaxalloc uint16
|
||||||
|
Ess uint16
|
||||||
|
Esp uint16
|
||||||
|
Ecsum uint16
|
||||||
|
Eip uint16
|
||||||
|
Ecs uint16
|
||||||
|
Elfarlc uint16
|
||||||
|
Eovno uint16
|
||||||
|
Eres uint64
|
||||||
|
Eoemid uint16
|
||||||
|
Eoeminfo uint16
|
||||||
|
Eres2 [20]byte
|
||||||
|
Elfanew uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type IMAGE_NT_HEADERS32 struct {
|
||||||
|
Signature uint32
|
||||||
|
FileHeader IMAGE_FILE_HEADER
|
||||||
|
OptionalHeader IMAGE_OPTIONAL_HEADER32
|
||||||
|
}
|
||||||
|
|
||||||
|
type IMAGE_FILE_HEADER struct {
|
||||||
|
Machine uint16
|
||||||
|
NumberOfSections uint16
|
||||||
|
TimeDateStamp uint32
|
||||||
|
PointerToSymbolTable uint32
|
||||||
|
NumberOfSymbols uint32
|
||||||
|
SizeOfOptionalHeader uint16
|
||||||
|
Characteristics uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
type IMAGE_OPTIONAL_HEADER32 struct {
|
||||||
|
Magic uint16
|
||||||
|
MajorLinkerVersion byte
|
||||||
|
MinorLinkerVersion byte
|
||||||
|
SizeOfCode uint32
|
||||||
|
SizeOfInitializedData uint32
|
||||||
|
SizeOfUninitializedData uint32
|
||||||
|
AddressOfEntryPoint uint32
|
||||||
|
BaseOfCode uint32
|
||||||
|
BaseOfData uint32
|
||||||
|
ImageBase uint32
|
||||||
|
//ImageBase uint64
|
||||||
|
SectionAlignment uint32
|
||||||
|
FileAlignment uint32
|
||||||
|
MajorOperatingSystemVersion uint16
|
||||||
|
MinorOperatingSystemVersion uint16
|
||||||
|
MajorImageVersion uint16
|
||||||
|
MinorImageVersion uint16
|
||||||
|
MajorSubsystemVersion uint16
|
||||||
|
MinorSubsystemVersion uint16
|
||||||
|
Win32VersionValue uint32
|
||||||
|
SizeOfImage uint32
|
||||||
|
SizeOfHeaders uint32
|
||||||
|
CheckSum uint32
|
||||||
|
Subsystem uint16
|
||||||
|
DllCharacteristics uint16
|
||||||
|
SizeOfStackReserve uint32
|
||||||
|
SizeOfStackCommit uint32
|
||||||
|
SizeOfHeapReserve uint32
|
||||||
|
SizeOfHeapCommit uint32
|
||||||
|
//SizeOfStackReserve uint64
|
||||||
|
//SizeOfStackCommit uint64
|
||||||
|
//SizeOfHeapReserve uint64
|
||||||
|
//SizeOfHeapCommit uint64
|
||||||
|
LoaderFlags uint32
|
||||||
|
NumberOfRvaAndSizes uint32
|
||||||
|
DataDirectory [IMAGE_NUMBEROF_DIRECTORY_ENTRIES]IMAGE_DATA_DIRECTORY
|
||||||
|
}
|
||||||
|
|
||||||
|
type IMAGE_DATA_DIRECTORY struct {
|
||||||
|
VirtualAddress uint32
|
||||||
|
Size uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
const IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16
|
||||||
|
|
||||||
|
type IMAGE_SECTION_HEADER struct {
|
||||||
|
Name [8]byte
|
||||||
|
Misc uint32
|
||||||
|
VirtualAddress uint32
|
||||||
|
SizeOfRawData uint32
|
||||||
|
PointerToRawData uint32
|
||||||
|
PointerToRelocations uint32
|
||||||
|
PointerToLinenumbers uint32
|
||||||
|
NumberOfRelocations uint16
|
||||||
|
NumberOfLinenumbers uint16
|
||||||
|
Characteristics uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type IMAGE_RESOURCE_DIRECTORY struct {
|
||||||
|
Characteristics uint32
|
||||||
|
TimeDateStamp uint32
|
||||||
|
MajorVersion uint16
|
||||||
|
MinorVersion uint16
|
||||||
|
NumberOfNamedEntries uint16
|
||||||
|
NumberOfIdEntries uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
type IMAGE_RESOURCE_Entity struct {
|
||||||
|
Id uint32
|
||||||
|
Offset uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type Resource struct {
|
||||||
|
Directory *IMAGE_RESOURCE_DIRECTORY
|
||||||
|
Entities []RealEntity
|
||||||
|
}
|
||||||
|
|
||||||
|
type RealEntity struct {
|
||||||
|
IMAGE_RESOURCE_Entity
|
||||||
|
Childern Resource
|
||||||
|
IsFolder bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParsePe() {
|
||||||
|
data, _ := os.Open("D:\\software\\qq\\Bin\\QQ.exe")
|
||||||
|
doc := new(IMAGE_DOS_HEADER)
|
||||||
|
binary.Read(data, binary.LittleEndian, doc)
|
||||||
|
data.Seek(int64(doc.Elfanew), 0)
|
||||||
|
nt := new(IMAGE_NT_HEADERS32)
|
||||||
|
binary.Read(data, binary.LittleEndian, nt)
|
||||||
|
fmt.Printf("%v", nt.FileHeader.NumberOfSections)
|
||||||
|
//for _, directory := range nt.OptionalHeader.DataDirectory {
|
||||||
|
// fmt.Printf("\n%X,%X ", directory.VirtualAddress, directory.Size)
|
||||||
|
//}
|
||||||
|
sectionTables := make(map[string]*IMAGE_SECTION_HEADER)
|
||||||
|
for i := 0; i < int(nt.FileHeader.NumberOfSections); i++ {
|
||||||
|
head := new(IMAGE_SECTION_HEADER)
|
||||||
|
binary.Read(data, binary.LittleEndian, head)
|
||||||
|
sectionTables[strings.ReplaceAll(fmt.Sprintf("%s", head.Name), "\x00", "")] = head
|
||||||
|
fmt.Println(strings.ReplaceAll(fmt.Sprintf("%s", head.Name), "\x00", "") == ".rsrc")
|
||||||
|
}
|
||||||
|
resourceTable := sectionTables[".rsrc"]
|
||||||
|
for s, h := range sectionTables {
|
||||||
|
fmt.Printf("\n%q,%v", s, h.PointerToRawData)
|
||||||
|
}
|
||||||
|
fmt.Println(resourceTable)
|
||||||
|
|
||||||
|
resource := ParseResource(data, int64(resourceTable.PointerToRawData), 0)
|
||||||
|
|
||||||
|
fmt.Println(resource)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseResource(reader io.ReadSeeker, startOffset int64, offset int64) Resource {
|
||||||
|
reader.Seek(startOffset+offset, 0)
|
||||||
|
dir := new(IMAGE_RESOURCE_DIRECTORY)
|
||||||
|
binary.Read(reader, binary.LittleEndian, dir)
|
||||||
|
entities := make([]RealEntity, dir.NumberOfIdEntries+dir.NumberOfNamedEntries)
|
||||||
|
for i := 0; i < int(dir.NumberOfIdEntries+dir.NumberOfNamedEntries); i++ {
|
||||||
|
entity := new(IMAGE_RESOURCE_Entity)
|
||||||
|
binary.Read(reader, binary.LittleEndian, entity)
|
||||||
|
realEntity := &RealEntity{}
|
||||||
|
realEntity.IMAGE_RESOURCE_Entity = *entity
|
||||||
|
if isHighestBitSet(entity.Offset) {
|
||||||
|
realEntity.IsFolder = true
|
||||||
|
realEntity.Offset = entity.Offset & 0x7FFFFFFF
|
||||||
|
}
|
||||||
|
entities[i] = *realEntity
|
||||||
|
}
|
||||||
|
newEntities := make([]RealEntity, dir.NumberOfIdEntries+dir.NumberOfNamedEntries)
|
||||||
|
for i, entity := range entities {
|
||||||
|
if entity.IsFolder {
|
||||||
|
entity.Childern = ParseResource(reader, startOffset, int64(entity.Offset))
|
||||||
|
}
|
||||||
|
newEntities[i] = entity
|
||||||
|
|
||||||
|
}
|
||||||
|
return Resource{Directory: dir, Entities: newEntities}
|
||||||
|
}
|
||||||
|
|
||||||
|
func isHighestBitSet(value uint32) bool {
|
||||||
|
// 右移 24 位,使最高位移到最低位
|
||||||
|
highestBit := (value >> 31) & 0x01
|
||||||
|
|
||||||
|
// 判断最高位是否为 1
|
||||||
|
return highestBit == 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ParsePe()
|
||||||
|
}
|
Loading…
Reference in New Issue