miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

Hatsune-Clock の時報感覚を調整してみた

最近に限ったことではないんですが、家でだらだら過ごしていると「気がついたら一時間経ってた!」なんてことが結構あります。現在時刻を定期的に通知したら少しは改善されるかな?とツールを探してみたら、ありました。

で、早速導入したんですが、

右クリックメニューの[時報]にチェックしておくと、毎時0分と30分に『ぴんぽんぱんぽーん』という合図とともに自動で時刻を読み上げてくれるようになる。

とのことで、30 分間隔にしか通知してくれないそうで。もう少し頻繁に通知してほしかったので、hatsune_clock.exe のバイナリをいじってみました。

変更点

もともとの処理が、

00455B49   . 0FB74424 02          MOVZX EAX,WORD PTR SS:[ESP+2]                   ; [ESP+2] に現在時刻の分が入ってる
00455B4E   . 66:3B83 A0030000     CMP AX,WORD PTR DS:[EBX+3A0]                    ; 何かの判定(不明)
00455B55     74 72                JE SHORT hatsune_.00455BC9
00455B57     66:837C24 02 00      CMP WORD PTR SS:[ESP+2],0                       ; 分が 0 だったら次の判定に
00455B5D     74 08                JE SHORT hatsune_.00455B67
00455B5F     66:837C24 02 1E      CMP WORD PTR SS:[ESP+2],1E                      ; 分が 0x1E(30) だったら判定終了
00455B65     75 4B                JNZ SHORT hatsune_.00455BB2
00455B67   > 80BB 88030000 00     CMP BYTE PTR DS:[EBX+388],0                     ; 何かの判定が続く(不明)
00455B6E   . 75 42                JNZ SHORT hatsune_.00455BB2
00455B70   . C683 88030000 01     MOV BYTE PTR DS:[EBX+388],1
00455B77   . B2 01                MOV DL,1
00455B79   . 8B83 7C030000        MOV EAX,DWORD PTR DS:[EBX+37C]
00455B7F   . E8 181AFEFF          CALL hatsune_.0043759C

こんな感じ。0 と 30 で判定してるので、剰余で判定するように変えてやれば、10 分ごとに通知したりもできそうですね。

とりあえずこうしてみました。

-00455B57     66:837C24 02 00      CMP WORD PTR SS:[ESP+2],0                       ; 分が 0 だったら次の判定に
-00455B5D     74 08                JE SHORT hatsune_.00455B67
-00455B5F     66:837C24 02 1E      CMP WORD PTR SS:[ESP+2],1E                      ; 分が 0x1E(30) だったら判定終了
+00455B57     50                   PUSH EAX
+00455B58     53                   PUSH EBX
+00455B59     B3 02                MOV BL,2                                        ; テスト用に 2 分間隔にしておく
+00455B5B     F6F3                 DIV BL
+00455B5D     80FC 00              CMP AH,0
+00455B60     5B                   POP EBX
+00455B61     58                   POP EAX
+00455B62     90                   NOP
+00455B63     90                   NOP
+00455B64     90                   NOP
00455B65     75 4B                JNZ SHORT hatsune_.00455BB2

分は [ESP+2] に入ってますが、前の処理で EAX に入れてくれてたので、これをそのまま使ってます。
はじめ DIV EBX みたいに書いてたんですが、こうすると EDX の初期化なりで容量食って収まりきらなくなったので、DIV BL に変えてます。いちおう EAX と EBX は後で使ってるみたいなので元に戻すようにしています。

アセンブラって理屈はわかるけど行儀のいい書き方はできない状態なので、何かツッコミあればお願いします・・・。

自分で適用したい場合は・・・

バイナリエディタ

66 83 7C 24 02 00 74 08 66 83 7C 24 02 1E

の部分を

50 53 B3 02 F6 F3 80 FC 00 5B 58 90 90 90

に置換すればいけるんじゃないかと。

通知の間隔を調整するには 4 バイト目を適当にいじってください。10 分間隔なら 0A にするとか。

感想とか

タイマー処理だから user32.SetTimer 使ってるんでしょ、とそこからあたりをつけようとしたんだけど、Delphi の TTimer とか使ってるみたいで、そのエントリポイント探すのに苦労しました。あと OllyDbg の使い方を結構忘れてたので、結構余計な時間を食った気が。

ちなみになんで作者の方に機能要望を出すのでなくバイナリをいじることにしたかというと、作者の方のブログ

経由で、このツールを作っているときの動画が公開されていて。この動画にあてられて「自分もたまには日曜ハッキングせねばなぁ」と思ってついやってしまったのでした。しかしこのひとはマルチな方で羨ましいなぁ・・・。