![](https://habrastorage.org/storage2/94b/73e/6e1/94b73e6e1fff45f0a5b1be689c8e0cf6.gif)
explorer.exeプロセスのカスタマイズの隠された可能性に関する記事に触発されて、私は何か面白いことをすることも決めました。
Windowsの秒針を今日に戻しましょう! もちろん、経済の中で最も有用なMODではありませんが、学術およびレクリエーションの目的のために、それはうまくいきます:)
私は時針と分針を正しい方向に置きました。 場合によっては、トレイの時計を半分まで食べなければならない場合があります-少なくとも1分の精度で時間を表示させます...
準備する
アクションのシーケンスは、おおよそ次のようです。
- explorer.exeを調べて、時間のカウント方法を理解する
- クロックを戻すために、ロジックの何かを変更するもの
いくつかの32ビットユーザーモードプロセスのロジックを変更することは難しくありません。多くのデバッガーOllyDbgには長い間知られており、ロシア語でも多くのチュートリアルがあります。 したがって、それにひねりを加えるために、64ビットWindows 7にタスクを実装することが決定されました-私は長い間、2桁の容量を持つプロセスがそこに住んでいるかどうかを知りたいと思っていました...
残念ながら、逆アセンブラレベルでの64ビットの世界での生活はそれほど甘くはありません。デバッグに快適なOllyも、9,999.95ドル以上支払う必要がある便利な迂回路もありません(1万ドルではないことに感謝します-マーケティング担当者彼らは価格をより魅力的にする方法を知っています)。 古い32ビットインジェクターでさえ、64ビットdllの実装に使用することはできません。 どうやら、私のデフォルトの検索エンジンは一生懸命働く必要があります...
はい、静的解析のファンは私を許します。IDAProとは関係がなかったので、ほとんど選択の余地がありませんでした。古いWinDbgが待っていました。
WinDbgを使用する場合、最も価値のある情報源はwindbg.infoリソースです。
explorer.exeを調べる
プロセスに接続し、「 クロック 」という単語に関連するものを探します。
![](https://habrastorage.org/storage2/cf0/833/15d/cf083315de90ae4d167b9aefd4515028.png)
指定された関数のリスト
explorer!CClockCtl::_RecalcCurTime
、目立たない関数
explorer!CClockCtl::_RecalcCurTime
気付くことができます
explorer!CClockCtl::_RecalcCurTime
。 最初のショットはターゲットに合っていますか? 中身を見てみましょう:
![](https://habrastorage.org/storage2/652/120/9e0/6521209e02309763891a025eda36bea7.png)
そうです、関数プロローグのすぐ後にGetLocalTime呼び出しがあります。これは、 ご存じのようにローカルの時刻と日付を返します。 この関数の戻り結果に影響を与えることができる場合、秒針の方向を変更することもできます-この関数にフックを置くだけです。
計画を実施するには、何らかの方法でプロセスexplorer.exeのアドレス空間に入る必要があります。 そして、 CLI DLL-Injectorコマンドラインユーティリティは、これをできるだけ可能に支援します。 32ビットと64ビットをサポートするだけでなく、DLLを2つの方法で実装する方法も知っています。LoadLibraryインジェクションを使用する方法と、WriteProcessMemoryを介してコードを直接記述してから再配置転送を行う方法です。
シンプルで信頼性の高いMinHookライブラリを直接使用して、explorer.exeプロセス内にフックをインストールします。
ライブラリの見た目の単純さの背後には、かなり複雑なケースでも機能する非常に思慮深いロジックが内部にあることに注意してください。 そのため、最初に使用しようとしたPowerful x86 / x64 Mini Hook-Engineライブラリは、GetLocalTime関数の最初の命令が相対的なJMP遷移であるため、アクセス違反につながりました。 この場合、オフセットを再計算する必要があるため、タスクは複雑になります。
実装
ツールを決定しました。 これで、DLLを記述するのが残り、DLL_PROCESS_ATTACHを使用してGetLocalTime関数にフックを設定します。
#include <windows.h> #include "MinHook.h" // libMinHook.dll #pragma comment(lib, "libMinHook.x64.lib") // GetLocalTime static void (WINAPI *GetLocalTime_)(LPSYSTEMTIME lpSystemTime); void WINAPI MyGetLocalTime(LPSYSTEMTIME lpSystemTime) { // GetLocalTime GetLocalTime_(lpSystemTime); // : 59 -> 0, 0 -> 59 lpSystemTime->wSecond = 59 - lpSystemTime->wSecond; } BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: // ! // , DllMain() // libMinHook if (MH_Initialize() != MH_OK) { return FALSE; } // ( ) if (MH_CreateHook(&GetLocalTime, &MyGetLocalTime, reinterpret_cast<void**>(&GetLocalTime_)) != MH_OK) { return FALSE; } // if (MH_EnableHook(&GetLocalTime) != MH_OK) { return FALSE; } } return TRUE; }
受信したdllを使用します
これで、dllを実装できます。 次のコマンドを使用して、コンソールでインジェクターを起動します。
![](https://habrastorage.org/storage2/0ad/73a/b1b/0ad73ab1b8b20ed481820c624d60faa5.png)
--libキーでは、DLLへのフルパスを渡すことが重要です。これが行われる理由の詳細については、 コメントを参照してください。
すべて、あなたは結果を楽しむことができます! (注意、催眠術をかける)
ソース(VS2010のプロジェクト)およびセルフピッキング用のバイナリは、 こちらにあります 。