remove all strings when remove imports
This commit is contained in:
parent
6089c18d30
commit
1b7da037bb
@ -8,6 +8,8 @@ type removeImports struct{}
|
||||
|
||||
func (action *removeImports) withMacho(mf *MachoFile) error {
|
||||
mf.Context().RemoveBindSymbols()
|
||||
mf.Context().RemoveSymbolTable()
|
||||
mf.Context().RemoveExportTrie()
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -320,6 +320,32 @@ func (mc *MachoContext) RemoveBindSymbols() {
|
||||
}
|
||||
|
||||
func (mc *MachoContext) removeBindSymbolsModern() {
|
||||
// we don't mess up the chain
|
||||
// we clear the imports table, and the raw opcodes
|
||||
// clearing imports table disables static analysis
|
||||
// clearing opcodes forces runtime manual mapping
|
||||
|
||||
// imports item are defined by mc.fixups.imports_format
|
||||
// basic case is dyld_chained_import, 4 bytes
|
||||
|
||||
start := mc.fixups.dataoff
|
||||
size := mc.fixups.datasize
|
||||
fixups := new(Fixups)
|
||||
fixups.Deserialize(mc, mc.buf[start:start+size])
|
||||
|
||||
start = mc.fixups.dataoff + fixups.imports_offset
|
||||
size = fixups.imports_count * 4
|
||||
fmt.Printf("// Erase at=0x%x size=0x%x\n", start, size)
|
||||
mc.file.WriteAt(make([]byte, size), int64(start))
|
||||
|
||||
// string reference are at the end of this section
|
||||
start = mc.fixups.dataoff + fixups.symbols_offset
|
||||
size = mc.fixups.Datasize() - fixups.symbols_offset
|
||||
fmt.Printf("// Erase at=0x%x size=0x%x\n", start, size)
|
||||
mc.file.WriteAt(make([]byte, size), int64(start))
|
||||
|
||||
fixups.imports_count = 0
|
||||
mc.file.WriteAt(fixups.Serialize(mc), int64(mc.fixups.dataoff))
|
||||
}
|
||||
|
||||
func (mc *MachoContext) removeBindSymbolsLegacy() {
|
||||
@ -329,3 +355,89 @@ func (mc *MachoContext) removeBindSymbolsLegacy() {
|
||||
// but no symbol state to bind
|
||||
mc.file.WriteAt(make([]byte, size), int64(start))
|
||||
}
|
||||
|
||||
func (mc *MachoContext) RemoveSymbolTable() {
|
||||
// try to remove symtab and dysymtab
|
||||
mc.removeSymtabCommand()
|
||||
mc.removeDySymtabCommand()
|
||||
}
|
||||
|
||||
func (mc *MachoContext) removeSymtabCommand() {
|
||||
ptr := int64(0)
|
||||
if mc.Is64bit() {
|
||||
ptr, _ = mc.file.Seek(int64(Header_size_64), io.SeekStart)
|
||||
} else {
|
||||
ptr, _ = mc.file.Seek(int64(Header_size), io.SeekStart)
|
||||
}
|
||||
|
||||
var symtab_fix *Symtab
|
||||
for _, cmd := range mc.commands {
|
||||
if cmd.Cmd() != LC_SYMTAB {
|
||||
ptr += int64(cmd.Cmdsize())
|
||||
continue
|
||||
}
|
||||
var symtab = cmd.(*Symtab)
|
||||
symtab_fix = symtab
|
||||
|
||||
// erase strings referenced
|
||||
start := int64(symtab_fix.stroff)
|
||||
size := symtab_fix.strsize
|
||||
fmt.Printf("// Erase at=0x%x size=0x%x\n", start, size)
|
||||
mc.file.WriteAt(make([]byte, size), start)
|
||||
|
||||
// erase nlist64 symbol items
|
||||
start = int64(symtab_fix.symoff)
|
||||
size = symtab_fix.nsyms * 16
|
||||
fmt.Printf("// Erase at=0x%x size=0x%x\n", start, size)
|
||||
mc.file.WriteAt(make([]byte, size), start)
|
||||
|
||||
symtab_fix.symoff = 0
|
||||
symtab_fix.nsyms = 0
|
||||
symtab_fix.stroff = 0
|
||||
symtab_fix.strsize = 0
|
||||
mc.file.Seek(ptr, io.SeekStart)
|
||||
mc.file.Write(symtab_fix.Serialize(mc))
|
||||
break
|
||||
}
|
||||
mc.file.Seek(0, io.SeekStart)
|
||||
}
|
||||
|
||||
func (mc *MachoContext) removeDySymtabCommand() {
|
||||
ptr := int64(0)
|
||||
if mc.Is64bit() {
|
||||
ptr, _ = mc.file.Seek(int64(Header_size_64), io.SeekStart)
|
||||
} else {
|
||||
ptr, _ = mc.file.Seek(int64(Header_size), io.SeekStart)
|
||||
}
|
||||
for _, cmd := range mc.commands {
|
||||
if cmd.Cmd() != LC_DYSYMTAB {
|
||||
ptr += int64(cmd.Cmdsize())
|
||||
continue
|
||||
}
|
||||
var dysymtab = cmd.(*DySymtab)
|
||||
dysymtab_fix := dysymtab
|
||||
dysymtab_fix.indirectsymoff = 0
|
||||
dysymtab_fix.nindirectsyms = 0
|
||||
mc.file.Seek(ptr, io.SeekStart)
|
||||
mc.file.Write(dysymtab_fix.Serialize(mc))
|
||||
}
|
||||
}
|
||||
|
||||
func (mc *MachoContext) RemoveExportTrie() {
|
||||
var start int64
|
||||
var size int
|
||||
if mc.dyldinfo != nil {
|
||||
// legacy export trie
|
||||
start = int64(mc.dyldinfo.export_off)
|
||||
size = int(mc.dyldinfo.export_size)
|
||||
mc.file.WriteAt(make([]byte, size), start)
|
||||
} else if mc.exports != nil {
|
||||
// modern export trie
|
||||
start = int64(mc.exports.dataoff)
|
||||
size = int(mc.exports.datasize)
|
||||
mc.file.WriteAt(make([]byte, size), start)
|
||||
} else {
|
||||
// no export trie (??)
|
||||
// should never occur unless this binary is modified
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user