Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 02.10.2018
Сообщений: 13

ImportError: cannot import name 'PROT_READ' from 'mmap'

10.05.2021, 23:10. Показов 1753. Ответов 0

Студворк — интернет-сервис помощи студентам
Всем привет! Скачал с гитхаба очень нужный скрипт - декриптор прошивок IPMI. В описании к скрипту указано как запускать скрипт:

Python
1
/smcbmc.py SMT_X11_xyz.bin decrypted.bin
Больше ничего не описано, ни какие библиотеки должны быть скачаны, ничего, только этот код запуска.
Скачал Python 3.9, запускаю из CMD, в папке Python39 создал папку, туда закинул скрипт

Python
1
python smcbmc.py 111.bin 222.bin
Скрипт выдаёт ошибку:
File "C:\Users\Admin\AppData\Local\Programs\P ython\Python39\edt\smcbmc.py", line 8, in <module>
from mmap import mmap, PROT_READ
ImportError: cannot import name 'PROT_READ' from 'mmap' (unknown location)

Сам код скрипта:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/env python3
 
import argparse
import math
import shutil
import os
import zlib
from mmap import mmap, PROT_READ
from Crypto.Cipher import AES
 
__author__      = "Michael Niewöhner"
__copyright__   = "Copyright 2020, Michael Niewöhner"
__license__     = "GPLv2"
 
 
REGIONS = {
    'meta':     { 'offset': 0x01fc0000, 'enc_hdr_len': 0xc0, },
    'rootfs':   { 'offset': 0x00400000, 'enc_hdr_len': 0x60, },
    'webfs':    { 'offset': 0x01700000, 'enc_hdr_len': 0x60, },
}
 
CRYPTO_STR = 'crypto_task{id}\x00\x00\x00\x00'
 
def decompress_multi(data):
    ret = b''
 
    while True:
        if not data:
            return ret
 
        z = zlib.decompressobj()
        ret += z.decompress(data)
        data = z.unused_data
 
def read_int(mm, size):
    return int.from_bytes(mm.read(size), 'little')
 
def extract_keys(mm):
    rootfs_off      = REGIONS['rootfs']['offset']
    inode_off       = mm.find(b"libipmi.so", rootfs_off, REGIONS['webfs']['offset'])
 
    mm.seek(inode_off - 8)
    file_size       = read_int(mm, 4) & 0xffffff
    offset_namelen  = read_int(mm, 4)
    chunk_ptr_off   = (offset_namelen & ~0x3f) >> 4
    chunk_count     = math.ceil(file_size / 4096)
    data_off        = chunk_ptr_off + chunk_count * 4
    last_ptr_off    = data_off - 4
 
    mm.seek(rootfs_off + last_ptr_off)
    data_end        = read_int(mm, 4)
    data_len        = data_end - data_off
 
    with mmap(-1, file_size) as mi:
        #mm.seek(data_off)  # we're here already
        mi.write(decompress_multi(mm.read(data_len)))
        mi.seek(0)
 
        ret = REGIONS
 
        ct1_off   = mi.find(CRYPTO_STR.format(id=1).encode())
        mi.seek(ct1_off - 4 * 16)
        ret['rootfs']['key'] = mi.read(16)
        ret['webfs']['key']  = mi.read(16)
        ret['rootfs']['iv']  = mi.read(16)
        ret['webfs']['iv']   = mi.read(16)
 
        ct2_off   = mi.find(CRYPTO_STR.format(id=2).encode())
        mi.seek(ct2_off - 2 * 16)
        ret['meta'].update({'key': mi.read(16), 'iv': mi.read(16)})
 
        return ret
 
def decrypt_header(mm, header):
    mm.seek(header['offset'])
    cipher = AES.new(header['key'], AES.MODE_CBC, iv=header['iv'])
    ret = cipher.decrypt(mm.read(header['enc_hdr_len']))
 
    return ret
 
def write_header(mm, header, data):
    if not len(data) == header['enc_hdr_len']:
        raise Exception(f"Wrong data length for headr at offset {header['offset']}")
 
    mm.seek(header['offset'])
    mm.write(data)
 
def decrypt_image(infile, outfile):
    shutil.copyfile(infile, outfile)
    with open(outfile, "r+b") as f,\
         mmap(f.fileno(), 0) as mm:
            regions = extract_keys(mm)
            for reg in regions.values():
                dec = decrypt_header(mm, reg)
                write_header(mm, reg, dec)
 
 
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Decrypt Supermicro BMC firmware images.')
    parser.add_argument('infile', help='file to decrypt')
    parser.add_argument('outfile', help='output')
    args = parser.parse_args()
 
    decrypt_image(args.infile, args.outfile)
Если скрипт требует дополнительные модули которые не входят в чистый python 3.9, напишите пожалуйста что установить. Спасибо большое.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.05.2021, 23:10
Ответы с готовыми решениями:

ImportError: cannot import name 'x' from 'main'
Добрый день. Подскажите пожалуйста как избавить от этой ошибки. Ошибка выскакивает если я пытаюсь запустить код и из test.py и из...

ImportError: cannot import name 'is_divide_by' from 'solution'
def isDivideBy(number, a, b): if number // a and b: print(True) else: print(False) ...

ImportError: cannot import name 'cached_property' from 'werkzeug'
Доброго времени суток, не компилируется программа, выходит вот такая ошибка: Traceback (most recent call last): File...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.05.2021, 23:10
Помогаю со студенческими работами здесь

ImportError: cannot import name 'deepcopy' from 'copy'
Помогите пожалуйста!!! import turtle Traceback (most recent call last): File &quot;&lt;pyshell#0&gt;&quot;, line 1, in &lt;module&gt; ...

ImportError: cannot import name 'Chat' from 'telegram'
Привет, ребята, пишу бота, но выдаёт ошибку, не могу понять в чём дело. (Я новичок). Сам код: from telegram.ext import Updater,...

ImportError: cannot import name 'vacuum' from 'miio'
Пишу мини проект, где умный дом управляется через телеграм бот. Мне необходимо импортировать класс vacuum из пакета miio. Установил сам...

Ошибка ImportError: cannot import name 'test' и __com__
Всем доброго времени суток, у меня возникла проблема при импорте функции &quot;test&quot; в исполнительном файле (Shif.py). В модуле настроек...

Ошибка: ImportError: cannot import name 'views' from '__main__'
Добрый день! Не могу понять причину ошибки, все делаю правильно, но выходит ошибка: ImportError: cannot import name 'views' from...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru