Есть полусгоревший роутер, и вот хочется поэкспериментировать. Прошивка с сайта производителя https://totolink.ru/assets/template/files/n300rt-n300rt-v224.rar Дело в том что в прошивке вписана хешсумма и роутер при закачке сразу считывает из этой прошивки хешсумму и расчитывает хешсумму непосредственно с этого файла прошивки который мы подсовываем, и если не совпадают хегсуммы то роутер не принимает прошивку, поэтому требуется с прощивки удалить где-то в середине 50% кода чтобы роутер с этой прошивкой перестал загружаться и найти где в этом файле записана хешсума и заменить старую хешсуму на новую ту что уже у нас получилась после удаления части кода прошивки. Я думаю такая схема должна прокатить. на роутере идёт две проверки, первая на хешсумму а вторая на модель производителя, то есть левую прошивку или поврежденную залить нельзя. поэтому интересно что будет если залить официальную прошивку но с удаленной частью кода и измененной хешсуммой. кто модифицирует эту прошивку тому по желанию скину видео всего процесса, как я закачиваю прошивку на роутер, как он устанавливает прошивку, и как потом не загружается или что вообще там будет происходить
А зачем нерабочую прошивку создавать? Модель другая, но структура файла такая же: https://github.com/utessel/edimax/b...a/package/librtk-inband/src/inband_cmd.c#L219 - проверка контрольной суммы. Spoiler: python PHP: #! /usr/bin/env python3ENDIANNESS = 'big'SIGNATURE_LEN = 4headers = { b'cr6c': 'FW_HEADER_WITH_ROOT', b'cs6c': 'FW_HEADER', b'r6cr': 'ROOT_HEADER', b'w6cg': 'WEB_HEADER'}def CHECKSUM_OK(data): sum = 0 for b in data: sum = (sum + b) & 0xFF return sum == 0def fwChecksumOk(data): sum = 0 for i in range(0, len(data), 2): sum = (sum + int.from_bytes(data[i:i+2], ENDIANNESS)) & 0xFFFF return sum == 0def tohex(bs, delim): return delim.join(f'{b:02x}' for b in bs)def read_part(stream): magic = stream.read(SIGNATURE_LEN) if len(magic) != SIGNATURE_LEN: print('ERROR: failed to read next part') return False if magic not in headers: model = magic + stream.read(0xFC) if len(model) == 0x100: print('ERROR: unknown signature', tohex(magic, ' ')) else: print('Model?:', model) return False print('Start reading', headers[magic]) bs = stream.read(4) if len(bs) != 4: print('ERROR: failed to read startAddr') return False startAddr = int.from_bytes(bs, ENDIANNESS) print(f'startAddr: 0x{startAddr:08X}') bs = stream.read(4) if len(bs) != 4: print('ERROR: failed to read burnAddr') return False burnAddr = int.from_bytes(bs, ENDIANNESS) print(f'burnAddr: 0x{burnAddr:08X}') bs = stream.read(4) if len(bs) != 4: print('ERROR: failed to read len') return False len_ = int.from_bytes(bs, ENDIANNESS) print(f'len: 0x{len_:08X}') data = stream.read(len_) if len(data) != len_: print('ERROR: failed to read data') return False if headers[magic] == 'WEB_HEADER': chksum_check = CHECKSUM_OK(data) else: chksum_check = fwChecksumOk(data) print('Checksum:', 'OK' if chksum_check else 'FAIL') print() return Truewith open('TOTOLINK-N300RT-V2.2.4-B20180330.1621.web', 'rb') as f: while read_part(f): pass