zoukankan      html  css  js  c++  java
  • pefile解析PE格式

    import os,sys
    import pefile
    import pydasm
    import struct
    
    #print sys.argv
    
    def show_section(pe):
        print "[sections layout:]"
        print "#"*45
        print "%10s %10s %10s %10s" % ("section", "addr", "real_size", "alloc_size" )
        print "-"*45
        for section in pe.sections:
            print "%10s %10x %10x %10x" % (section.Name.strip('x00'), section.VirtualAddress, section.Misc_VirtualSize, section.SizeOfRawData)
        print "
    "
        
    
    def show_imports(pe):
        pe.parse_data_directories()
    
        print "[imports:]"
        print "#"*45
        for entry in pe.DIRECTORY_ENTRY_IMPORT:
            print "%s" % entry.dll.center(45, "-")
            print "%10s %30s" % ("addr", "function")
            print "-"*45
            for imp in entry.imports:
                print "%10x %30s" % (imp.address, imp.name)
        print "
    "
    
    def show_exports(pe):
        pe.parse_data_directories()
    
        print "[exports:]"
        print "#"*45
        print "%10s %30s" % ("addr", "function")
        print "-"*45
        for exp in pe.DIRECTORY_ENTRY_EXPORT.symbols:
            print "%10x %30s" % (pe.OPTIONAL_HEADER.ImageBase + exp.address, exp.name)
        print "
    "
    
    def show_disasm(pe, off_img, count):
        print "[disasm %08x - %08x]" % (off_img, off_img + count)
        print "-"*45
        image_base = pe.OPTIONAL_HEADER.ImageBase
        data = pe.get_memory_mapped_image()[off_img:off_img+count]
        offset = 0
        while offset < len(data):
            i = pydasm.get_instruction(data[offset:], pydasm.MODE_32)
            raw = ""
            for k in range(0,i.length):
                raw += "%2X " % (struct.unpack("B", data[offset+k])[0])
            print "%25s   %-20s" % ( raw, pydasm.get_instruction_string(i, pydasm.FORMAT_INTEL, image_base+off_img))
            offset += i.length
        
    def show_entry(pe):
        print "[entry]"
        print "#"*45
    
        off_entry = pe.OPTIONAL_HEADER.AddressOfEntryPoint
        show_disasm(pe, off_entry, 100)
        
    if __name__ == "__main__":
        try:
            filename = sys.argv[1]
        except:
            sys.exit(1)
           
        pe = pefile.PE(filename)
    
        show_section(pe)
        
        show_imports(pe)
    
        show_exports(pe)
        
        show_entry(pe)
    

      

  • 相关阅读:
    Java过滤器与SpringMVC拦截器的差异学习笔记
    java拦截器(Interceptor)学习笔记
    java监听器(Listener)学习笔记
    java过滤器Filter笔记
    java反射学习笔记
    程序员大佬推荐的java学习路线
    jmeter java请求
    java代码实现rabbitMQ请求
    fatjar eclipse4.4 java项目的jar包一起打包 net.sf.fjep.fatjar_0.0.32.jar
    jmeter参数化之CSV Data Set Config
  • 原文地址:https://www.cnblogs.com/long123king/p/3614288.html
Copyright © 2011-2022 走看看