В mbr от семерки наткнулся на следующее Код (Text): pushd 0BB07h ; BB07 - TPM функция TCG_CompactHashLogExtendEvent eax pushd 0200h ; eax pushd 8 ; ecx push ebx ; edx push ebx ; ebx push ebp ; ebp pushd 0 ; esi pushd 7C00h ; edi popad pushw 0 pop es ; Занести 0000 в es int 1Ah Непонятно почему здесь дважды push ebx то есть в регистры из стека заносится неправильно (для вызова TCG_CompactHashLogExtendEvent нужно в ax занести BB07h в ecx длину буфера и т д.) второй push ebx все сбивает Как оно вообще работает И еще буду благодарен за любую информацию об этом TPM Вот MBR от 7ки спасибо SII: Код (Text): seg000:7C00 xor ax, ax ; Стек будет располагаться перед кодом MBR (вершина 0000:7C00) seg000:7C02 mov ss, ax seg000:7C04 mov sp, 7C00h seg000:7C07 mov es, ax ; Сам код MBR будет целиком переслан в область с адреса 0000:0600 seg000:7C09 mov ds, ax seg000:7C0B mov si, 7C00h seg000:7C0E mov di, 600h seg000:7C11 mov cx, 200h seg000:7C14 cld seg000:7C15 rep movsb seg000:7C17 push ax ; Переход на код по его новому местоположению (0000:061C) seg000:7C18 push 61Ch seg000:7C1B retf seg000:7C1C ; --------------------------------------------------------------------------- seg000:7C1C sti ; Отсюда продолжается работа кода MBR seg000:7C1D mov cx, 4 ; Поиск активного раздела seg000:7C20 mov bp, 7BEh seg000:7C23 seg000:7C23 loc_7C23: seg000:7C23 cmp byte ptr [bp+0], 0 seg000:7C27 jl short ActiveFound seg000:7C29 jnz InvalidPartitionTable seg000:7C2D add bp, 10h seg000:7C30 loop loc_7C23 seg000:7C32 int 18h ; Активного раздела нет, возврат в BIOS (вызов ROM Basic) seg000:7C34 seg000:7C34 ActiveFound: seg000:7C34 mov [bp+0], dl ; Код диска, с которого ведётся загрузка seg000:7C37 push bp seg000:7C38 mov byte ptr [bp+11h], 5 ; Счётчик попыток чтения seg000:7C3C mov byte ptr [bp+10h], 0 ; Признак наличия EDD (0 - нет, 1 - есть) seg000:7C40 mov ah, 41h seg000:7C42 mov bx, 55AAh seg000:7C45 int 13h ; Проверка наличия расширенных дисковых функций BIOS seg000:7C47 pop bp seg000:7C48 jb short TryRead seg000:7C4A cmp bx, 0AA55h seg000:7C4E jnz short TryRead seg000:7C50 test cx, 1 seg000:7C54 jz short TryRead seg000:7C56 inc byte ptr [bp+10h] ; EDD есть seg000:7C59 seg000:7C59 TryRead: seg000:7C59 pushad seg000:7C5B cmp byte ptr [bp+10h], 0 ; Есть поддержка EDD? seg000:7C5F jz short NoEDD seg000:7C61 push large 0 ; Считывание первого сектора активного раздела по адресу 0000:7C00 seg000:7C67 push large dword ptr [bp+8] seg000:7C6B push 0 seg000:7C6E push 7C00h seg000:7C71 push 1 seg000:7C74 push 10h seg000:7C77 mov ah, 42h seg000:7C79 mov dl, [bp+0] seg000:7C7C mov si, sp seg000:7C7E int 13h seg000:7C80 lahf seg000:7C81 add sp, 10h seg000:7C84 sahf seg000:7C85 jmp short ReadComplete seg000:7C87 ; --------------------------------------------------------------------------- seg000:7C87 seg000:7C87 NoEDD: seg000:7C87 mov ax, 201h ; Считывание первого сектора активного раздела по адресу 0000:7C00 seg000:7C8A mov bx, 7C00h seg000:7C8D mov dl, [bp+0] seg000:7C90 mov dh, [bp+1] seg000:7C93 mov cl, [bp+2] seg000:7C96 mov ch, [bp+3] seg000:7C99 int 13h seg000:7C9B seg000:7C9B ReadComplete: seg000:7C9B popad seg000:7C9D jnb short ReadSuccessful ; Переход, если чтение оказалось успешным seg000:7C9F dec byte ptr [bp+11h] ; Если неудача, пытаться считать снова, пока счётчик не исчерпан seg000:7CA2 jnz short TryReadAgain seg000:7CA4 cmp byte ptr [bp+0], 80h ; Сомнительный момент: если считать не удалось, но диск не был первым seg000:7CA8 jz ErrorLoadingOS ; физическим, производится попытка чтения с первого физичекого диска, seg000:7CAC mov dl, 80h ; однако с использованием данных из старой таблицы разделов seg000:7CAE jmp short ActiveFound seg000:7CB0 ; --------------------------------------------------------------------------- seg000:7CB0 seg000:7CB0 TryReadAgain: seg000:7CB0 push bp seg000:7CB1 xor ah, ah seg000:7CB3 mov dl, [bp+0] seg000:7CB6 int 13h ; Сброс диска seg000:7CB8 pop bp seg000:7CB9 jmp short TryRead seg000:7CBB ; --------------------------------------------------------------------------- seg000:7CBB seg000:7CBB ReadSuccessful: seg000:7CBB cmp ds:Signature, 0AA55h ; Контроль сигнатуры вторичного загрузчика seg000:7CC1 jnz short MissingOS seg000:7CC3 push word ptr [bp+0] ; Код диска, с которого выполняется загрузка seg000:7CC6 call WaitPS2Ready seg000:7CC9 jnz short loc_7CE2 ; Переход, если контроллер PS/2 занят seg000:7CCB cli seg000:7CCC mov al, 0D1h ; Разрешение линии A20 seg000:7CCE out 64h, al seg000:7CD0 call WaitPS2Ready seg000:7CD3 mov al, 0DFh seg000:7CD5 out 60h, al seg000:7CD7 call WaitPS2Ready seg000:7CDA mov al, 0FFh seg000:7CDC out 64h, al seg000:7CDE call WaitPS2Ready seg000:7CE1 sti seg000:7CE2 seg000:7CE2 loc_7CE2: seg000:7CE2 mov ax, 0BB00h ; Проверка поддержки TPM и дешифровка вторичного загрузчика seg000:7CE5 int 1Ah seg000:7CE7 and eax, eax seg000:7CEA jnz short loc_7D27 seg000:7CEC cmp ebx, 41504354h seg000:7CF3 jnz short loc_7D27 seg000:7CF5 cmp cx, 102h seg000:7CF9 jb short loc_7D27 seg000:7CFB push large 0BB07h seg000:7D01 push large 200h seg000:7D07 push large 8 seg000:7D0D push ebx seg000:7D0F push ebx seg000:7D11 push ebp seg000:7D13 push large 0 seg000:7D19 push large 7C00h seg000:7D1F popad seg000:7D21 push 0 seg000:7D24 pop es seg000:7D25 int 1Ah seg000:7D27 seg000:7D27 loc_7D27: seg000:7D27 pop dx seg000:7D28 xor dh, dh seg000:7D2A jmp far ptr loc_7C00 ; Переход на вторичный загрузчик seg000:7D2A ; --------------------------------------------------------------------------- seg000:7D2F db 0CDh seg000:7D30 db 18h seg000:7D31 ; --------------------------------------------------------------------------- seg000:7D31 seg000:7D31 MissingOS: seg000:7D31 mov al, ds:7B7h ; msgMissingOS seg000:7D34 jmp short DisplayErrorMessage seg000:7D36 ; --------------------------------------------------------------------------- seg000:7D36 seg000:7D36 ErrorLoadingOS: seg000:7D36 mov al, ds:7B6h ; msgErrorLoadingOS seg000:7D39 jmp short DisplayErrorMessage seg000:7D3B ; --------------------------------------------------------------------------- seg000:7D3B seg000:7D3B InvalidPartitionTable: seg000:7D3B mov al, ds:7B5h ; msgInvalidPartitionTable seg000:7D3E seg000:7D3E DisplayErrorMessage: seg000:7D3E xor ah, ah seg000:7D40 add ax, 700h seg000:7D43 mov si, ax seg000:7D45 seg000:7D45 loc_7D45: seg000:7D45 lodsb seg000:7D46 cmp al, 0 seg000:7D48 jz short Halt seg000:7D4A mov bx, 7 seg000:7D4D mov ah, 0Eh seg000:7D4F int 10h ; Вывод символа с продвижением курсора seg000:7D51 jmp short loc_7D45 seg000:7D53 ; --------------------------------------------------------------------------- seg000:7D53 seg000:7D53 Halt: seg000:7D53 hlt seg000:7D54 jmp short Halt seg000:7D56 seg000:7D56 ; =============== S U B R O U T I N E ======================================= seg000:7D56 seg000:7D56 seg000:7D56 WaitPS2Ready proc near seg000:7D56 sub cx, cx seg000:7D58 seg000:7D58 loc_7D58: seg000:7D58 in al, 64h ; Бит 1 равен 1, когда входной буфер контроллера PS/2 занят seg000:7D5A jmp short $+2 seg000:7D5C and al, 2 seg000:7D5E loopne loc_7D58 seg000:7D60 and al, 2 seg000:7D62 retn seg000:7D62 WaitPS2Ready endp seg000:7D62 seg000:7D62 ; --------------------------------------------------------------------------- seg000:7D63 aInvalidPartititinTable db 'Invalid partition table',0 seg000:7D7B aErrorLoadingOS db 'Error loading operating system',0 seg000:7D9A aMissingOS db 'Missing operating system',0 seg000:7DB3 db 0 seg000:7DB4 db 0 seg000:7DB5 msgInvalidPartitionTable db 63h seg000:7DB6 msgErrorLoadingOS db 7Bh seg000:7DB7 msgMissingOS db 9Ah seg000:7DB8 dd 2B11BF10h ; Сигнатура диска seg000:7DBC dw 0 seg000:7DBE Partition1 db 80h ; Активный раздел seg000:7DBF db 20h ; Номер головки начала раздела seg000:7DC0 dw 21h ; Номера цилиндра и сектора начала раздела seg000:7DC2 db 7 ; Тип раздела seg000:7DC3 db 0FEh ; Номер головки конца раздела seg000:7DC4 dw 0FFFFh ; Номера цилиндра и сектора конца раздела seg000:7DC6 dd 800h ; LBA начального сектора раздела seg000:7DCA dd 12A18000h ; Число секторов в разделе seg000:7DCE Partition2 db 0 seg000:7DCF db 0 seg000:7DD0 dw 0 seg000:7DD2 db 0 seg000:7DD3 db 0 seg000:7DD4 dw 0 seg000:7DD6 dd 0 seg000:7DDA dd 0 seg000:7DDE Partition3 db 0 seg000:7DDF db 0 seg000:7DE0 dw 0 seg000:7DE2 db 0 seg000:7DE3 db 0 seg000:7DE4 dw 0 seg000:7DE6 dd 0 seg000:7DEA dd 0 seg000:7DEE Partition4 db 0 seg000:7DEF db 0 seg000:7DF0 dw 0 seg000:7DF2 db 0 seg000:7DF3 db 0 seg000:7DF4 dw 0 seg000:7DF6 dd 0 seg000:7DFA dd 0 seg000:7DFE Signature dw 0AA55h
Treant Конкретно про TPM ничего не скажем. >; Проверка поддержки TPM и дешифровка вторичного загрузчика Таки всё же наверное не "дешифровка", а "измерение"? >Непонятно почему здесь дважды push ebx Пропущен esp (который вытаскивается, но выкидывается). Код (Text): pushd 0BB07h ; eax BB07 - TPM функция TCG_CompactHashLogExtendEvent pushd 0200h ; ecx pushd 8 ; edx push ebx ; ebx push ebx ; esp (discarded) push ebp ; ebp pushd 0 ; esi pushd 7C00h ; edi popad
Я в тонкости работы TPM не вдавался по двум причинам: во-первых, мне это не шибко интересно, а во-вторых, ввоз в Россию компутеров с TPM запрещён законодательно, а значит, проверить изыски на практике всё равно невозможно. Поэтому помочь в этой области не смогу; в коде загрузчика я фактически лишь отметил вызов сервиса TPM, который то ли проверяет, то ли дешифрует вторичный загрузчик.