#!/usr/bin/python
 
 """
 Example usage of the ASM Classes library and OpenDis framework
 A part of the Inguma Project
 """
 
 import sys
 import pickle
 import asmclasses
 
 def printProgram(database):
     f = file(database, "r")
     
     #
     # The database you will load will be in the following format
     #
     # 1) Raw data found in the .rodata section
     # 2) The whole program in Python structures
     #
     rodata, obj = pickle.load(f)
 
     print "Section .rodata: %s" % hex(rodata.address)
     print "-"*80
     print repr(rodata.data)
     print "-"*80
     print 
 
     showLabel = False
     #
     # Iterate over all procedures in the program (List object)
     #
     for proc in obj:
         print "PROCEDURE", proc.name, "AT 0x" + proc.address
 
         #
         # Iterate over all lines in the procedure
         #
         for line in proc.lines:
             if showLabel:
                 print "  %s:"  % line.label
             if line.description:
                 mtype = str(type(line.description)).split("'")[1]
                 print "\t", "0x" + line.address.ljust(8) + ":", line.code.ljust(30), ";", mtype.ljust(4) + ":", repr(line.description)
             else:
                 print "\t", "0x" + line.address.ljust(8) + ":", line.code.ljust(30)
 
             # Current Instruction (Assume is x86)
             instructions = line.code.split(" ")
 
             if instructions[0].find("j") == 0 or instructions[0].find("call") > -1:
                 print
                 showLabel = True
             else:
                 showLabel = False
 
         print "END PROCEDURE"
         print
 
 def usage():
     print "Example OpenDis framework's API usage"
     print
     print "Usage:", sys.argv[0], "<opendis format database>"
     print
 
 def main():
     if len(sys.argv) == 1:
         usage()
         sys.exit(0)
     else:
         printProgram(sys.argv[1])
 
 if __name__ == "__main__":
     main()