|
|
1.1 root 1: ;
2: ; Copyright (c) 2008 TrueCrypt Foundation. All rights reserved.
3: ;
4: ; Governed by the TrueCrypt License 2.4 the full text of which is contained
5: ; in the file License.txt included in TrueCrypt binary and source code
6: ; distribution packages.
7: ;
8:
9: .MODEL tiny
10: .386
1.1.1.3 ! root 11: _TEXT SEGMENT USE16
1.1 root 12:
13: INCLUDE BootDefs.i
14:
1.1.1.3 ! root 15: ORG 7C00h ; Standard boot sector offset
1.1 root 16:
17: start:
18: ; BIOS executes boot sector from 0:7C00 or 7C0:0000 (default CD boot loader address).
1.1.1.3 ! root 19: ; Far jump to the next instruction sets IP to the standard offset 7C00.
1.1 root 20: db 0EAh ; jmp 0:main
21: dw main, 0
22:
1.1.1.3 ! root 23: loader_name_msg:
! 24: db ' TrueCrypt Boot Loader', 13, 10, 0
1.1 root 25:
26: main:
1.1.1.2 root 27: xor ax, ax
1.1 root 28: mov ds, ax
29:
1.1.1.3 ! root 30: lea si, loader_name_msg
1.1 root 31: call print
32:
33: mov ax, TC_BOOT_LOADER_SEGMENT
1.1.1.3 ! root 34: mov es, ax ; Default boot loader segment
1.1 root 35:
36: ; Check available memory
1.1.1.2 root 37: cmp word ptr [ds:413h], TC_BOOT_LOADER_SEGMENT / 1024 * 16 + TC_BOOT_MEMORY_REQUIRED
1.1.1.3 ! root 38: jge memory_ok
1.1 root 39:
40: ; Insufficient memory
41: mov ax, TC_BOOT_LOADER_LOWMEM_SEGMENT
42: mov es, ax
1.1.1.3 ! root 43: memory_ok:
1.1 root 44:
1.1.1.3 ! root 45: ; Clear BSS section
1.1 root 46: xor al, al
1.1.1.3 ! root 47: mov di, TC_COM_EXECUTABLE_OFFSET
! 48: mov cx, TC_BOOT_MEMORY_REQUIRED * 1024 - TC_COM_EXECUTABLE_OFFSET - 1
1.1.1.2 root 49: cld
1.1 root 50: rep stosb
51:
1.1.1.3 ! root 52: mov ax, es
! 53: sub ax, TC_BOOT_LOADER_DECOMPRESSOR_MEMORY_SIZE / 16 ; Decompressor segment
! 54: mov es, ax
! 55:
! 56: ; Load decompressor
! 57: mov cl, TC_BOOT_LOADER_DECOMPRESSOR_START_SECTOR
! 58: retry_backup:
! 59: mov al, TC_BOOT_LOADER_DECOMPRESSOR_SECTOR_COUNT
! 60: mov bx, TC_COM_EXECUTABLE_OFFSET
! 61: call read_sectors
! 62:
! 63: ; Decompressor checksum
! 64: xor ebx, ebx
! 65: mov si, TC_COM_EXECUTABLE_OFFSET
! 66: mov cx, TC_BOOT_LOADER_DECOMPRESSOR_SECTOR_COUNT * TC_LB_SIZE
! 67: call checksum
! 68: push ebx
! 69:
! 70: ; Load compressed boot loader
! 71: mov bx, TC_BOOT_LOADER_COMPRESSED_BUFFER_OFFSET
! 72: mov cl, TC_BOOT_LOADER_START_SECTOR
! 73: mov al, TC_MAX_BOOT_LOADER_SECTOR_COUNT
! 74:
! 75: test backup_loader_used, 1
! 76: jz non_backup
! 77: mov al, TC_BOOT_LOADER_BACKUP_SECTOR_COUNT - TC_BOOT_LOADER_DECOMPRESSOR_SECTOR_COUNT
! 78: mov cl, TC_BOOT_LOADER_START_SECTOR + TC_BOOT_LOADER_BACKUP_SECTOR_COUNT
! 79:
! 80: non_backup:
! 81: call read_sectors
! 82:
! 83: ; Boot loader checksum
! 84: pop ebx
! 85: mov si, TC_BOOT_LOADER_COMPRESSED_BUFFER_OFFSET
! 86: mov cx, word ptr [start + TC_BOOT_SECTOR_LOADER_LENGTH_OFFSET]
! 87: call checksum
! 88:
! 89: ; Verify checksum
! 90: cmp ebx, dword ptr [start + TC_BOOT_SECTOR_LOADER_CHECKSUM_OFFSET]
! 91: je checksum_ok
! 92:
! 93: ; Checksum incorrect - try using backup if available
! 94: test backup_loader_used, 1
! 95: jnz loader_damaged
! 96:
! 97: mov backup_loader_used, 1
! 98: mov cl, TC_BOOT_LOADER_DECOMPRESSOR_START_SECTOR + TC_BOOT_LOADER_BACKUP_SECTOR_COUNT
1.1 root 99:
1.1.1.3 ! root 100: test TC_BOOT_CFG_FLAG_BACKUP_LOADER_AVAILABLE, byte ptr [start + TC_BOOT_SECTOR_CONFIG_OFFSET]
! 101: jnz retry_backup
! 102:
! 103: loader_damaged:
! 104: lea si, loader_damaged_msg
! 105: call print
! 106: lea si, loader_name_msg
! 107: call print
! 108: lea si, beep_msg
1.1 root 109: call print
110: jmp $
1.1.1.3 ! root 111: checksum_ok:
! 112:
! 113: ; Set up decompressor segment
! 114: mov ax, es
! 115: mov ds, ax
! 116: cli
! 117: mov ss, ax
! 118: mov sp, TC_BOOT_LOADER_DECOMPRESSOR_MEMORY_SIZE
! 119: sti
1.1 root 120:
1.1.1.3 ! root 121: push dx
! 122:
! 123: ; Decompress boot loader
! 124: push TC_BOOT_LOADER_COMPRESSED_BUFFER_OFFSET + TC_GZIP_HEADER_SIZE ; Compressed data
! 125: push TC_MAX_BOOT_LOADER_DECOMPRESSED_SIZE ; Output buffer size
! 126: push TC_BOOT_LOADER_DECOMPRESSOR_MEMORY_SIZE + TC_COM_EXECUTABLE_OFFSET ; Output buffer
! 127:
! 128: mov word ptr [cs:decompressor_seg], es
! 129: db 9Ah ; call [decompressor_seg]:TC_COM_EXECUTABLE_OFFSET
! 130: dw TC_COM_EXECUTABLE_OFFSET
! 131: decompressor_seg:
! 132: dw 0
! 133:
! 134: add sp, 6
! 135: pop dx
! 136:
! 137: ; Restore boot sector segment
! 138: mov bx, cs
! 139: mov ds, bx
! 140:
! 141: ; Check decompression result
! 142: test ax, ax
! 143: jz decompression_ok
! 144:
! 145: lea si, decompression_err_msg
! 146: call print
! 147: jmp $
! 148: decompression_ok:
1.1 root 149:
150: ; DH = boot sector flags
151: mov dh, byte ptr [start + TC_BOOT_SECTOR_CONFIG_OFFSET]
152:
1.1.1.3 ! root 153: ; Set up boot loader segment
1.1 root 154: mov ax, es
1.1.1.3 ! root 155: add ax, TC_BOOT_LOADER_DECOMPRESSOR_MEMORY_SIZE / 16
! 156: mov es, ax
1.1 root 157: mov ds, ax
158: cli
159: mov ss, ax
1.1.1.3 ! root 160: mov sp, TC_BOOT_LOADER_STACK_TOP
1.1 root 161: sti
162:
1.1.1.3 ! root 163: ; Execute boot loader
! 164: push es
! 165: push TC_COM_EXECUTABLE_OFFSET
! 166: retf
! 167:
1.1 root 168: ; Print string
169: print:
170: xor bx, bx
171: mov ah, 0eh
1.1.1.3 ! root 172: cld
1.1 root 173:
174: @@: lodsb
175: test al, al
176: jz print_end
177:
178: int 10h
179: jmp @B
180:
181: print_end:
182: ret
1.1.1.3 ! root 183:
! 184: ; Read sectors of the first cylinder
! 185: read_sectors:
! 186: mov ch, 0 ; Cylinder
! 187: mov dh, 0 ; Head
! 188: ; DL = drive number passed from BIOS
! 189: mov ah, 2
! 190: int 13h
! 191: jnc read_ok
! 192:
! 193: lea si, disk_error_msg
! 194: call print
! 195: read_ok:
! 196: ret
! 197:
! 198: ; Calculate checksum
! 199: checksum:
! 200: push ds
! 201: push es
! 202: pop ds
! 203: xor eax, eax
! 204: cld
! 205:
! 206: @@: lodsb
! 207: add ebx, eax
! 208: rol ebx, 1
! 209: loop @B
! 210:
! 211: pop ds
! 212: ret
! 213:
! 214: backup_loader_used db 0
1.1 root 215:
1.1.1.3 ! root 216: beep_msg db 7, 0
! 217: disk_error_msg db 'Disk error', 13, 10, 7, 0
! 218: loader_damaged_msg db 'Loader damaged! Use Rescue Disk: Repair Options > Restore', 0
! 219: decompression_err_msg db 'Decompression error', 7, 0
1.1 root 220:
1.1.1.3 ! root 221: ORG 7C00h + 508
1.1 root 222: dw 0, 0AA55h ; Boot sector signature
223:
224: _TEXT ENDS
225: END start
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.