OSDN Git Service

Fix bugs of confirmation of erasing host settings.
[ffftp/ffftp.git] / protectprocess.c
index f118ae9..a37fab2 100644 (file)
@@ -1,20 +1,20 @@
-// protectprocess.c\r
+// protectprocess.c\r
 // Copyright (C) 2011 Suguru Kawamoto\r
-// \83v\83\8d\83Z\83X\82Ì\95Û\8cì\r
+// プロセスの保護\r
 \r
-// \8e\9f\82Ì\92\86\82©\82ç1\8cÂ\82Ì\82Ý\97L\8cø\82É\82·\82é\r
-// \83t\83b\83N\90æ\82Ì\8aÖ\90\94\82Ì\83R\81[\83h\82ð\8f\91\82«\8a·\82¦\82é\r
-// \91S\82Ä\82Ì\8cÄ\82Ñ\8fo\82µ\82ð\83t\83b\83N\89Â\94\\82¾\82ª\8c´\97\9d\93I\82É\93ñ\8fd\8cÄ\82Ñ\8fo\82µ\82É\91Î\89\9e\82Å\82«\82È\82¢\r
+// 次の中から1個のみ有効にする\r
+// フック先の関数のコードを書き換える\r
+// 全ての呼び出しをフック可能だが原理的に二重呼び出しに対応できない\r
 #define USE_CODE_HOOK\r
-// \83t\83b\83N\90æ\82Ì\8aÖ\90\94\82Ì\83C\83\93\83|\81[\83g\83A\83h\83\8c\83X\83e\81[\83u\83\8b\82ð\8f\91\82«\8a·\82¦\82é\r
-// \93ñ\8fd\8cÄ\82Ñ\8fo\82µ\82ª\89Â\94\\82¾\82ª\8cÄ\82Ñ\8fo\82µ\95û\96@\82É\82æ\82Á\82Ä\82Í\83t\83b\83N\82ð\89ñ\94ð\82³\82ê\82é\r
+// フック先の関数のインポートアドレステーブルを書き換える\r
+// 二重呼び出しが可能だが呼び出し方法によってはフックを回避される\r
 //#define USE_IAT_HOOK\r
 \r
-// \83t\83b\83N\91Î\8fÛ\82Ì\8aÖ\90\94\96¼ %s\r
-// \83t\83b\83N\91Î\8fÛ\82Ì\8c^ _%s\r
-// \83t\83b\83N\91Î\8fÛ\82Ì\83|\83C\83\93\83^ p_%s\r
-// \83t\83b\83N\97p\82Ì\8aÖ\90\94\96¼ h_%s\r
-// \83t\83b\83N\91Î\8fÛ\82Ì\83R\81[\83h\82Ì\83o\83b\83N\83A\83b\83v c_%s\r
+// フック対象の関数名 %s\r
+// フック対象の型 _%s\r
+// フック対象のポインタ p_%s\r
+// フック用の関数名 h_%s\r
+// フック対象のコードのバックアップ c_%s\r
 \r
 #include <tchar.h>\r
 #include <windows.h>\r
@@ -61,20 +61,20 @@ BOOL VerifyFileSignatureInCatalog(LPCWSTR Catalog, LPCWSTR Filename);
 BOOL GetSHA1HashOfModule(LPCWSTR Filename, void* pHash);\r
 BOOL IsModuleTrusted(LPCWSTR Filename);\r
 \r
-// \95Ï\90\94\82Ì\90é\8c¾\r
+// 変数の宣言\r
 #ifdef USE_CODE_HOOK\r
 #define HOOK_FUNCTION_VAR(name) _##name p_##name;BYTE c_##name[HOOK_JUMP_CODE_LENGTH * 2];\r
 #endif\r
 #ifdef USE_IAT_HOOK\r
 #define HOOK_FUNCTION_VAR(name) _##name p_##name;\r
 #endif\r
-// \8aÖ\90\94\83|\83C\83\93\83^\82ð\8eæ\93¾\r
+// 関数ポインタを取得\r
 #define GET_FUNCTION(h, name) p_##name = (_##name)GetProcAddress(h, #name)\r
-// \83t\83b\83N\91Î\8fÛ\82Ì\83R\81[\83h\82ð\92u\8a·\82µ\82Ä\83t\83b\83N\82ð\8aJ\8en\r
+// フック対象のコードを置換してフックを開始\r
 #define SET_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, &c_##name, FALSE)\r
-// \83t\83b\83N\91Î\8fÛ\82ð\8cÄ\82Ñ\8fo\82·\91O\82É\91Î\8fÛ\82Ì\83R\81[\83h\82ð\95\9c\8c³\r
+// フック対象を呼び出す前に対象のコードを復元\r
 #define START_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, &c_##name, TRUE)\r
-// \83t\83b\83N\91Î\8fÛ\82ð\8cÄ\82Ñ\8fo\82µ\82½\8cã\82É\91Î\8fÛ\82Ì\83R\81[\83h\82ð\92u\8a·\r
+// フック対象を呼び出した後に対象のコードを置換\r
 #define END_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, NULL, FALSE)\r
 \r
 HOOK_FUNCTION_VAR(LoadLibraryA)\r
@@ -101,8 +101,8 @@ DWORD g_LockedThread[MAX_LOCKED_THREAD];
 WCHAR* g_pTrustedFilenameTable[MAX_TRUSTED_FILENAME_TABLE];\r
 BYTE g_TrustedMD5HashTable[MAX_TRUSTED_MD5_HASH_TABLE][20];\r
 \r
-// \88È\89º\83t\83b\83N\8aÖ\90\94\r
-// \83t\83b\83N\91Î\8fÛ\82ð\8cÄ\82Ñ\8fo\82·\8fê\8d\87\82Í\91O\8cã\82ÅSTART_HOOK_FUNCTION\82ÆEND_HOOK_FUNCTION\82ð\8eÀ\8ds\82·\82é\95K\97v\82ª\82 \82é\r
+// 以下フック関数\r
+// フック対象を呼び出す場合は前後でSTART_HOOK_FUNCTIONとEND_HOOK_FUNCTIONを実行する必要がある\r
 \r
 HMODULE WINAPI h_LoadLibraryA(LPCSTR lpLibFileName)\r
 {\r
@@ -189,7 +189,7 @@ HMODULE WINAPI h_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFla
        return r;\r
 }\r
 \r
-// \88È\89º\83w\83\8b\83p\81[\8aÖ\90\94\r
+// 以下ヘルパー関数\r
 \r
 BOOL LockThreadLock()\r
 {\r
@@ -356,7 +356,7 @@ BOOL HookFunctionInIAT(void* pOriginal, void* pNew)
 }\r
 #endif\r
 \r
-// \83t\83@\83C\83\8b\82ð\95Ï\8dX\95s\94\\82É\90Ý\92è\r
+// ファイルを変更不能に設定\r
 HANDLE LockExistingFile(LPCWSTR Filename)\r
 {\r
        HANDLE hResult;\r
@@ -366,7 +366,7 @@ HANDLE LockExistingFile(LPCWSTR Filename)
        return hResult;\r
 }\r
 \r
-// DLL\82Ì\83n\83b\83V\83\85\82ð\8c\9f\8dõ\r
+// DLLのハッシュを検索\r
 BOOL FindTrustedModuleSHA1Hash(void* pHash)\r
 {\r
        BOOL bResult;\r
@@ -431,7 +431,7 @@ BOOL VerifyFileSignature_Function(LPCWSTR Filename)
        return bResult;\r
 }\r
 \r
-// \83t\83@\83C\83\8b\82Ì\8f\90\96¼\82ð\8am\94F\r
+// ファイルの署名を確認\r
 BOOL VerifyFileSignature(LPCWSTR Filename)\r
 {\r
        BOOL bResult;\r
@@ -454,7 +454,7 @@ BOOL VerifyFileSignature(LPCWSTR Filename)
        return bResult;\r
 }\r
 \r
-// \83t\83@\83C\83\8b\82Ì\8f\90\96¼\82ð\83J\83^\83\8d\83O\83t\83@\83C\83\8b\82Å\8am\94F\r
+// ファイルの署名をカタログファイルで確認\r
 BOOL VerifyFileSignatureInCatalog(LPCWSTR Catalog, LPCWSTR Filename)\r
 {\r
        BOOL bResult;\r
@@ -496,8 +496,8 @@ BOOL WINAPI GetSHA1HashOfModule_Function(DIGEST_HANDLE refdata, PBYTE pData, DWO
        return CryptHashData(*(HCRYPTHASH*)refdata, pData, dwLength, 0);\r
 }\r
 \r
-// \83\82\83W\83\85\81[\83\8b\82ÌSHA1\83n\83b\83V\83\85\82ð\8eæ\93¾\r
-// \83}\83j\83t\83F\83X\83g\83t\83@\83C\83\8b\82Ìfile\97v\91f\82Ìhash\91®\90«\82Í\8eÀ\8ds\89Â\94\\83t\83@\83C\83\8b\82Ì\8fê\8d\87\82ÉImageGetDigestStream\82Å\8eZ\8fo\82³\82ê\82é\r
+// モジュールのSHA1ハッシュを取得\r
+// マニフェストファイルのfile要素のhash属性は実行可能ファイルの場合にImageGetDigestStreamで算出される\r
 BOOL GetSHA1HashOfModule(LPCWSTR Filename, void* pHash)\r
 {\r
        BOOL bResult;\r
@@ -581,14 +581,14 @@ BOOL IsSxsModuleTrusted_Function(LPCWSTR Catalog, LPCWSTR Manifest, LPCWSTR Modu
        return bResult;\r
 }\r
 \r
-// \83T\83C\83h\83o\83C\83T\83C\83hDLL\82ð\8am\94F\r
-// \83p\83X\82Í"%SystemRoot%\WinSxS"\88È\89º\82ð\91z\92è\r
-// \88È\89º\82Ì\83t\83@\83C\83\8b\82ª\91\8dÝ\82·\82é\82à\82Ì\82Æ\82·\82é\r
-// "\xxx\yyy.dll"\81A"\manifests\xxx.cat"\81A"\manifests\xxx.manifest"\82Ì\83Z\83b\83g\81iXP\82Ì\91S\82Ä\82ÌDLL\81AVista\88È\8d~\82Ì\88ê\95\94\82ÌDLL\81j\r
-// "\xxx\yyy.dll"\81A"\catalogs\zzz.cat"\81A"\manifests\xxx.manifest"\82Ì\83Z\83b\83g\81iVista\88È\8d~\82Ì\82Ù\82Æ\82ñ\82Ç\82ÌDLL\81j\r
-// \8f\90\96¼\82³\82ê\82½\83J\83^\83\8d\83O\83t\83@\83C\83\8b\82ð\97p\82¢\82Ä\83}\83j\83t\83F\83X\83g\83t\83@\83C\83\8b\82ª\89üâ\82\82³\82ê\82Ä\82¢\82È\82¢\82±\82Æ\82ð\8am\94F\r
-// \83n\83b\83V\83\85\92l\82Í        \83}\83j\83t\83F\83X\83g\83t\83@\83C\83\8b\82Ìfile\97v\91f\82Ìhash\91®\90«\82É\8bL\8fq\82³\82ê\82Ä\82¢\82é\82à\82Ì\82ð\97p\82¢\82é\r
-// \83}\83j\83t\83F\83X\83g\83t\83@\83C\83\8b\93à\82ÉSHA1\83n\83b\83V\83\85\92l\82Ì16\90i\90\94\95\\8bL\82ð\92¼\90Ú\8c\9f\8dõ\82µ\82Ä\82¢\82é\82ª\8am\97¦\93I\82É\96â\91è\82È\82µ\r
+// サイドバイサイドDLLを確認\r
+// パスは"%SystemRoot%\WinSxS"以下を想定\r
+// 以下のファイルが存在するものとする\r
+// "\xxx\yyy.dll"、"\manifests\xxx.cat"、"\manifests\xxx.manifest"のセット(XPの全てのDLL、Vista以降の一部のDLL)\r
+// "\xxx\yyy.dll"、"\catalogs\zzz.cat"、"\manifests\xxx.manifest"のセット(Vista以降のほとんどのDLL)\r
+// 署名されたカタログファイルを用いてマニフェストファイルが改竄されていないことを確認\r
+// ハッシュ値は  マニフェストファイルのfile要素のhash属性に記述されているものを用いる\r
+// マニフェストファイル内にSHA1ハッシュ値の16進数表記を直接検索しているが確率的に問題なし\r
 BOOL IsSxsModuleTrusted(LPCWSTR Filename)\r
 {\r
        BOOL bResult;\r
@@ -679,7 +679,7 @@ BOOL IsSxsModuleTrusted(LPCWSTR Filename)
        return bResult;\r
 }\r
 \r
-// DLL\82ð\8am\94F\r
+// DLLを確認\r
 BOOL IsModuleTrusted(LPCWSTR Filename)\r
 {\r
        BOOL bResult;\r
@@ -712,11 +712,11 @@ BOOL IsModuleTrusted(LPCWSTR Filename)
        return bResult;\r
 }\r
 \r
-// kernel32.dll\82ÌLoadLibraryExW\91\8a\93\96\82Ì\8aÖ\90\94\r
-// \83h\83L\83\85\83\81\83\93\83g\82ª\96³\82¢\82½\82ß\8fÚ\8d×\82Í\95s\96¾\r
-// \88ê\95\94\82Ì\83E\83B\83\8b\83X\91Î\8dô\83\\83t\83g\81iAvast!\93\99\81j\82ªLdrLoadDll\82ð\83t\83b\83N\82µ\82Ä\82¢\82é\82½\82ßLdrLoadDll\82ð\8f\91\82«\8a·\82¦\82é\82×\82«\82Å\82Í\82È\82¢\r
-// \83J\81[\83l\83\8b\83\82\81[\83h\82Ì\83R\81[\83h\82É\91Î\82µ\82Ä\82Í\8cø\89Ê\82È\82µ\r
-// SeDebugPrivilege\82ª\8eg\97p\89Â\94\\82È\83\86\81[\83U\81[\82É\91Î\82µ\82Ä\82Í\8cø\89Ê\82È\82µ\r
+// kernel32.dllのLoadLibraryExW相当の関数\r
+// ドキュメントが無いため詳細は不明\r
+// 一部のウィルス対策ソフト(Avast!等)がLdrLoadDllをフックしているためLdrLoadDllを書き換えるべきではない\r
+// カーネルモードのコードに対しては効果なし\r
+// SeDebugPrivilegeが使用可能なユーザーに対しては効果なし\r
 HMODULE System_LoadLibrary(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)\r
 {\r
        HMODULE r = NULL;\r
@@ -792,7 +792,7 @@ void SetProcessProtectionLevel(DWORD Level)
        g_ProcessProtectionLevel = Level;\r
 }\r
 \r
-// \83t\83@\83C\83\8b\82ÌSHA1\83n\83b\83V\83\85\82ð\8eæ\93¾\r
+// ファイルのSHA1ハッシュを取得\r
 BOOL GetSHA1HashOfFile(LPCWSTR Filename, void* pHash)\r
 {\r
        BOOL bResult;\r
@@ -834,7 +834,7 @@ BOOL GetSHA1HashOfFile(LPCWSTR Filename, void* pHash)
        return bResult;\r
 }\r
 \r
-// DLL\82Ì\83n\83b\83V\83\85\82ð\93o\98^\r
+// DLLのハッシュを登録\r
 BOOL RegisterTrustedModuleSHA1Hash(void* pHash)\r
 {\r
        BOOL bResult;\r
@@ -860,7 +860,7 @@ BOOL RegisterTrustedModuleSHA1Hash(void* pHash)
        return bResult;\r
 }\r
 \r
-// DLL\82Ì\83n\83b\83V\83\85\82Ì\93o\98^\82ð\89ð\8f\9c\r
+// DLLのハッシュの登録を解除\r
 BOOL UnregisterTrustedModuleSHA1Hash(void* pHash)\r
 {\r
        BOOL bResult;\r
@@ -881,7 +881,7 @@ BOOL UnregisterTrustedModuleSHA1Hash(void* pHash)
        return bResult;\r
 }\r
 \r
-// \90M\97\8a\82Å\82«\82È\82¢DLL\82ð\83A\83\93\83\8d\81[\83h\r
+// 信頼できないDLLをアンロード\r
 BOOL UnloadUntrustedModule()\r
 {\r
        BOOL bResult;\r
@@ -946,7 +946,7 @@ BOOL UnloadUntrustedModule()
        return bResult;\r
 }\r
 \r
-// \8aÖ\90\94\83|\83C\83\93\83^\82ð\8eg\97p\89Â\94\\82È\8fó\91Ô\82É\8f\89\8aú\89»\r
+// 関数ポインタを使用可能な状態に初期化\r
 BOOL InitializeLoadLibraryHook()\r
 {\r
        BOOL bResult;\r
@@ -977,8 +977,8 @@ BOOL InitializeLoadLibraryHook()
        return bResult;\r
 }\r
 \r
-// SetWindowsHookEx\91Î\8dô\r
-// DLL Injection\82³\82ê\82½\8fê\8d\87\82Í\8fã\82Ìh_LoadLibrary\8cn\8aÖ\90\94\82Å\83g\83\89\83b\83v\89Â\94\\r
+// SetWindowsHookEx対策\r
+// DLL Injectionされた場合は上のh_LoadLibrary系関数でトラップ可能\r
 BOOL EnableLoadLibraryHook(BOOL bEnable)\r
 {\r
        BOOL bResult;\r
@@ -1034,8 +1034,8 @@ BOOL EnableLoadLibraryHook(BOOL bEnable)
        return bResult;\r
 }\r
 \r
-// ReadProcessMemory\81AWriteProcessMemory\81ACreateRemoteThread\91Î\8dô\r
-// TerminateProcess\82Ì\82Ý\8b\96\89Â\r
+// ReadProcessMemory、WriteProcessMemory、CreateRemoteThread対策\r
+// TerminateProcessのみ許可\r
 BOOL RestartProtectedProcess(LPCTSTR Keyword)\r
 {\r
        BOOL bResult;\r