package parser.elf; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.List; public class Sections { //各个属性节点的偏移地址。 private static final int SH_NAME = 0x00; private static final int SH_TYPE = 0x04; private static final int SH_FLAGES = 0x08; private static final int SH_ADDR = 0xc; private static final int SH_OFFSET = 0x10; private static final int SH_SIZE = 0x14; private static final int SH_LINK = 0x18; private static final int SH_INFO = 0x1c; private static final int SH_ADDRALIGN = 0x20; private static final int SH_ENTSIZE = 0x24; //section属性 private ByteBuffer m_sectionData; private int m_shoff; private int m_shentsize; private int m_shnum; private int m_shstrndx; private int m_nameOff; private int dynstrOff; private int dynsymOff; private int dynsymSize; private int dynamicOff; private int dynamicSize; private int relpltOff; private int relpltSize; private int roDataOff; private int roDataSize; private int roDataAlign; //各类字串字段 private List<String> roDataStrings; private List<String> symbols; private List<String> impLib; private List<String> impFuctions; private List<String> exportFuctions; Sections(ByteBuffer data, int shoff, int sh_nameOff) { int nameoff = sh_nameOff + data.getInt(shoff + SH_NAME); int k = 0; while (data.get(nameoff + (k++)) != 0x0) ; String na = new String(Arrays.copyOfRange(data.array(), nameoff, nameoff + k - 1)); System.out.println("\nsection:"); System.out.println("sh_name:" + na); System.out.println("sh_type:" + Integer.toHexString(data.getInt(shoff + SH_TYPE))); System.out.println("sh_addr:" + Integer.toHexString(data.getInt(shoff + SH_ADDR))); System.out.println("sh_off:" + Integer.toHexString(data.getInt(shoff + SH_OFFSET))); System.out.println("sh_size:" + Integer.toHexString(data.getInt(shoff + SH_SIZE))); System.out.println("sh_link:" + Integer.toHexString(data.getInt(shoff + SH_LINK))); System.out.println("sh_info:" + Integer.toHexString(data.getInt(shoff + SH_INFO))); System.out.println("sh_addralign:" + Integer.toHexString(data.getInt(shoff + SH_ADDRALIGN))); System.out.println("sh_entrysize:" + Integer.toHexString(data.getInt(shoff + SH_ENTSIZE))); int sh_type = data.getInt(shoff + SH_TYPE); int sh_off = data.getInt(shoff + SH_OFFSET); int sh_size = data.getInt(shoff + SH_SIZE); if (sh_type == 3) { for (int i = 0; i < sh_size; ) { int b = i; while (data.get(sh_off + (i++)) != 0) { } byte[] aa = Arrays.copyOfRange(data.array(), sh_off + b, sh_off + i - 1); System.out.println(new String(aa)); } } } Sections(ByteBuffer data, int shoff, int shentsize, int shnum, int shstrndx) { m_sectionData = data; m_shoff = shoff; m_shentsize = shentsize; m_shnum = shnum; m_shstrndx = shstrndx; int nameOff = m_sectionData.getInt(m_shoff + m_shentsize * m_shstrndx + SH_OFFSET); for (int i = 0; i < m_shnum; i++) { int off = m_shoff + i * m_shentsize; int noff = nameOff + m_sectionData.getInt(off + SH_NAME); int k = 0; while (m_sectionData.get(noff + (k++)) != 0x0) ; String na = new String(Arrays.copyOfRange(m_sectionData.array(), noff, noff + k - 1)); if (".dynsym".equals(na)) { dynsymOff = m_sectionData.getInt(off + SH_OFFSET); dynsymSize = m_sectionData.getInt(off + SH_SIZE); } else if (".dynstr".equals(na) || ".strtab".equals(na)) { dynstrOff = m_sectionData.getInt(off + SH_OFFSET); } else if (".dynamic".equals(na)) { dynamicOff = m_sectionData.getInt(off + SH_OFFSET); dynamicSize = m_sectionData.getInt(off + SH_SIZE); } else if (".rel.plt".equals(na)) { relpltOff = m_sectionData.getInt(off + SH_OFFSET); relpltSize = m_sectionData.getInt(off + SH_SIZE); } else if (".rodata".equals(na)) { roDataOff = m_sectionData.getInt(off + SH_OFFSET); roDataSize = m_sectionData.getInt(off + SH_SIZE); roDataAlign = m_sectionData.getInt(off + SH_ADDRALIGN); } // System.out.printf("\nsection:%d\n",i); // System.out.println("sh_name:"+na); // System.out.println("sh_type:"+Integer.toHexString(data.getInt(off+SH_TYPE))); // System.out.println("sh_addr:"+Integer.toHexString(data.getInt(off+SH_ADDR))); // System.out.println("sh_off:"+Integer.toHexString(data.getInt(off+SH_OFFSET))); // System.out.println("sh_size:"+Integer.toHexString(data.getInt(off+SH_SIZE))); // System.out.println("sh_link:"+Integer.toHexString(data.getInt(off+SH_LINK))); // System.out.println("sh_info:"+Integer.toHexString(data.getInt(off+SH_INFO))); // System.out.println("sh_addralign:"+Integer.toHexString(data.getInt(off+SH_ADDRALIGN))); // System.out.println("sh_entrysize:"+Integer.toHexString(data.getInt(off+SH_ENTSIZE))); } Dynsym dynsym = new Dynsym(data, dynsymOff, dynstrOff, dynsymSize); symbols = dynsym.getDynsymbols(); exportFuctions = dynsym.getExportFuction(); Dynamic dynamic = new Dynamic(data, dynamicOff, dynstrOff, dynamicSize); impLib = dynamic.getImpLib(); RelPlt relplt = new RelPlt(data, relpltOff, relpltSize, symbols); impFuctions = relplt.getImpFuctions(); Datasym datas = new Datasym(data, roDataOff, roDataSize, roDataAlign); roDataStrings = datas.getRoDataStrings(); } void dynsymParser() { } public int getDynstrOff() { return dynstrOff; } public int getDynsymOff() { return dynsymOff; } public List<String> getRoDataStrings() { return roDataStrings; } public List<String> getSymbols() { return symbols; } public List<String> getImpLib() { return impLib; } public List<String> getImpFuctions() { return impFuctions; } public List<String> getExportFuctions() { return exportFuctions; } public byte[] getNameArray(int shoff) { int sh_off = m_sectionData.getInt(shoff + SH_OFFSET); int sh_size = m_sectionData.getInt(shoff + SH_SIZE); System.out.println("sh_off:" + Integer.toHexString(sh_off)); return Arrays.copyOfRange(m_sectionData.array(), sh_off, sh_off + sh_size); } }