【プログラミング】非表示にして起動する方法を模索
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

【プログラミング】非表示にして起動する方法を模索

2016-07-09 20:12

    困ったことに、タスクスケジューラに登録した実行ファイルが、表示しないにチェックを入れても表示されるという現象が起こりました。

    探せばあると思うけど、せっかくだから非表示にして実行するソフトを自分で作ってみた。(自分で作れるものなら自分で作った方がマルウェアの心配がないよね!)

    今回使用するプログラミング言語はC言語。
    ただしCランタイムヘッダーはほぼ使わずに、Windows APIを使ってみる。
    使用した統合開発環境はVisual Studio Community 2015 。

    stdafx.cpp

    // stdafx.cpp : 標準インクルード hiderun.pch のみを
    // 含むソース ファイルは、プリコンパイル済みヘッダーになります。
    // stdafx.obj にはプリコンパイル済み型情報が含まれます。

    #include "stdafx.h"

    // TODO: このファイルではなく、STDAFX.H で必要な
    // 追加ヘッダーを参照してください。

    stdafx.h

    // stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
    // 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
    // を記述します。
    //

    #pragma once

    #include "targetver.h"

    #define WIN32_LEAN_AND_MEAN // Windows ヘッダーから使用されていない部分を除外します。
    // Windows ヘッダー ファイル:
    #include <Windows.h>

    // C ランタイム ヘッダー ファイル
    //#include <stdlib.h>
    //#include <malloc.h>
    //#include <memory.h>
    #include <tchar.h>

    // TODO: プログラムに必要な追加ヘッダーをここで参照してください

    targetver.h

    #pragma once

    // SDKDDKVer.h をインクルードすると、利用できる最も上位の Windows プラットフォームが定義されます。

    // 以前の Windows プラットフォーム用にアプリケーションをビルドする場合は、WinSDKVer.h をインクルードし、
    // SDKDDKVer.h をインクルードする前に、サポート対象とするプラットフォームを示すように _WIN32_WINNT マクロを設定します。

    #include <winsdkver.h>
    #define _WIN32_WINNT _WIN32_WINNT_WINXP

    #include <SDKDDKVer.h>

    hiderun.cpp

    #include "stdafx.h"

    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
    // 終了コード設定用変数
    int exitCode = -1;

    // CreateProcessに最低限必要な引数は2番目と9番目と10番目
    // 2番目: コマンドライン。実行するコマンドライン文字列。lpCmdLineをそのまま渡す。
    // 9番目: 起動情報。起動時の表示設定などを指定。
    // 10番目: プロセス情報。新しいプロセスの情報を受け取る。

    // 起動情報を設定するための構造体
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    // 起動するプロセスを非表示に設定
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;

    // プロセス情報を受け取るための構造体
    PROCESS_INFORMATION pi;

    if (CreateProcess(NULL, lpCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
    // スレッドハンドルは使用しないのですぐに閉じる
    CloseHandle(pi.hThread);

    // プロセスが終了するまで待つ
    WaitForSingleObject(pi.hProcess, INFINITE);
    // プロセスハンドルを閉じる
    CloseHandle(pi.hProcess);

    // 終了コードを設定
    exitCode = 0;
    }

    // 戻り値を返す
    return exitCode;
    }

    ブロマガの仕様・・・というかバグ臭い挙動のせいで連続する半角スペースはなかったことにされます。&nbsp;を使っても勝手に半角スペースに置き換えられてなかったことにされます。
    ちょっと今は面倒くさいので後でちゃんとスタイルを設定して見えやすいようにします。
    preタグが使えればいいんだが、一応preタグ用のスタイルが設定されているみたいだけれど、<pre>~</pre>の間にある改行を<br>に置き換えたり連続する半角スペースを1つの半角スペースに置き換えたりとpreの中をちゃんと解釈してくれない。

    確かにデザインのためにスペースを使うのはルール違反だし、ブラウザも連続する半角スペースは1個の半角スペースとして表示されるけど、それは表示上の問題であって実データまで勝手にいじることないじゃないか全く・・・。

    閑話休題

    これを使ってWindows Defenderの定義ファイルをコマンドで更新する場合はこんな感じ。

    hiderun.exe "%programfiles%\Windows Defender\MpCmdRun.exe" -SignatureUpdate

    hiderun.exeは後日どこかのアップローダーに上げて公開する予定です。


    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。