Petyaのドクロのコードが見たい

いよいよMBRの中のコードを覗いてみる…。
のだけどどうやって???

IDA proってツールを使います。
ベルギーのhex-raysって会社が出しているdisassembler。
フリーウェア版でも十分使える。
ライセンス版は2000ドル(!)くらいするのだが、x64も読めちゃう。
supports more than 50 processor families なんて書いてあるが、世の中にはそんなにプロセッサの種類あるんだね草。
よりマニアックなcpu instructionが見たいぜ!!という諸兄には必携かと。
https://www.hex-rays.com/products/ida/support/download_freeware.shtml

保存したpetya.imgの拡張子を.comに変えてから読み込むと捗る。
アセンブラの命令を一個一個解説していくことは困難なためさわりだけでオナシャス。。

bochsでステップ実行しながら、表示を比較していくとよい。
http://bochs.sourceforge.net/doc/docbook/user/internal-debugger.html


以下のコードで一文字づつ画面に書き込み。
https://en.wikipedia.org/wiki/INT_10H
によると、、Teletype output てので出力してるみたいだね。

seg000:4C26             WRITE_CHAR_ANDADVANCE_CURSOR proc near  ; CODE XREF: WRITE_CHAR_ANDADVANCE_CURSOR_0+E p
seg000:4C26                                                     ; sub_14C54+57 p ...
seg000:4C26
seg000:4C26             arg_0           = byte ptr  4
seg000:4C26
seg000:4C26 55                          push    bp
seg000:4C27 8B EC                       mov     bp, sp
seg000:4C29 BB 07 00                    mov     bx, 7           ;
seg000:4C2C 8A 46 04                    mov     al, [bp+arg_0]
seg000:4C2F B4 0E                       mov     ah, 0Eh
seg000:4C31 CD 10                       int     10h             ; - VIDEO - WRITE CHARACTER AND ADVANCE CURSOR (TTY WRITE)
seg000:4C31                                                     ; AL = character, BH = display page (alpha modes)
seg000:4C31                                                     ; BL = foreground color (graphics modes)
seg000:4C31                                                     ;
seg000:4C31                                                     ; Teletype output     AH=0Eh  AL = Character, BH = Page Number, BL = Color (only in graphic mode)
seg000:4C33 C9                          leave
seg000:4C34 C3                          retn
seg000:4C34             WRITE_CHAR_ANDADVANCE_CURSOR endp


IDAは";"でコメントを書き込むことができる。
uu$$$$$$$$$$$uu は筆者が書きこんだコメントね。
ここを通った時に画面出た表示、、、てな感じ。徐々にドクロが描かれていくのねw

あと、関数名も変えてある。元々はcall sub_xxxxxxxxxみたいになってるんだが、
WRITE_CHAR_AND_ADVANCE_CURSORなどなど自分でわかる名前に変更。
sub_xxxxxxxxをクリックして、"n"で名前の変更が可能だ。

seg000:4D7E            DOKURO_WRITE_EACH_LINE proc near        ; CODE XREF: DOKURO_TIKATIKA+26 p
seg000:4D7E
seg000:4D7E            arg_0           = byte ptr  4
seg000:4D7E
seg000:4D7E 55         push    bp
seg000:4D7F 8B EC      mov     bp, sp
seg000:4D81 8A 46 04   mov     al, [bp+arg_0]
seg000:4D84 50         push    ax
seg000:4D85 E8 20 02   call    SET_PAGE_COLOR  ; red page
seg000:4D88 5B         pop     bx
seg000:4D89 6A 20      push    20h
seg000:4D8B 6A 20      push    20h
seg000:4D8D E8 28 FF   call    WRITE_CHAR_ANDADVANCE_CURSOR
seg000:4D90 8B E5      mov     sp, bp
seg000:4D92 68 42 9C   push    9C42h
seg000:4D95 E8 9E FE   call    WRITE_CHAR_ANDADVANCE_CURSOR_0 ; uu$$$$$$$$$$$uu
seg000:4D98 5B         pop     bx
seg000:4D99 6A 1D      push    1Dh
seg000:4D9B 6A 20      push    20h
seg000:4D9D E8 18 FF   call    WRITE_CHAR_ANDADVANCE_CURSOR
seg000:4DA0 8B E5      mov     sp, bp
seg000:4DA2 68 54 9C   push    9C54h
seg000:4DA5 E8 8E FE   call    WRITE_CHAR_ANDADVANCE_CURSOR_0 ; uu$$$$$$$$$$$$$$$$$uu
seg000:4DA8 5B         pop     bx
seg000:4DA9 6A 1C      push    1Ch
seg000:4DAB 6A 20      push    20h
seg000:4DAD E8 08 FF   call    WRITE_CHAR_ANDADVANCE_CURSOR
seg000:4DB0 8B E5      mov     sp, bp
seg000:4DB2 68 6C 9C   push    9C6Ch
seg000:4DB5 E8 7E FE   call    WRITE_CHAR_ANDADVANCE_CURSOR_0 ; u$$$$$$$$$$$$$$$$$$$$$u
seg000:4DB8 5B         pop     bx
seg000:4DB9 6A 1C      push    1Ch
seg000:4DBB 6A 20      push    20h
seg000:4DBD E8 F8 FE   call    WRITE_CHAR_ANDADVANCE_CURSOR
seg000:4DBD                                    ; CODE XREF: seg000:434B2C j
seg000:4DC0 8B E5      mov     sp, bp
seg000:4DC2 68 86 9C   push    9C86h
seg000:4DC5 E8 6E FE   call    WRITE_CHAR_ANDADVANCE_CURSOR_0 ; u$$$$$$$$$$$$$$$$$$$$$$$u

矢印のとこで画面の色を設定しておる。
F4-->4F-->F4-->4F...で交互に表示してチカチカを表現してるんですな。。。
テキスト表記のみだとちょいとわかりにくいかもだが、この部分はループになっていて、
call keyboard_CHK_BUFFERのとこで何かキーボードが押されるまではloc_14D45を繰り返している。
思い出してみてほしい。bochsで走らせたとき、ドクロチカチカは何か押すまでチカチカし続けていることに…!!
ここのところでそれを表現してたのね。へーへー。

seg000:4D38               DOKURO_TIKATIKA proc near               ; CODE XREF: sub_14A8E+6 p
seg000:4D38
seg000:4D38               var_1           = byte ptr -1
seg000:4D38
seg000:4D38 C8 04 00 00                   enter   4, 0
seg000:4D3C 56                            push    si
seg000:4D3D 33 F6                         xor     si, si
seg000:4D3F C6 46 FF 00                   mov     [bp+var_1], 0   ; CODE XREF: seg000:4D4D0D j
seg000:4D43 EB 28                         jmp     short loc_14D6D
seg000:4D45               ; ---------------------------------------------------------------------------
seg000:4D45
seg000:4D45               loc_14D45:                              ; CODE XREF: DOKURO_TIKATIKA+3A j
seg000:4D45 E8 64 03                      call    GET_TIME_OF_DAY
seg000:4D48 8D 4C 01                      lea     cx, [si+1]
seg000:4D4B 3B C1                         cmp     ax, cx
seg000:4D4D 76 1E                         jbe     short loc_14D6D
seg000:4D4F 8B F0                         mov     si, ax
seg000:4D51 80 7E FF 01                   cmp     [bp+var_1], 1
seg000:4D55 75 04                         jnz     short loc_14D5B
seg000:4D57 B0 F4                         mov     al, 0F4h   <-------------------------------
seg000:4D59 EB 02                         jmp     short loc_14D5D
seg000:4D5B               ; ---------------------------------------------------------------------------
seg000:4D5B
seg000:4D5B               loc_14D5B:                              ; CODE XREF: DOKURO_TIKATIKA+1D j
seg000:4D5B B0 4F                         mov     al, 4Fh   <-------------------------------
seg000:4D5D
seg000:4D5D               loc_14D5D:                              ; CODE XREF: DOKURO_TIKATIKA+21 j
seg000:4D5D                                                       ; seg000:454D53 j
seg000:4D5D 50                            push    ax
seg000:4D5E E8 1D 00                      call    DOKURO_WRITE_EACH_LINE ; 0x885e
seg000:4D61 5B                            pop     bx
seg000:4D62 80 7E FF 01                   cmp     [bp+var_1], 1
seg000:4D66 1A C0                         sbb     al, al
seg000:4D68 F6 D8                         neg     al
seg000:4D6A 88 46 FF                      mov     [bp+var_1], al
seg000:4D6D
seg000:4D6D               loc_14D6D:                              ; CODE XREF: DOKURO_TIKATIKA+B j
seg000:4D6D                                                       ; DOKURO_TIKATIKA+15 j
seg000:4D6D E8 82 02                      call    keyboard_CHK_BUFFER
seg000:4D70 0A C0                         or      al, al
seg000:4D72 74 D1                         jz      short loc_14D45

ん??4F,F4で交互に??
つか4F,F4ってなんだい????

そうだね。赤と白だったんだね。
https://en.wikipedia.org/wiki/BIOS_color_attributes

💀:え???じゃあこの色変えたら僕だけのドクロチカチカカラーが楽しめるってこと???
A:いかにも。

実際にやってみた。
書き換えるのはちょうどハイライトしてるあたり、、、


seg000:4D57 B0 F4     mov     al, 0F4h
...
seg000:4D5B B0 4F     mov     al, 4Fh
ここね。


IDAでB0 F4出すのは
Options->General->Number of opcode bytes
を10くらいにしといたらよろし。

さて何色がよろしいか…??
💀:じゃ、じゃあ、ライトブルーで(ハァハァ
A:御意

F4->F9
4F->9F に変えてみた。

…実行!!!





















(おわり)

Comments

Popular posts from this blog

Firmware dumping via SPI

BochsでMBR debugging

BLE sniffing with UbertoothOne