Package Libs :: Module graphclass
[hide private]
[frames] | no frames]

Source Code for Module Libs.graphclass

  1  #!/usr/bin/env python
 
  2  """
 
  3  Immunity Debugger Graph Lib
 
  4  
 
  5  (c) Immunity, Inc. 2004-2007
 
  6  
 
  7  
 
  8  U{Immunity Inc.<http://www.immunityinc.com>} Graph API
 
  9  
 
 10  
 
 11  """ 
 12  
 
 13  __version__ = '1.1' 
 14  
 
 15  import debugger 
 16  
 
 17  #colors from graphics.hpp
 
 18  
 
 19  ImmDrawColors = {"Black":0,"Maroon":128,"Green":32768,"Olive":32896,"Navy":8388608,"Purple":8388736,"Teal":8421376,\
 
 20                      "Gray":8421504,"Silver":12632256,"Red":255,"Lime":65280,"Yellow":65535,"Blue":16711680,"Fuchsia":16711935,\
 
 21                      "Aqua":16776960,"LightGray":12632256,"DarkGray":8421504,"White":16777215,"MoneyGreen":12639424,\
 
 22                      "SkyBlue":15780518,"Cream":15793151,"MedGray":10789024,"red":255,"darkgreen":32768} 
 23  
 
 24  
 
 25  
 
26 -class Graph:
27 - def __init__(self):
28 self.vertices=[] 29 self.edges=[] 30 self.nvertices=0 31 self.nedges=0 32 self.handler=0 33 self.height=0 34 self.width=0
35 36
37 - def setHandler(self,handler):
38 self.handler=handler
39
40 - def addVertices(self,vertices):
41 self.vertices=vertices
42
43 - def getVertices(self):
44 return self.vertices
45
46 - def addEdges(self,edges):
47 """edges[0] = source 48 edges[1] = target 49 edges[3] = type 50 type can be one of: 51 Direct = 0 52 True = 1 53 False = 2""" 54 self.edges.append(edges)
55
56 - def getEdges(self):
57 return self.edges
58
59 - def getNEdges(self):
60 self.nedges=len(self.edges) 61 return self.nedges
62
63 - def getNVertices(self):
64 self.nvertices=len(self.vertices) 65 return self.nvertices
66
67 - def splashTime(self):
68 return debugger.splash_time(self.handler,self.height,self.width)
69 70
71 - def setBitSize(self,vertices):
72 fy2=fx2=fx=fy=0 73 for vertex in vertices: 74 (x,y,x2,y2)=vertex.getCoords() 75 if y2>fy2: 76 fy2=y2 77 if x2 > fx2: 78 fx2=x2 79 if y < fy: 80 fy=y 81 if x < fx: 82 fx=x 83 self.height=fy2 + 200 84 self.width = fx2 + 400 + abs(fx) 85 vertices[0].setStartCoords(self.height,self.width)
86
87 - def getBitSize(self):
88 return (self.height,self.width)
89 90 91 92 93 94 95 96 97 98
99 -class Vertex:
100 - def __init__(self,handler):
101 self.inadj=[] 102 self.outadj=[] 103 self.name="" 104 self.label="" 105 self.buf=[] 106 #size is represented by absolute coords (x,y) 107 self.absy=0 108 self.absx=0 109 self.handler=handler 110 self.x1=0 111 self.y1=0 112 self.x2=0 113 self.y2=0 114 self.rely=0 115 self.relx=0 116 self.color="Black" 117 self.texth=0 118 self.textw=0 119 self.drawn=False 120 self.placed=False 121 self.start_x=300 122 self.start_y=10
123
124 - def __cmp__(self, other):
125 return cmp(self.y2, other.y2)
126 127
128 - def addInAdj(self,edge):
129 self.inadj.append(edge)
130
131 - def addOutAdj(self,edge,type):
132 """type can be one of: 133 Direct = 0 134 True = 1 135 False = 2 136 """ 137 self.outadj.append((edge,type))
138
139 - def getOutAdj(self):
140 return self.outadj
141
142 - def getInAdj(self):
143 return self.inadj
144 145
146 - def setName(self,name):
147 self.name=name
148
149 - def getName(self):
150 return self.name
151
152 - def setLabel(self,label):
153 self.label=label
154
155 - def getLabel(self):
156 return self.label
157
158 - def setVertexBuffer(self,buf):
159 self.buf=buf
160
161 - def getVertexBuffer(self):
162 return self.buf
163
164 - def setRelPos(self,x,y):
165 self.relx=x 166 self.rely=y
167
168 - def getRelPos(self):
169 return (self.relx,self.rely)
170
171 - def setPlaced(self):
172 self.placed=True
173
174 - def isPlaced(self):
175 """returns True if vertex was already placed into the plane""" 176 return self.placed
177
178 - def calculateAbsoluteSize(self,text):
179 theight=0 180 for line in text: 181 (twidth,theight)=debugger.get_text_size(self.handler,line) 182 if twidth > self.absx: 183 self.absx=twidth 184 self.absy=self.absy+theight 185 self.absy=self.absy+4 186 self.absx=self.absx+10
187 188
189 - def getAbsoluteSize(self):
190 return (self.absx,self.absy)
191
192 - def getHeight(self):
193 return self.absy
194
195 - def getWidth(self):
196 return self.absx
197
198 - def getCoords(self):
199 self.x2 = self.getWidth() + self.relx 200 self.y2 = self.getHeight() + self.rely 201 return (self.relx,self.rely,self.x2,self.y2)
202
203 - def getY2(self):
204 return self.y2
205
206 - def getX(self):
207 return self.relx
208
209 - def getY(self):
210 return self.rely
211
212 - def getX2(self):
213 return self.x2
214
215 - def getCoordsWithMargin(self):
216 self.x2 = self.getWidth() + self.relx 217 self.y2 = self.getHeight() + self.rely 218 return (self.relx,self.rely,self.x2,self.y2)
219
220 - def setDrawn(self):
221 self.drawn=True
222
223 - def isDrawn(self):
224 return self.drawn
225
226 - def moveNorth(self,value):
227 self.rely=self.rely - value 228 return
229
230 - def moveSouth(self,value):
231 self.rely=self.rely + value 232 return
233
234 - def moveEast(self,value):
235 self.relx = self.relx + value 236 return
237
238 - def moveWest(self,value):
239 self.relx = self.relx - value 240 return
241
242 - def placeVertex(self,x,y,text,textcolor,rectcolor,start):
243 theight=0 244 self.texth=0 245 self.textw=0 246 f=open("ea.txt","w+") 247 for line in text: 248 if text.index(line) == 0: 249 #title 250 (theight,twidth)=debugger.draw_text(self.handler,x,y+self.texth,line+":",ImmDrawColors["Purple"]) 251 if twidth > self.textw: 252 self.textw=twidth 253 self.texth=self.texth+theight 254 else: 255 line = line.replace("\x0a","").replace("\x0d","") 256 #split asm from comment 257 try: 258 asmline=line.split("||")[0] 259 commentline=line.split("||")[1] 260 (theight,twidth)=debugger.draw_text(self.handler,x,y+self.texth," " +asmline,ImmDrawColors[textcolor]) 261 (theight,twidth2)=debugger.draw_text(self.handler,x+twidth,y+self.texth," " +commentline,ImmDrawColors["Red"]) 262 twidth+=twidth2 263 264 except: 265 (theight,twidth)=debugger.draw_text(self.handler,x,y+self.texth," " +line,ImmDrawColors[textcolor]) 266 if twidth > self.textw: 267 self.textw=twidth 268 self.texth=self.texth+theight 269 270 #left 271 debugger.draw_line(self.handler,x-5,y-3,x-5,y+self.texth+2,ImmDrawColors[rectcolor],start) #mark graph start 272 #right 273 debugger.draw_line(self.handler,x+self.textw+5,y-2,x+self.textw+5,y+self.texth+2,ImmDrawColors[rectcolor]) 274 #top 275 debugger.draw_line(self.handler,x-6,y-3,x+self.textw+5,y-2,ImmDrawColors[rectcolor]) 276 #bottom 277 debugger.draw_line(self.handler,x-6,y+self.texth+2,x+self.textw+5,y+self.texth+2,ImmDrawColors[rectcolor]) 278 return None
279
280 - def addEndPoint(x,y,color):
281 debugger.draw_line(self.handler,x,y,x,y+3,ImmDrawColors[color]) 282 debugger.draw_line(self.handler,x,y,x,y-3,ImmDrawColors[color]) 283 debugger.draw_line(self.handler,x,y,x+3,y+3,ImmDrawColors[color]) 284 debugger.draw_line(self.handler,x,y,x-3,y+3,ImmDrawColors[color]) 285 debugger.draw_line(self.handler,x,y,x+3,y-3,ImmDrawColors[color]) 286 debugger.draw_line(self.handler,x,y,x-3,y-3,ImmDrawColors[color]) 287 return
288
289 - def setStartCoords(self,height,width):
290 self.start_x=width/2 291 self.start_y=10
292 293
294 - def getStartCoords(self):
295 return (self.start_x,self.start_y)
296 297 298
299 -class Draw:
300 - def __init__(self):
301 """ Initialize the Drawing class""" 302 self.title="" 303 self.start_address=0 304 self.handler=0 305 self.edgeproperties=[]
306
307 - def createGraphWindow(self,title,start_address):
308 self.title=title 309 self.start_address=int(start_address,16) 310 self.handler=debugger.create_graph_window(title,self.start_address) 311 return self.handler
312 313
314 - def getTitle(self):
315 return self.title
316
317 - def getHandler(self):
318 return self.handler
319
320 - def setEdgeProperties(self,properties):
321 """ properties: { sourcename: "5" ,targetname: "6" ,label: "false", color: red } 322 """ 323 self.edgeproperties.append(properties)
324 325
326 - def getEdgeProperties(self):
327 return self.edgeproperties
328 329 330
331 -class Line:
332 - def __init__(self,handler):
333 """ Initialize the Line class""" 334 self.x_pos=0 335 self.y_pos=0 336 self.x_to=0 337 self.y_to=0 338 self.color="Black" 339 self.handler=handler
340
341 - def draw(self,x_pos,y_pos,x_to,y_to,color):
342 self.x_pos=x_pos 343 self.y_pos=y_pos 344 self.x_to=x_to 345 self.y_to=y_to 346 self.color=color 347 return debugger.draw_line(self.handler,self.x_pos,self.y_pos,self.x_to,self.y_to,ImmDrawColors[self.color])
348 349
350 - def getCoords(self):
351 return (self.x_pos,self.y_pos,self.x_to,self.y_to)
352
353 - def getColor(self):
354 return self.color
355
356 - def getHandle(self):
357 return self.handle
358 359 360
361 -class vcgNode:
362 - def __init__(self,handler):
363 """ Initialize the Recttext class""" 364 self.x1=0 365 self.y1=0 366 self.x2=0 367 self.y2=0 368 self.rely=0 369 self.relx=0 370 self.color="Black" 371 self.text="" 372 self.texth=0 373 self.textw=0 374 self.absy=0 375 self.absx=0 376 self.handler=handler 377 self.title="" 378 self.label="" 379 self.nodebuf=[] 380 self.child=[]
381 382
383 - def drawText(self,x,y,text,color):
384 debugger.Error("e") 385 theight=0 386 for line in text: 387 #separate asm from comment 388 asmline=line.split("||")[0] 389 commentline=line.split("||")[1] 390 debugger.Error("asm: %s\ncomment: %s" % (asmline,commentline)) 391 (theight,twidth)=debugger.draw_text(self.handler,x,y+self.texth,asmline,ImmDrawColors[color]) 392 (theight,twidth2)=debugger.draw_text(self.handler,x+twidth,y+self.texth,commentline,ImmDrawColors["Red"]) 393 twidth+=twidth2 394 if twidth > self.textw: 395 self.textw=twidth 396 self.texth=self.texth+theight 397 return None
398
399 - def drawRect(self,x1,y1,x2,y2,color):
400 self.x1=x1 401 self.y1=y1 402 self.x2=x2 403 self.y2=self.y2 404 self.color=color 405 return debugger.draw_rectangle(self.handler,x1,y1,x2,y2,ImmDrawColors[self.color])
406
407 - def setTitle(self,title):
408 self.title=title
409
410 - def getTitle(self):
411 return self.title
412
413 - def setLabel(self,label):
414 self.label=label
415
416 - def getLabel(self):
417 return self.label
418
419 - def setNodeBuffer(self,buf):
420 self.nodebuf=buf
421
422 - def getNodeBuffer(self):
423 return self.nodebuf
424 425 426
427 - def getAbsSize(self,text):
428 theight=0 429 self.absy=0 430 self.absx=0 431 for line in text: 432 (twidth,theight)=debugger.get_text_size(self.handler,line) 433 if twidth > self.absx: 434 self.absx=twidth 435 self.absy=self.absy+theight 436 return (self.absy+4,self.absx+10)
437
438 - def setChild(self,child):
439 self.child.append(child)
440
441 - def getChild(self):
442 return self.child
443
444 - def setRelPos(self,x,y):
445 self.relx=x 446 self.rely=y
447
448 - def getRelPos(self):
449 return (self.relx,self.rely)
450