Помогите разобраться с TPM

Тема в разделе "WASM.OS.DEVEL", создана пользователем Treant, 16 янв 2010.

  1. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    В mbr от семерки наткнулся на следующее
    Код (Text):
    1.  
    2.  pushd 0BB07h ; BB07 - TPM функция TCG_CompactHashLogExtendEvent eax
    3.  pushd 0200h ; eax
    4.  pushd 8 ; ecx
    5.  push ebx ; edx
    6.  push ebx ; ebx
    7.  push ebp ; ebp
    8.  pushd 0 ; esi
    9.  pushd 7C00h ; edi
    10.  popad
    11.  pushw 0
    12.  pop es ; Занести 0000 в es
    13.  int 1Ah
    Непонятно почему здесь дважды push ebx
    то есть в регистры из стека заносится неправильно (для вызова TCG_CompactHashLogExtendEvent нужно в ax занести BB07h в ecx длину буфера и т д.)
    второй push ebx все сбивает
    Как оно вообще работает
    И еще буду благодарен за любую информацию об этом TPM
    Вот MBR от 7ки спасибо SII:
    Код (Text):
    1. seg000:7C00      xor    ax, ax     ; Стек будет располагаться перед кодом MBR (вершина 0000:7C00)
    2. seg000:7C02      mov    ss, ax
    3. seg000:7C04      mov    sp, 7C00h
    4. seg000:7C07      mov    es, ax     ; Сам код MBR будет целиком переслан в область с адреса 0000:0600
    5. seg000:7C09      mov    ds, ax
    6. seg000:7C0B      mov    si, 7C00h
    7. seg000:7C0E      mov    di, 600h
    8. seg000:7C11      mov    cx, 200h
    9. seg000:7C14      cld
    10. seg000:7C15      rep    movsb
    11. seg000:7C17      push   ax         ; Переход на код по его новому местоположению (0000:061C)
    12. seg000:7C18      push   61Ch
    13. seg000:7C1B      retf
    14. seg000:7C1C ; ---------------------------------------------------------------------------
    15. seg000:7C1C      sti               ; Отсюда продолжается работа кода MBR
    16. seg000:7C1D      mov     cx, 4     ; Поиск активного раздела
    17. seg000:7C20      mov     bp, 7BEh
    18. seg000:7C23
    19. seg000:7C23 loc_7C23:
    20. seg000:7C23      cmp     byte ptr [bp+0], 0
    21. seg000:7C27      jl      short ActiveFound
    22. seg000:7C29      jnz     InvalidPartitionTable
    23. seg000:7C2D      add     bp, 10h
    24. seg000:7C30      loop    loc_7C23
    25. seg000:7C32      int     18h      ; Активного раздела нет, возврат в BIOS (вызов ROM Basic)
    26. seg000:7C34
    27. seg000:7C34 ActiveFound:
    28. seg000:7C34      mov     [bp+0], dl           ; Код диска, с которого ведётся загрузка
    29. seg000:7C37      push    bp
    30. seg000:7C38      mov     byte ptr [bp+11h], 5 ; Счётчик попыток чтения
    31. seg000:7C3C      mov     byte ptr [bp+10h], 0 ; Признак наличия EDD (0 - нет, 1 - есть)
    32. seg000:7C40      mov     ah, 41h
    33. seg000:7C42      mov     bx, 55AAh
    34. seg000:7C45      int     13h                  ; Проверка наличия расширенных дисковых функций BIOS
    35. seg000:7C47      pop     bp
    36. seg000:7C48      jb      short TryRead
    37. seg000:7C4A      cmp     bx, 0AA55h
    38. seg000:7C4E      jnz     short TryRead
    39. seg000:7C50      test    cx, 1
    40. seg000:7C54      jz      short TryRead
    41. seg000:7C56      inc     byte ptr [bp+10h]    ; EDD есть
    42. seg000:7C59
    43. seg000:7C59 TryRead:
    44. seg000:7C59      pushad
    45. seg000:7C5B      cmp     byte ptr [bp+10h], 0 ; Есть поддержка EDD?
    46. seg000:7C5F      jz      short NoEDD
    47. seg000:7C61      push    large 0              ; Считывание первого сектора активного раздела по адресу 0000:7C00
    48. seg000:7C67      push    large dword ptr [bp+8]
    49. seg000:7C6B      push    0
    50. seg000:7C6E      push    7C00h
    51. seg000:7C71      push    1
    52. seg000:7C74      push    10h
    53. seg000:7C77      mov     ah, 42h
    54. seg000:7C79      mov     dl, [bp+0]
    55. seg000:7C7C      mov     si, sp
    56. seg000:7C7E      int     13h
    57. seg000:7C80      lahf
    58. seg000:7C81      add     sp, 10h
    59. seg000:7C84      sahf
    60. seg000:7C85      jmp     short ReadComplete
    61. seg000:7C87 ; ---------------------------------------------------------------------------
    62. seg000:7C87
    63. seg000:7C87 NoEDD:
    64. seg000:7C87      mov     ax, 201h     ; Считывание первого сектора активного раздела по адресу 0000:7C00
    65. seg000:7C8A      mov     bx, 7C00h
    66. seg000:7C8D      mov     dl, [bp+0]
    67. seg000:7C90      mov     dh, [bp+1]
    68. seg000:7C93      mov     cl, [bp+2]
    69. seg000:7C96      mov     ch, [bp+3]
    70. seg000:7C99      int     13h
    71. seg000:7C9B
    72. seg000:7C9B ReadComplete:
    73. seg000:7C9B      popad
    74. seg000:7C9D      jnb     short ReadSuccessful ; Переход, если чтение оказалось успешным
    75. seg000:7C9F      dec     byte ptr [bp+11h]    ; Если неудача, пытаться считать снова, пока счётчик не исчерпан
    76. seg000:7CA2      jnz     short TryReadAgain
    77. seg000:7CA4      cmp     byte ptr [bp+0], 80h ; Сомнительный момент: если считать не удалось, но диск не был первым
    78. seg000:7CA8      jz      ErrorLoadingOS       ; физическим, производится попытка чтения с первого физичекого диска,
    79. seg000:7CAC      mov     dl, 80h              ; однако с использованием данных из старой таблицы разделов
    80. seg000:7CAE      jmp     short ActiveFound
    81. seg000:7CB0 ; ---------------------------------------------------------------------------
    82. seg000:7CB0
    83. seg000:7CB0 TryReadAgain:
    84. seg000:7CB0      push    bp
    85. seg000:7CB1      xor     ah, ah
    86. seg000:7CB3      mov     dl, [bp+0]
    87. seg000:7CB6      int     13h                  ; Сброс диска
    88. seg000:7CB8      pop     bp
    89. seg000:7CB9      jmp     short TryRead
    90. seg000:7CBB ; ---------------------------------------------------------------------------
    91. seg000:7CBB
    92. seg000:7CBB ReadSuccessful:
    93. seg000:7CBB      cmp     ds:Signature, 0AA55h ; Контроль сигнатуры вторичного загрузчика
    94. seg000:7CC1      jnz     short MissingOS
    95. seg000:7CC3      push    word ptr [bp+0]      ; Код диска, с которого выполняется загрузка
    96. seg000:7CC6      call    WaitPS2Ready
    97. seg000:7CC9      jnz     short loc_7CE2       ; Переход, если контроллер PS/2 занят
    98. seg000:7CCB      cli
    99. seg000:7CCC      mov     al, 0D1h             ; Разрешение линии A20
    100. seg000:7CCE      out     64h, al
    101. seg000:7CD0      call    WaitPS2Ready
    102. seg000:7CD3      mov     al, 0DFh
    103. seg000:7CD5      out     60h, al
    104. seg000:7CD7      call    WaitPS2Ready
    105. seg000:7CDA      mov     al, 0FFh
    106. seg000:7CDC      out     64h, al
    107. seg000:7CDE      call    WaitPS2Ready
    108. seg000:7CE1      sti
    109. seg000:7CE2
    110. seg000:7CE2 loc_7CE2:
    111. seg000:7CE2      mov     ax, 0BB00h           ; Проверка поддержки TPM и дешифровка вторичного загрузчика
    112. seg000:7CE5      int     1Ah
    113. seg000:7CE7      and     eax, eax
    114. seg000:7CEA      jnz     short loc_7D27
    115. seg000:7CEC      cmp     ebx, 41504354h
    116. seg000:7CF3      jnz     short loc_7D27
    117. seg000:7CF5      cmp     cx, 102h
    118. seg000:7CF9      jb      short loc_7D27
    119. seg000:7CFB      push    large 0BB07h
    120. seg000:7D01      push    large 200h
    121. seg000:7D07      push    large 8
    122. seg000:7D0D      push    ebx
    123. seg000:7D0F      push    ebx
    124. seg000:7D11      push    ebp
    125. seg000:7D13      push    large 0
    126. seg000:7D19      push    large 7C00h
    127. seg000:7D1F      popad
    128. seg000:7D21      push    0
    129. seg000:7D24      pop     es
    130. seg000:7D25      int     1Ah
    131. seg000:7D27
    132. seg000:7D27 loc_7D27:
    133. seg000:7D27      pop     dx
    134. seg000:7D28      xor     dh, dh
    135. seg000:7D2A      jmp     far ptr loc_7C00     ; Переход на вторичный загрузчик
    136. seg000:7D2A ; ---------------------------------------------------------------------------
    137. seg000:7D2F      db 0CDh
    138. seg000:7D30      db 18h
    139. seg000:7D31 ; ---------------------------------------------------------------------------
    140. seg000:7D31
    141. seg000:7D31 MissingOS:
    142. seg000:7D31      mov     al, ds:7B7h          ; msgMissingOS
    143. seg000:7D34      jmp     short DisplayErrorMessage
    144. seg000:7D36 ; ---------------------------------------------------------------------------
    145. seg000:7D36
    146. seg000:7D36 ErrorLoadingOS:
    147. seg000:7D36      mov     al, ds:7B6h          ; msgErrorLoadingOS
    148. seg000:7D39      jmp     short DisplayErrorMessage
    149. seg000:7D3B ; ---------------------------------------------------------------------------
    150. seg000:7D3B
    151. seg000:7D3B InvalidPartitionTable:
    152. seg000:7D3B      mov     al, ds:7B5h          ; msgInvalidPartitionTable
    153. seg000:7D3E
    154. seg000:7D3E DisplayErrorMessage:
    155. seg000:7D3E      xor     ah, ah
    156. seg000:7D40      add     ax, 700h
    157. seg000:7D43      mov     si, ax
    158. seg000:7D45
    159. seg000:7D45 loc_7D45:
    160. seg000:7D45      lodsb
    161. seg000:7D46      cmp     al, 0
    162. seg000:7D48      jz      short Halt
    163. seg000:7D4A      mov     bx, 7
    164. seg000:7D4D      mov     ah, 0Eh
    165. seg000:7D4F      int     10h                  ; Вывод символа с продвижением курсора
    166. seg000:7D51      jmp     short loc_7D45
    167. seg000:7D53 ; ---------------------------------------------------------------------------
    168. seg000:7D53
    169. seg000:7D53 Halt:
    170. seg000:7D53      hlt
    171. seg000:7D54      jmp     short Halt
    172. seg000:7D56
    173. seg000:7D56 ; =============== S U B R O U T I N E =======================================
    174. seg000:7D56
    175. seg000:7D56
    176. seg000:7D56 WaitPS2Ready    proc near
    177. seg000:7D56      sub     cx, cx
    178. seg000:7D58
    179. seg000:7D58 loc_7D58:
    180. seg000:7D58      in      al, 64h     ; Бит 1 равен 1, когда входной буфер контроллера PS/2 занят
    181. seg000:7D5A      jmp     short $+2
    182. seg000:7D5C      and     al, 2
    183. seg000:7D5E      loopne  loc_7D58
    184. seg000:7D60      and     al, 2
    185. seg000:7D62      retn
    186. seg000:7D62 WaitPS2Ready    endp
    187. seg000:7D62
    188. seg000:7D62 ; ---------------------------------------------------------------------------
    189. seg000:7D63 aInvalidPartititinTable db 'Invalid partition table',0
    190. seg000:7D7B aErrorLoadingOS db 'Error loading operating system',0
    191. seg000:7D9A aMissingOS     db 'Missing operating system',0
    192. seg000:7DB3      db   0
    193. seg000:7DB4      db   0
    194. seg000:7DB5 msgInvalidPartitionTable db 63h
    195. seg000:7DB6 msgErrorLoadingOS db 7Bh
    196. seg000:7DB7 msgMissingOS    db 9Ah
    197. seg000:7DB8      dd 2B11BF10h          ; Сигнатура диска
    198. seg000:7DBC      dw 0
    199. seg000:7DBE Partition1     db 80h      ; Активный раздел
    200. seg000:7DBF      db 20h                ; Номер головки начала раздела
    201. seg000:7DC0      dw 21h                ; Номера цилиндра и сектора начала раздела
    202. seg000:7DC2      db 7                  ; Тип раздела
    203. seg000:7DC3      db 0FEh               ; Номер головки конца раздела
    204. seg000:7DC4      dw 0FFFFh             ; Номера цилиндра и сектора конца раздела
    205. seg000:7DC6      dd 800h               ; LBA начального сектора раздела
    206. seg000:7DCA      dd 12A18000h          ; Число секторов в разделе
    207. seg000:7DCE Partition2     db 0
    208. seg000:7DCF      db 0
    209. seg000:7DD0      dw 0
    210. seg000:7DD2      db 0
    211. seg000:7DD3      db 0
    212. seg000:7DD4      dw 0
    213. seg000:7DD6      dd 0
    214. seg000:7DDA      dd 0
    215. seg000:7DDE Partition3     db 0
    216. seg000:7DDF      db 0
    217. seg000:7DE0      dw 0
    218. seg000:7DE2      db 0
    219. seg000:7DE3      db 0
    220. seg000:7DE4      dw 0
    221. seg000:7DE6      dd 0
    222. seg000:7DEA      dd 0
    223. seg000:7DEE Partition4     db 0
    224. seg000:7DEF      db 0
    225. seg000:7DF0      dw 0
    226. seg000:7DF2      db 0
    227. seg000:7DF3      db 0
    228. seg000:7DF4      dw 0
    229. seg000:7DF6      dd 0
    230. seg000:7DFA      dd 0
    231. seg000:7DFE Signature     dw 0AA55h
     
  2. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Treant
    Конкретно про TPM ничего не скажем.

    >; Проверка поддержки TPM и дешифровка вторичного загрузчика
    Таки всё же наверное не "дешифровка", а "измерение"?

    >Непонятно почему здесь дважды push ebx
    Пропущен esp (который вытаскивается, но выкидывается).
    Код (Text):
    1.  pushd 0BB07h ; eax   BB07 - TPM функция TCG_CompactHashLogExtendEvent
    2.  pushd 0200h ; ecx
    3.  pushd 8 ; edx
    4.  push ebx ; ebx
    5.  push ebx ; esp (discarded)
    6.  push ebp ; ebp
    7.  pushd 0 ; esi
    8.  pushd 7C00h ; edi
    9.  popad
     
  3. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Я в тонкости работы TPM не вдавался по двум причинам: во-первых, мне это не шибко интересно, а во-вторых, ввоз в Россию компутеров с TPM запрещён законодательно, а значит, проверить изыски на практике всё равно невозможно. Поэтому помочь в этой области не смогу; в коде загрузчика я фактически лишь отметил вызов сервиса TPM, который то ли проверяет, то ли дешифрует вторичный загрузчик.
     
  4. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Ясно
    Фиг с ним тогда
    Говно не трогаешь - оно не воняет...