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 てので出力してるみたいだね。
IDAは";"でコメントを書き込むことができる。
uu$$$$$$$$$$$uu は筆者が書きこんだコメントね。
ここを通った時に画面出た表示、、、てな感じ。徐々にドクロが描かれていくのねw
あと、関数名も変えてある。元々はcall sub_xxxxxxxxxみたいになってるんだが、
WRITE_CHAR_AND_ADVANCE_CURSORなどなど自分でわかる名前に変更。
sub_xxxxxxxxをクリックして、"n"で名前の変更が可能だ。
矢印のとこで画面の色を設定しておる。
F4-->4F-->F4-->4F...で交互に表示してチカチカを表現してるんですな。。。
テキスト表記のみだとちょいとわかりにくいかもだが、この部分はループになっていて、
call keyboard_CHK_BUFFERのとこで何かキーボードが押されるまではloc_14D45を繰り返している。
思い出してみてほしい。bochsで走らせたとき、ドクロチカチカは何か押すまでチカチカし続けていることに…!!
ここのところでそれを表現してたのね。へーへー。
ん??4F,F4で交互に??
つか4F,F4ってなんだい????
そうだね。赤と白だったんだね。
https://en.wikipedia.org/wiki/BIOS_color_attributes
💀:え???じゃあこの色変えたら僕だけのドクロチカチカカラーが楽しめるってこと???
A:いかにも。
実際にやってみた。
書き換えるのはちょうどハイライトしてるあたり、、、
IDAでB0 F4出すのは
Options->General->Number of opcode bytes
を10くらいにしといたらよろし。
さて何色がよろしいか…??
💀:じゃ、じゃあ、ライトブルーで(ハァハァ
A:御意
F4->F9
4F->9F に変えてみた。
…実行!!!
草
(おわり)
のだけどどうやって???
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
Post a Comment