最近に限ったことではないんですが、家でだらだら過ごしていると「気がついたら一時間経ってた!」なんてことが結構あります。現在時刻を定期的に通知したら少しは改善されるかな?とツールを探してみたら、ありました。
で、早速導入したんですが、
右クリックメニューの[時報]にチェックしておくと、毎時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 の使い方を結構忘れてたので、結構余計な時間を食った気が。
ちなみになんで作者の方に機能要望を出すのでなくバイナリをいじることにしたかというと、作者の方のブログ
経由で、このツールを作っているときの動画が公開されていて。この動画にあてられて「自分もたまには日曜ハッキングせねばなぁ」と思ってついやってしまったのでした。しかしこのひとはマルチな方で羨ましいなぁ・・・。