def get_type11(addr, pos): arg0 = pykd.loadWStr(addr + get_uint32(pos)) arg1 = get_uint8(pos + 4) if (arg1 == 0): return " '%s' FALSE" % arg0 else: return " '%s' TRUE" % arg0
def get_type16(addr, pos): arg0 = pykd.loadWStr(addr + get_uint32(pos)) arg1 = get_int16(pos + 4) arg2 = get_uint8(pos + 6) if (arg2 == 0): return " '%s' %d FALSE" % (arg0, arg1) else: return " '%s' %d TRUE" % (arg0, arg1)
def print_info(indent_level, addr, pfnc, func_id): name_pos = get_uint32(pfnc) stack = get_uint32(pfnc + 4) if (func_id): if (name_pos): name = pykd.loadWStr(addr + name_pos) pprint( indent_level, "Function %d ('%s') [max stack = %u]:" % (func_id, name, stack)) else: pprint(indent_level, "Function %d [max stack = %u]:" % (func_id, stack)) else: pprint(indent_level, "Global code [max stack = %u]:" % stack) indent_level += 1 flags = get_uint32(pfnc + 44) if (flags): string = "flags = (%04lX)" % flags if (flags & 0x8000): string += " noconnect" if (flags & 0x4000): string += " sub" if (flags & 0x2000): string += " explicit" if (flags & 2): string += " private" pprint(indent_level, string) arg_count = get_int16(pfnc + 36) arg_addr = pfnc + 48 if (func_id or arg_count > 0): print_list(indent_level, addr, "arg", arg_count, arg_addr, -1) lcl_count = get_int16(pfnc + 38) lcl_addr = arg_addr + 8 * arg_count if (func_id or lcl_count > 0): print_list(indent_level, addr, "lcl", lcl_count, lcl_addr, 1) tmp_count = get_int16(pfnc + 40) if (tmp_count > 0): print_list(indent_level, addr, "tmp", tmp_count, 0, 1)
def print_list(indent_level, addr, kind, count, list_ptr, start_id): pprint(indent_level, "%s count = %d" % (kind, count)) if (list_ptr): indent_level += 1 for i in range(count): name_pos = get_uint32(list_ptr + 8 * i) flags = get_uint32(list_ptr + 8 * i + 4) if (start_id): string = "%s %3d =" % (kind, start_id * (i + 1)) else: string = "%s =" % kind if (start_id >= 0): if (start_id): string += " " elif (flags & 2): string += " pri" else: string += " pub" elif (flags & 0x200): string += " ref" else: string += " val" if (flags & 0x100): string += " Variant ()" else: string += " Variant " string += " '%s'" % pykd.loadWStr(addr + name_pos) pprint(indent_level, string)
def _data_area_id_from_context(base_address): data_area_id_addr = base_address + 600 return loadWStr(data_area_id_addr)
def _user_id_from_context(base_address): user_id_addr = base_address + 348 return loadWStr(user_id_addr)
def is_ustr(clx, addr): try: pykd.loadWStr(addr) except: return False return True
def lstr(addr): # print(pykd.loadCStr(addr)) print(pykd.loadWStr(addr))
def _meta_object_name_of_frame(frame): name_addr = ptrPtr(_meta_object_addr_of_frame(frame) + 16) if isValid(name_addr): return loadWStr(name_addr) else: return ''
def testCStr(self): self.assertEqual('Hello', pykd.loadCStr(target.module.helloStr)) self.assertEqual(u'Hello', pykd.loadWStr(target.module.helloWStr))
def get_type6(addr, pos): arg0 = pykd.loadWStr(addr + get_uint32(pos)) return " '%s'" % arg0
def get_type14(addr, pos): arg0 = pykd.loadWStr(addr + get_uint32(pos)) arg1 = get_int16(pos + 4) arg2 = get_int16(pos + 6) return " '%s' %d %d" % (arg0, arg1, arg2)
def get_type12(addr, pos): arg0 = pykd.loadWStr(addr + get_uint32(pos)) arg1 = get_uint16(pos + 4) return " '%s' %d" % (arg0, arg1)
def _client_name_from_context(base_address): client_name_addr = base_address + 764 return loadWStr(client_name_addr)
def _method_name_of_raw_frame(frame): name_addr = ptrPtr(frame.stackOffset + 8) return loadWStr(name_addr)
def get_wide_string(self, addr): return pykd.loadWStr(addr)
def testBigCStr(self): self.assertEqual( 0x2000, len(pykd.loadCStr(pykd.ptrPtr(target.module.bigCStr)))) self.assertEqual( 0x2000, len(pykd.loadWStr(pykd.ptrPtr(target.module.bigWStr))))