Ejemplo n.º 1
0
def RealRepoint(rom: _io.BufferedReader, offsetTuples: [(int, int, str)]):
    pointerList = []
    pointerDict = {}
    for tup in offsetTuples:  # Format is (Double Pointer, New Pointer, Symbol)
        offset = tup[0]
        rom.seek(offset)
        pointer = ExtractPointer(rom.read(4))
        pointerList.append(pointer)
        pointerDict[pointer] = (tup[1] + 0x08000000, tup[2])

    offset = 0
    offsetList = []

    while offset < 0xFFFFFD:
        if offset in IGNORED_OFFSETS:
            offset += 4
            continue

        rom.seek(offset)
        word = ExtractPointer(rom.read(4))
        rom.seek(offset)

        for pointer in pointerList:
            if word == pointer:
                offsetList.append((offset, pointerDict[pointer][1]))
                rom.write(bytes(pointerDict[pointer][0].to_bytes(4, 'little')))
                break

        offset += 4

    return offsetList
Ejemplo n.º 2
0
def FunctionWrap(rom: _io.BufferedReader, space: int, hookAt: int, numParams: int, isReturning: int):
    # Align 2
    if hookAt & 1:
        hookAt -= 1

    rom.seek(hookAt)
    numParams = numParams - 1

    if numParams < 4:
        data = bytes([0x10, 0xB5, 0x3, 0x4C, 0x0, 0xF0, 0x3, 0xF8, 0x10, 0xBC,
                      (isReturning + 1), 0xBC, (isReturning << 3), 0x47, 0x20, 0x47])
    else:
        k = numParams - 3
        data = bytes([0x10, 0xB5, 0x82, 0xB0])
        for i in range(k + 2):
            data += bytes([i + 2, 0x9C, i, 0x94])
        data += bytes([0x0, 0x9C, numParams - 1, 0x94, 0x1, 0x9C, numParams, 0x94, 0x2, 0xB0, k + 8, 0x4C,
                       0x0, 0xF0, (k << 1) + 13, 0xF8, 0x82, 0xB0, numParams, 0x9C, 0x1, 0x94, numParams - 1,
                       0x9C, 0x0, 0x94])

        for i in reversed(range(k + 2)):
            data += bytes([i, 0x9C, i+2, 0x94])
        data += bytes([0x2, 0xB0, 0x10, 0xBC, isReturning + 1, 0xBC, isReturning << 3, 0x47, 0x20, 0x47])

    space += 0x08000001
    data += (space.to_bytes(4, 'little'))
    rom.write(bytes(data))
Ejemplo n.º 3
0
def ReplaceBytes(rom: _io.BufferedReader, offset: int, data: str):
    ar = offset
    words = data.split()
    for i in range(0, len(words)):
        rom.seek(ar)
        intByte = int(words[i], 16)
        rom.write(bytes(intByte.to_bytes(1, 'big')))
        ar += 1
Ejemplo n.º 4
0
def Repoint(rom: _io.BufferedReader,
            space: int,
            repointAt: int,
            slideFactor=0):
    rom.seek(repointAt)

    space += (0x08000000 + slideFactor)
    data = (space.to_bytes(4, 'little'))
    rom.write(bytes(data))
 def extract_file_bitstream(self, file_object: _io.BufferedReader) -> str:
     """
     Converts a file object into a string of 0's and 1's for easy processing down the road
     :param file_object:
     :return bitstream:
     """
     bitstream = ""
     while (byte := file_object.read(1)):
         bitstream += "{0:08b}".format(int.from_bytes(byte,
                                                      byteorder='big'))
Ejemplo n.º 6
0
def Hook(rom: _io.BufferedReader, space: int, hookAt: int, register=0):
    # Align 2
    if hookAt & 1:
        hookAt -= 1

    rom.seek(hookAt)

    register &= 7

    if hookAt % 4:
        data = bytes([0x01, 0x48 | register, 0x00 | (register << 3), 0x47, 0x0, 0x0])
    else:
        data = bytes([0x00, 0x48 | register, 0x00 | (register << 3), 0x47])

    space += 0x08000001
    data += (space.to_bytes(4, 'little'))
    rom.write(bytes(data))
Ejemplo n.º 7
0
    def _wget_stderr_parser(self, fileobj: _io.BufferedReader):
        """ 解析 wget 输出的生成器. """
        # 头部
        while True:
            line = fileobj.readline().strip()  # type: bytes

            if line.startswith(b'Length: '):
                split = line.split()
                if len(split) >= 1 and split[1].isdigit():
                    self._total_size = int(split[1])

            elif line.startswith(b'Saving to: '):
                break
            yield

        # 点状的进度条
        #      0K .......... .......... .......... .......... ..........  0% 4.45M 14s
        while True:
            line = fileobj.readline().strip()  # type: bytes
            if b'K' not in line:
                continue
            line_2 = line[line.index(b'K') + 2:]
            if b'=' in line_2[54:]:  # the end
                break
            line_3 = line_2[:54]  # 50 dots and 4 spaces
            self._downloaded_size += line_3.count(b'.') * 1024
            yield

        # 根据最后输出修正已下载的字节数
        # 上述代码根据每个点代表 1K 来粗略计算已下载的字节数, 实际文件可能并不是
        # 1K 的整数倍.
        lines = fileobj.readlines()
        for line in lines:
            if b'saved ' in line:
                r = re.search(b'saved \[(\d+)/\d+\]', line)
                if r:
                    actual_downloaded_size = r.group(1)
                    if actual_downloaded_size.isdigit():
                        self._downloaded_size = int(actual_downloaded_size)
Ejemplo n.º 8
0
def _load_header_rest(
        stream: _io.BufferedReader) -> typing.Tuple[typing.List[str], int]:
    header_parts: typing.List[str] = []
    offset: int = 0
    while True:
        block: bytes = stream.read(BLOCK_SIZE)
        if not block:
            break

        header_parts.append(block)
        if END_CARD in block:
            break

        offset = offset + BLOCK_SIZE

    if not END_CARD in header_parts[-1]:
        raise NotImplementedError(f'Invalid FITS file')

    return header_parts, offset
Ejemplo n.º 9
0
def RamRepoint(rom: _io.BufferedReader, offsetTuples: [(int, int)]):
    pointerList = []
    pointerDict = {}
    for tup in offsetTuples:  # Format is (Old Pointer, New Pointer)
        pointer = tup[0]
        pointerList.append(pointer)
        pointerDict[pointer] = tup[1]

    offset = 0
    while offset < 0xFFFFFD:
        rom.seek(offset)
        word = ExtractRamPointer(rom.read(4))
        rom.seek(offset)

        for pointer in pointerList:
            if word == pointer:
                rom.write(bytes(pointerDict[pointer].to_bytes(4, 'little')))
                break

        offset += 4