support for LC_DYLD_INFO_ONLY strip
This commit is contained in:
parent
e3a1dcf76a
commit
3a30f12019
@ -98,19 +98,6 @@ func (mc *MachoContext) CollectBindSymbolsModern() []*ImportSymbol {
|
|||||||
|
|
||||||
// Old convention using LC_DYLD_INFO_ONLY section and bytecode runner
|
// Old convention using LC_DYLD_INFO_ONLY section and bytecode runner
|
||||||
func (mc *MachoContext) CollectBindSymbolsLegacy() []*ImportSymbol {
|
func (mc *MachoContext) CollectBindSymbolsLegacy() []*ImportSymbol {
|
||||||
// // clear this whole section to 0x00 BIND_OPCODE_DONE
|
|
||||||
// dummy := []byte{
|
|
||||||
// 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69,
|
|
||||||
// 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69,
|
|
||||||
// }
|
|
||||||
// // make LINK EDIT section writable
|
|
||||||
// // mc.file.WriteAt([]byte{0x03}, int64(0x3f8))
|
|
||||||
// // set number of symbols to 0
|
|
||||||
// mc.file.WriteAt([]byte{0, 0, 0, 0}, int64(0x444))
|
|
||||||
// mc.file.WriteAt([]byte{0, 0, 0, 0}, int64(0x44c))
|
|
||||||
// mc.file.WriteAt([]byte{0, 0, 0, 0}, int64(0x48c))
|
|
||||||
// mc.file.WriteAt(dummy, int64(start))
|
|
||||||
|
|
||||||
noLazy := (func() []*ImportSymbol {
|
noLazy := (func() []*ImportSymbol {
|
||||||
start := mc.dyldinfo.bind_off
|
start := mc.dyldinfo.bind_off
|
||||||
size := mc.dyldinfo.bind_size
|
size := mc.dyldinfo.bind_size
|
||||||
@ -187,6 +174,7 @@ func (mc *MachoContext) readBindStream(buf *bytes.Buffer, typ string) []*ImportS
|
|||||||
"symbol": sym.name,
|
"symbol": sym.name,
|
||||||
}).Trace("Bind")
|
}).Trace("Bind")
|
||||||
sym.name = ""
|
sym.name = ""
|
||||||
|
sym.address += 8
|
||||||
}
|
}
|
||||||
offset += 1
|
offset += 1
|
||||||
break
|
break
|
||||||
@ -241,7 +229,12 @@ func (mc *MachoContext) readBindStream(buf *bytes.Buffer, typ string) []*ImportS
|
|||||||
offset += br
|
offset += br
|
||||||
break
|
break
|
||||||
|
|
||||||
|
case BIND_OPCODE_SET_TYPE_IMM:
|
||||||
|
fmt.Println("// symbol type", imm)
|
||||||
|
break
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
fmt.Println("BIND OPCODE NOT SUPPORTED", op, imm)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -280,7 +280,31 @@ func (mc *MachoContext) RemoveBindSymbols() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mc *MachoContext) removeBindSymbolsModern() {}
|
func (mc *MachoContext) removeBindSymbolsModern() {
|
||||||
|
calculateHash := func(name string) uint32 {
|
||||||
|
var h uint32 = 0x811c9dc5
|
||||||
|
for _, s := range name {
|
||||||
|
h ^= uint32(s)
|
||||||
|
h *= 0x01000193
|
||||||
|
}
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
|
// due to some limitations when design this tool
|
||||||
|
// we write the c code to stdout lol
|
||||||
|
fmt.Println("struct imported_symbol {const char* name; const char* lib; uint32_t hash; uint64_t address;};")
|
||||||
|
fmt.Println("struct imported_symbol imported_table[] = {")
|
||||||
|
count := 0
|
||||||
|
for _, symbol := range mc.CollectBindSymbols() {
|
||||||
|
count += 1
|
||||||
|
dylib_hash := calculateHash(symbol.Dylib())
|
||||||
|
fmt.Printf("{\"%s\", \"%s\", 0x%x, 0x%x},\n",
|
||||||
|
symbol.Name(), symbol.Dylib(), dylib_hash, symbol.Address());
|
||||||
|
mc.file.WriteAt(make([]byte, 8), int64(symbol.file_address))
|
||||||
|
}
|
||||||
|
fmt.Println("};")
|
||||||
|
fmt.Printf("uint32_t nimports = %d;\n", count);
|
||||||
|
}
|
||||||
|
|
||||||
func (mc *MachoContext) removeBindSymbolsLegacy() {
|
func (mc *MachoContext) removeBindSymbolsLegacy() {
|
||||||
start := mc.dyldinfo.lazy_bind_off
|
start := mc.dyldinfo.lazy_bind_off
|
||||||
@ -300,7 +324,7 @@ func (mc *MachoContext) removeBindSymbolsLegacy() {
|
|||||||
|
|
||||||
// due to some limitations when design this tool
|
// due to some limitations when design this tool
|
||||||
// we write the c code to stdout lol
|
// we write the c code to stdout lol
|
||||||
fmt.Println("struct imported_symbol {const char* name; const char* lib; uint32_t hash; uint64_t address;};")
|
fmt.Println("struct imported_symbol {const char* name; const char* lib; uint32_t hash; int segment_i; uint64_t offset;};")
|
||||||
fmt.Println("struct imported_symbol imported_table[] = {")
|
fmt.Println("struct imported_symbol imported_table[] = {")
|
||||||
count := 0
|
count := 0
|
||||||
for _, symbol := range mc.CollectBindSymbols() {
|
for _, symbol := range mc.CollectBindSymbols() {
|
||||||
@ -309,8 +333,12 @@ func (mc *MachoContext) removeBindSymbolsLegacy() {
|
|||||||
}
|
}
|
||||||
count += 1
|
count += 1
|
||||||
dylib_hash := calculateHash(symbol.Dylib())
|
dylib_hash := calculateHash(symbol.Dylib())
|
||||||
fmt.Printf("{\"%s\", \"%s\", 0x%x, 0x%x},\n",
|
seg := mc.segments[symbol.segment]
|
||||||
symbol.Name(), symbol.Dylib(), dylib_hash, symbol.Address());
|
offset := symbol.address - seg.Vmaddr()
|
||||||
|
|
||||||
|
fmt.Printf("{\"%s\", \"%s\", 0x%x, 0x%x, 0x%x},\n",
|
||||||
|
symbol.Name(), symbol.Dylib(), dylib_hash, symbol.segment, offset);
|
||||||
|
mc.file.WriteAt(make([]byte, 8), int64(seg.Fileoff() + offset))
|
||||||
}
|
}
|
||||||
fmt.Println("};")
|
fmt.Println("};")
|
||||||
fmt.Printf("uint32_t nimports = %d;\n", count);
|
fmt.Printf("uint32_t nimports = %d;\n", count);
|
||||||
|
Loading…
Reference in New Issue
Block a user