1 | | - | import Utils |
| 1 | + | from . import Utils |
2 | 2 | | import ida_bytes |
3 | 3 | | import ida_struct |
4 | 4 | | import idc |
| skipped 75 lines |
80 | 80 | | ] |
81 | 81 | | creator.createTypes(self.standardTypes) |
82 | 82 | | |
| 83 | + | class Go116Types(GoTypes_BASE): |
| 84 | + | def __init__(self, creator): |
| 85 | + | super(Go116Types, self).__init__(creator) |
| 86 | + | self.standardTypes = [ |
| 87 | + | ("type", [ |
| 88 | + | ("size", "uintptr"), |
| 89 | + | ("ptrdata", "uintptr"), |
| 90 | + | ("hash", "__int32"), |
| 91 | + | ("flag", "__int8"), |
| 92 | + | ("align", "__int8"), |
| 93 | + | ("fieldAlign", "__int8"), |
| 94 | + | ("kind", "kind"), |
| 95 | + | ("equal", "*void"), |
| 96 | + | ("gcdata", "*unsigned char"), |
| 97 | + | ("string", "__int32"), |
| 98 | + | ("ptrtothis", "__int32"), |
| 99 | + | ]) |
| 100 | + | ] |
| 101 | + | |
| 102 | + | #this types depends on type structure so should be created after |
| 103 | + | self.commonTypes += [ |
| 104 | + | ("uncommonType", [("pkgPath", "__int32"), ("mcount", "__int16"), ("unused1", "__int16"),("moff", "__int32"), ("unused2", "__int16")]), |
| 105 | + | ("method__", [("name", "__int32"), ("mtyp", "__int32"),("ifn","__int32"), ("tfn", "__int32")]), |
| 106 | + | ("structField",[ |
| 107 | + | ("Name", "void *"), |
| 108 | + | ("typ", "*type"), |
| 109 | + | ("offset", "uintptr"), |
| 110 | + | ]), |
| 111 | + | ("structType", [ |
| 112 | + | ("type","type"), |
| 113 | + | ("pkgPath", "void *"), |
| 114 | + | ("fields", "slice") |
| 115 | + | ]), |
| 116 | + | ("imethod", [ |
| 117 | + | ("name", "__int32"), |
| 118 | + | ("pkgPath", "__int32"), |
| 119 | + | ]), |
| 120 | + | ("interfaceType",[ |
| 121 | + | ("type", "type"), |
| 122 | + | ("pkgPath", "void *"), |
| 123 | + | ("methods", "slice") |
| 124 | + | ]), |
| 125 | + | ("funcType", [ |
| 126 | + | ("type", "type"), |
| 127 | + | ("incount","__int16"), |
| 128 | + | ("outcount", "__int16") |
| 129 | + | ]), |
| 130 | + | ("mapType", [ |
| 131 | + | ("type", "type"), |
| 132 | + | ("key","*type"), |
| 133 | + | ("elem","*type"), |
| 134 | + | ("bucket", "*type"), |
| 135 | + | ("hasher", "void *"), |
| 136 | + | ("keysize","__int8"), |
| 137 | + | ("elemsize","__int8"), |
| 138 | + | ("bucketsize","__int16"), |
| 139 | + | ("flags","__int32"), |
| 140 | + | ]) |
| 141 | + | ] |
| 142 | + | |
| 143 | + | creator.createTypes(self.standardTypes) |
| 144 | + | creator.createTypes(self.commonTypes) |
83 | 145 | | |
84 | 146 | | class Go17Types(GoTypes_BASE): |
85 | 147 | | def __init__(self, creator): |
| skipped 181 lines |
267 | 329 | | def __iter__(self): |
268 | 330 | | return self |
269 | 331 | | |
270 | | - | def next(self): |
| 332 | + | def __next__(self): |
271 | 333 | | if self.pos >= self.end: |
272 | 334 | | raise StopIteration |
273 | 335 | | value = self.stepper.ptr(self.pos) |
| skipped 41 lines |
315 | 377 | | #Check if we already parse this |
316 | 378 | | if offset in self.type_addr: |
317 | 379 | | return |
318 | | - | print "Processing: %x" % offset |
| 380 | + | print("Processing: %x" % offset) |
319 | 381 | | self.type_addr.append(offset) |
320 | 382 | | |
321 | 383 | | #Set type and get name |
| skipped 3 lines |
325 | 387 | | |
326 | 388 | | #get kind name |
327 | 389 | | kind_name = self.getKindEnumName(offset) |
328 | | - | print kind_name |
| 390 | + | print(kind_name) |
329 | 391 | | if name[0] == "*" and kind_name != "PTR": |
330 | 392 | | name = name[1:] |
331 | 393 | | name = Utils.relaxName(name) |
| skipped 56 lines |
388 | 450 | | self.make_arr(addr, size, sz, "structField") |
389 | 451 | | sid_type = ida_struct.get_struc_id("type") |
390 | 452 | | size_new_struct = self.getPtr(sid_type, offset, "size") |
391 | | - | for i in xrange(size): |
| 453 | + | for i in range(size): |
392 | 454 | | self.processStructField(addr, i*sz) |
393 | 455 | | name = self.getName(offset) |
394 | 456 | | name = Utils.relaxName(name) |
| skipped 23 lines |
418 | 480 | | fields = [] |
419 | 481 | | curr_offset = 0 |
420 | 482 | | idc.set_cmt(addr, name, 0) |
421 | | - | for i in xrange(size): |
| 483 | + | for i in range(size): |
422 | 484 | | fieldname = self.nameFromOffset(self.getPtr(sid, addr+i*sz,"Name")) |
423 | 485 | | type_addr = self.getPtr(sid, addr+i*sz, "typ") |
424 | 486 | | typename = self.getType(type_addr) |
| skipped 1 lines |
426 | 488 | | if fieldname == "" or fieldname is None: |
427 | 489 | | fieldname = "unused_"+Utils.id_generator() |
428 | 490 | | offset = self.getStructFieldOffset(sid, addr+i*sz) |
| 491 | + | print(f"Get offset: {offset:x}") |
429 | 492 | | if offset != curr_offset: |
430 | | - | print "Offset missmatch.Got %d expected %d. Adding padding..." % (curr_offset, offset) |
| 493 | + | print("Offset missmatch.Got %d expected %d. Adding padding..." % (curr_offset, offset)) |
431 | 494 | | if offset < curr_offset: |
432 | 495 | | raise("Too many bytes already") |
433 | 496 | | while offset != curr_offset: |
| skipped 3 lines |
437 | 500 | | if size != 0: |
438 | 501 | | offset_kind = idc.get_member_offset(sid_type, "kind") |
439 | 502 | | kind_of_type = self.getKindEnumName(type_addr) |
440 | | - | print kind_of_type |
| 503 | + | print(kind_of_type) |
441 | 504 | | if kind_of_type == "STRUCT_": #Disabled for now |
442 | 505 | | name_type = self.getName(type_addr) |
443 | 506 | | while name_type[0] == "*": |
444 | 507 | | name_type = name_type[1:] |
445 | 508 | | name_type = Utils.relaxName(name_type) |
446 | 509 | | name_type = "ut_" + name_type |
447 | | - | #print "setting type %s" % name_type |
| 510 | + | #print("setting type %s" % name_type) |
448 | 511 | | fields.append((fieldname, name_type)) |
449 | 512 | | elif kind_of_type == "STRING": |
450 | 513 | | fields.append((fieldname, "string")) |
| skipped 4 lines |
455 | 518 | | else: |
456 | 519 | | fields.append((fieldname, "char [%d]" % size)) |
457 | 520 | | if curr_offset != self_size: |
458 | | - | print "%x: Structure size mismatch: %x" % (addr, curr_offset) |
| 521 | + | print("%x: Structure size mismatch: %x" % (addr, curr_offset)) |
459 | 522 | | if self_size < curr_offset: |
460 | 523 | | raise("Too many bytes already") |
461 | 524 | | while self_size != curr_offset: |
| skipped 4 lines |
466 | 529 | | new_type_sid = ida_struct.get_struc_id(name) |
467 | 530 | | sz = ida_struct.get_struc_size(new_type_sid) |
468 | 531 | | if sz != self_size: |
469 | | - | print "%x" % addr |
| 532 | + | print("%x" % addr ) |
470 | 533 | | raise("Error at creating structure") |
471 | 534 | | |
472 | 535 | | def getType(self, addr): |
473 | | - | print "%x" % addr |
| 536 | + | print("%x" % addr) |
474 | 537 | | sid = ida_struct.get_struc_id("type") |
475 | 538 | | name = self.getName(addr) |
476 | 539 | | if self.getKindEnumName(addr) != "PTR": |
| skipped 50 lines |
527 | 590 | | super(TypeProcessing17, self).__init__(pos, endpos, step, settings) |
528 | 591 | | self.robase = base_type |
529 | 592 | | |
530 | | - | def next(self): |
| 593 | + | def __next__(self): |
531 | 594 | | if self.pos >= self.end: |
532 | 595 | | raise StopIteration |
533 | 596 | | value = idc.get_wide_dword(self.pos) |
| skipped 7 lines |
541 | 604 | | |
542 | 605 | | def get_str(self, pos, len): |
543 | 606 | | out = "" |
544 | | - | for i in xrange(len): |
| 607 | + | for i in range(len): |
545 | 608 | | out += chr(idc.get_wide_byte(pos+i)) |
546 | 609 | | return out |
547 | 610 | | |
| skipped 25 lines |
573 | 636 | | def processIMethods(self, offst, size): |
574 | 637 | | sz = ida_struct.get_struc_size(ida_struct.get_struc_id("imethod")) |
575 | 638 | | comm = [] |
576 | | - | for i in xrange(size): |
| 639 | + | for i in range(size): |
577 | 640 | | comm.append(self.processIMethod(offst + i * sz)) |
578 | 641 | | idc.set_cmt(offst, "\n".join(comm), 0) |
579 | 642 | | return comm |
| skipped 36 lines |
616 | 679 | | in_size = idc.Word(offset + idc.get_member_offset(sid, "incount")) |
617 | 680 | | out_size = idc.Word(offset + idc.get_member_offset(sid, "outcount")) |
618 | 681 | | sz = ida_struct.get_struc_size(sid) |
619 | | - | for i in xrange(in_size + out_size): |
| 682 | + | for i in range(in_size + out_size): |
620 | 683 | | idc.SetType(offset + sz + i * self.stepper.size, "type *") |
621 | 684 | | |
622 | 685 | | |
| skipped 5 lines |
628 | 691 | | |
629 | 692 | | def getStructFieldOffset(self, sid, addr): |
630 | 693 | | return (self.getPtr(sid, addr, "offset") >> 1) |
| 694 | + | |
| 695 | + | class TypeProcessing116(TypeProcessing19): |
| 696 | + | |
| 697 | + | def __init__(self, pos, endpos, step, settings, base_type): |
| 698 | + | super(TypeProcessing19, self).__init__(pos, endpos, step, settings, base_type) |
| 699 | + | self.robase = base_type |
| 700 | + | |
| 701 | + | def getStructFieldOffset(self, sid, addr): |
| 702 | + | return (self.getPtr(sid, addr, "offset") >> 1) |
| 703 | + | |
| 704 | + | def makeMap(self, offset): |
| 705 | + | idc.SetType(offset, "mapType") |
| 706 | + | sid = ida_struct.get_struc_id("mapType") |
| 707 | + | addr = self.getPtr(sid, offset, "key") |
| 708 | + | self.handle_offset(addr) |
| 709 | + | addr = self.getPtr(sid, offset, "elem") |
| 710 | + | self.handle_offset(addr) |
| 711 | + | addr = self.getPtr(sid, offset, "bucket") |
| 712 | + | self.handle_offset(addr) |