1
1
mirror of https://github.com/wader/fq.git synced 2024-10-26 20:06:29 +03:00
This commit is contained in:
Mattias Wadman 2023-10-24 09:09:37 +02:00
parent 7c8fa05e30
commit 47c3d6ed1a

View File

@ -4,6 +4,7 @@ package macho
import (
"embed"
"log"
"strings"
"time"
@ -480,30 +481,38 @@ func machoDecode(d *decode.D) any {
// skip, no data from file
// TODO: more?
default:
d.RangeFn(int64(offset)*8, int64(size)*8, func(d *decode.D) {
_ = size
d.SeekAbs(int64(offset)*8, func(d *decode.D) {
switch sectName {
case "__cstring":
d.FieldArray("cstrings", func(d *decode.D) {
for !d.End() {
d.FieldUTF8Null("cstring")
}
d.FramedFn(int64(size)*8, func(d *decode.D) {
d.FieldArray("cstrings", func(d *decode.D) {
for !d.End() {
d.FieldUTF8Null("cstring")
}
})
})
case "__ustring":
d.FieldArray("ustrings", func(d *decode.D) {
for !d.End() {
// TODO: always LE?
d.FieldUTF16LENull("ustring")
}
d.FramedFn(int64(size)*8, func(d *decode.D) {
d.FieldArray("ustrings", func(d *decode.D) {
for !d.End() {
// TODO: always LE?
d.FieldUTF16LENull("ustring")
}
})
})
case "__cfstring":
d.FieldArray("cfstrings", func(d *decode.D) {
for !d.End() {
count := int(size / (uint64(archBits*4) / 8))
log.Printf("count: %#+v\n", count)
for i := 0; i < count; i++ {
d.FieldStruct("cfstring", func(d *decode.D) {
// https://github.com/llvm-mirror/clang/blob/aa231e4be75ac4759c236b755c57876f76e3cf05/lib/CodeGen/CodeGenModule.cpp#L4708
const flagUTF8 = 0x07c8
const flagUTF16 = 0x07d0
d.FieldU("isa_vmaddr", archBits)
d.FieldU("isa_vmaddr", archBits, scalar.UintHex)
flag := d.FieldU("flags", archBits, scalar.UintHex, scalar.UintMapSymStr{
flagUTF8: "utf8",
flagUTF16: "utf16",
@ -511,14 +520,28 @@ func machoDecode(d *decode.D) any {
dataPtr := int64(d.FieldU("data_ptr", archBits, scalar.UintHex))
length := int64(d.FieldU("length", archBits))
offset := ((dataPtr - vmaddr) + fileoff) * 8
offset := dataPtr - 0x10000000000000
log.Printf("dataPtr: %x\n", dataPtr)
log.Printf("vmaddr: %x\n", vmaddr)
log.Printf("fileoff: %x\n", fileoff)
log.Printf("length: %x\n", length)
log.Printf("offset: %x\n", offset)
_ = offset
_ = length
_ = flag
switch flag {
case flagUTF8:
d.RangeFn(offset, length*8, func(d *decode.D) { d.FieldUTF8("string", int(length)) })
d.RangeFn(offset*8, length*8, func(d *decode.D) { d.FieldUTF8("string", int(length)) })
case flagUTF16:
// TODO: endian?
d.RangeFn(offset, length*8*2, func(d *decode.D) { d.FieldUTF16("string", int(length*2)) })
d.RangeFn(offset*8, length*8*2, func(d *decode.D) { d.FieldUTF16("string", int(length*2)) })
}
log.Println(" done")
})
}
})