Майже все, що ви хотіли знати про flash bios частина 1, wasm

Майже все, що ви хотіли знати про Flash BIOS: Частина 1 - Архів WASM.RU

В черговий раз наткнувшись на оффтопик в форумі «що таке флеш?», «Де знаходиться BIOS?» І т. Д. Я не витримав. Вирішив спробувати прояснити цю тему, а також і себе проявити в новій якості. З неї можна витягти інформацію для створення шкідливого коду, тому, сподіваюся, що таких бажаючих буде небагато. У даній статті я розгляну такі питання:

  1. що таке флеш, принципи роботи і будови флеш, як програмно працювати з флеш;
  • питання «чи можна зробити запис в флеш для захисту програм?»;

    • FLAGS = 0002h і біти VM і RF його розширення обнуляються;
    • У регістрі CR0 обнуляються біти PG, TS, EM, MP і PE;
    • CS = F000h;
    • EIP = 0000FFFF0h;
    • DS = ES = SS = FS = GS = 0000h;
    • Регістр DX містить інформацію про тип процесора.

    Тепер трохи про саму мікросхемі флеш пам'яті. По-перше програмна реалізація мікросхем залежить від виробника. Таких на сьогоднішній день багато, наведу лише основні:

    Winbond, Intel, Amtel, SST, Imt, Macronix і інші. У зв'язку з цим, команди програмування мікросхем залежать від виробника. Далі, самі мікросхеми крім обсягу пам'яті розрізняються ще і способу зберігання інформації:

    1. sectored - флеш пам'ять з секторної структурою. Наприклад, мікросхема INTEL 28F001BX-T / 12V (128 Кb) має 4 сектори: 1-main 112 Kb, 2 сектора по 4 Kb (дані PnP) і bootblock розміром в 8 Kb.
    2. Paged - флеши зі сторінкової структурою. Вся пам'ять мікросхеми представлена ​​у вигляді однієї сторінки.
    3. BULK-ERASE - як п.2, тільки для перезапису потрібно послати команду попереднього очищення сторінки.
    4. SMALL SECTORS - флеш пам'ять з комірчастою структурою. Приклад SST 28x040 series (5V / 3V / 2.7V) (512 Kb) має 1 024 сектора розміром по 128 байт.
    5. BULK-ERASE, NEEDS BLANKING - як п.3, тільки потрібно ще і blanking команда. Часто використовується в старих чіпах.

    Ну, і як я вже говорив, для того щоб дістатися до самої мікросхеми флеш-пам'яті (мається на увазі програмно) потрібно відповідним чином програмувати регістри чіпсета материнської плати. І знову, оскільки виробників чіпсетів багато (основні: Intel, VIA, SiS, AMD, nVidia) програмні алгоритми вирішення доступу до флеш у всіх різні. І саме в цій області не існує загальних стандартів, поспішаю розчарувати початківців вірмейкеров і бажаючих захистити програми методом прив'язування до сигнатурі, залишеної в флеш-пам'яті. Код доведеться писати апаратно-залежний (тобто під конкретну материнську плату і мікросхему пам'яті), а для спроби об'єднати всі існуючі материнські плати і флеш мікросхеми доведеться створювати контору на зразок Award або AMI і набирати з добрий десяток програмістів. Навіть класичні програми доступу до флеш (amiflash або awdflash) працюють не на всіх материнських платах (незважаючи на те, що прошитий їх «рідний» BIOS). Ну і загальновідомо, що на більшості материнських плат тепер є перемичка, яка апаратно забороняє працювати з флеш-пам'яттю. Ряд виробників пішли ще далі. Вони використовують технології "Dual BIOS" (Gigabyte), недокументовані способи захисту флеш чіпів (VIA), і ін.

    Прийшла пора привести трохи коду. Для початку не свій. J

    mov byte ptr [eax], 60h; mov [0E5555h], 60h

    ; команда Confirm erase (30h, 50h)

    ; mov byte ptr [0FFFE5555h], 0AAh

    ; mov byte ptr [0FFFE2AAAh]. 55h

    ; mov byte ptr [0FFFE5555h]. 80h; команда Erase sector

    ; mov byte ptr [0FFFE5555h], 0AAh

    ; mov byte ptr [0FFFE2AAAh]. 55h

    ; mov byte ptr [0FFFE5555h]. 50h; команда Confirm Erase

    push ecx; push 0e2aaah