From 04979b0afd14beb3fdba798d48ba5839ca046818 Mon Sep 17 00:00:00 2001 From: nganhkhoa Date: Mon, 26 Aug 2024 15:59:30 +0700 Subject: [PATCH] collect rebase symbols --- macho-go/pkg/ios/macho/dyld_info.go | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/macho-go/pkg/ios/macho/dyld_info.go b/macho-go/pkg/ios/macho/dyld_info.go index d5199d0..075d21b 100644 --- a/macho-go/pkg/ios/macho/dyld_info.go +++ b/macho-go/pkg/ios/macho/dyld_info.go @@ -27,6 +27,9 @@ type ImportSymbol struct { file_address uint64 lib_ordinal uint32 + target uint32 + high8 uint32 + // push number pnum uint32 stub uint64 @@ -122,8 +125,9 @@ func (mc *MachoContext) CollectBindSymbolsModern() []*ImportSymbol { if status == 3 { continue } - // fmt.Printf("segment=%x format=%x page_count=%d\n", fix.segment, fix.format, fix.page_count) - // fmt.Printf("pages=%x\n", fix.pages) + + fmt.Printf("segment=%x format=%x page_count=%d\n", fix.segment, fix.format, fix.page_count) + pages := ([]C.ushort)(unsafe.Slice(fix.pages, fix.page_count)) reader := bytes.NewReader(mc.buf) for page_i := 0; page_i < int(fix.page_count); page_i++ { @@ -132,6 +136,8 @@ func (mc *MachoContext) CollectBindSymbolsModern() []*ImportSymbol { address := int64(fix.segment) + int64(page_i) * int64(fix.page_size) + int64(pages[page_i]) reader.Seek(address, io.SeekStart) + fmt.Printf(" page %d offset=%x\n", page_i, address) + code := make([]byte, 8) for { @@ -141,6 +147,10 @@ func (mc *MachoContext) CollectBindSymbolsModern() []*ImportSymbol { var bind C.int var ret1 C.ulonglong var ret2 C.ulonglong + if (fix.format != 2 && fix.format != 6) { + fmt.Printf("format is %d\n", fix.format) + } + next := C.ParseFixValue(C.int(fix.format), C.ulonglong(v), &bind, &ret1, &ret2) @@ -164,6 +174,14 @@ func (mc *MachoContext) CollectBindSymbolsModern() []*ImportSymbol { syms = append(syms, &new_sym) } else { fmt.Printf("// 0x%x rebase=%d target=0x%x high8=0x%x\n", address, bind, ret1, ret2) + sym.typ = "rebase" + sym.target = uint32(ret1) + sym.high8 = uint32(ret2) + sym.segment = uint32(mc.findSegmentIndexAt(uint64(address))) + sym.file_address = uint64(address) + sym.next = int(next) + new_sym := sym + syms = append(syms, &new_sym) } if int(next) == 0 { @@ -176,6 +194,7 @@ func (mc *MachoContext) CollectBindSymbolsModern() []*ImportSymbol { reader.Seek(0, io.SeekStart) } } + fmt.Printf("number of imports %d\n", len(syms)) return syms }