OSDN Git Service

Fix bugs of process protection.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Wed, 30 Apr 2014 03:22:40 +0000 (12:22 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Wed, 30 Apr 2014 03:22:40 +0000 (12:22 +0900)
FFFTP_Eng_Release/FFFTP.exe
FFFTP_Eng_Release_64/FFFTP.exe
Release/FFFTP.exe
Release_64/FFFTP.exe
protectprocess.c
socketwrapper.c

index c4697eb..c1a6253 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index 22588e4..c65991a 100644 (file)
Binary files a/FFFTP_Eng_Release_64/FFFTP.exe and b/FFFTP_Eng_Release_64/FFFTP.exe differ
index 08b15db..b5974a5 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index 1dfb5b4..b240825 100644 (file)
Binary files a/Release_64/FFFTP.exe and b/Release_64/FFFTP.exe differ
index af7ce1f..edd3acc 100644 (file)
@@ -26,9 +26,6 @@
 #include <sfc.h>\r
 #include <tlhelp32.h>\r
 #include <imagehlp.h>\r
-#ifdef USE_IAT_HOOK\r
-#include <dbghelp.h>\r
-#endif\r
 \r
 #define DO_NOT_REPLACE\r
 #include "protectprocess.h"\r
 #elif defined(_M_AMD64)\r
 #define HOOK_JUMP_CODE_LENGTH 14\r
 #endif\r
+typedef struct\r
+{\r
+       void* pCode;\r
+       size_t CodeLength;\r
+       BYTE PatchCode[HOOK_JUMP_CODE_LENGTH];\r
+       BYTE BackupCode[HOOK_JUMP_CODE_LENGTH];\r
+} HOOK_JUMP_CODE_PATCH;\r
 #endif\r
 \r
 BOOL LockThreadLock();\r
 BOOL UnlockThreadLock();\r
 #ifdef USE_CODE_HOOK\r
-BOOL HookFunctionInCode(void* pOriginal, void* pNew, void* pBackupCode, BOOL bRestore);\r
+BOOL HookFunctionInCode(void* pOriginal, void* pNew, HOOK_JUMP_CODE_PATCH* pPatch, BOOL bRestore);\r
 #endif\r
 #ifdef USE_IAT_HOOK\r
 BOOL HookFunctionInIAT(void* pOriginal, void* pNew);\r
@@ -63,7 +67,7 @@ BOOL IsModuleTrusted(LPCWSTR Filename);
 \r
 // 変数の宣言\r
 #ifdef USE_CODE_HOOK\r
-#define HOOK_FUNCTION_VAR(name) _##name p_##name;BYTE c_##name[HOOK_JUMP_CODE_LENGTH * 2];\r
+#define HOOK_FUNCTION_VAR(name) _##name p_##name;HOOK_JUMP_CODE_PATCH c_##name;\r
 #endif\r
 #ifdef USE_IAT_HOOK\r
 #define HOOK_FUNCTION_VAR(name) _##name p_##name;\r
@@ -75,7 +79,7 @@ BOOL IsModuleTrusted(LPCWSTR Filename);
 // フック対象を呼び出す前に対象のコードを復元\r
 #define BEGIN_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, &c_##name, TRUE)\r
 // フック対象を呼び出した後に対象のコードを置換\r
-#define END_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, NULL, FALSE)\r
+#define END_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, &c_##name, FALSE)\r
 \r
 HOOK_FUNCTION_VAR(LoadLibraryA)\r
 HOOK_FUNCTION_VAR(LoadLibraryW)\r
@@ -245,63 +249,120 @@ BOOL UnlockThreadLock()
 }\r
 \r
 #ifdef USE_CODE_HOOK\r
-BOOL HookFunctionInCode(void* pOriginal, void* pNew, void* pBackupCode, BOOL bRestore)\r
+BOOL HookFunctionInCode(void* pOriginal, void* pNew, HOOK_JUMP_CODE_PATCH* pPatch, BOOL bRestore)\r
 {\r
        BOOL bResult;\r
        bResult = FALSE;\r
 #if defined(_M_IX86)\r
        {\r
-               BYTE JumpCode[HOOK_JUMP_CODE_LENGTH] = {0xe9, 0x00, 0x00, 0x00, 0x00};\r
-               size_t Relative;\r
                DWORD Protect;\r
-               Relative = (size_t)pNew - (size_t)pOriginal - HOOK_JUMP_CODE_LENGTH;\r
-               memcpy(&JumpCode[1], &Relative, 4);\r
+               BYTE* pCode;\r
+               CHAR c;\r
+               LONG l;\r
+               bResult = FALSE;\r
                if(bRestore)\r
                {\r
-                       if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))\r
+                       if(VirtualProtect(pPatch->pCode, pPatch->CodeLength, PAGE_EXECUTE_READWRITE, &Protect))\r
                        {\r
-                               memcpy(pOriginal, pBackupCode, HOOK_JUMP_CODE_LENGTH);\r
-                               VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);\r
+                               memcpy(pPatch->pCode, &pPatch->BackupCode, pPatch->CodeLength);\r
+                               VirtualProtect(pPatch->pCode, pPatch->CodeLength, Protect, &Protect);\r
                                bResult = TRUE;\r
                        }\r
                }\r
                else\r
                {\r
-                       if(pBackupCode)\r
-                               memcpy(pBackupCode, pOriginal, HOOK_JUMP_CODE_LENGTH);\r
-                       if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))\r
+                       if(!pPatch->pCode)\r
+                       {\r
+                               pCode = (BYTE*)pOriginal;\r
+                               while(pCode[0] == 0xeb)\r
+                               {\r
+                                       memcpy(&c, pCode + 1, 1);\r
+                                       pCode = pCode + 2 + c;\r
+                               }\r
+                               if(pCode[0] == 0xe9)\r
+                               {\r
+                                       pPatch->pCode = pCode + 1;\r
+                                       pPatch->CodeLength = 4;\r
+                                       memcpy(&pPatch->BackupCode, pPatch->pCode, pPatch->CodeLength);\r
+                                       l = (long)pNew - ((long)pCode + 5);\r
+                                       memcpy(&pPatch->PatchCode[0], &l, 4);\r
+                               }\r
+                               else\r
+                               {\r
+                                       pPatch->pCode = pCode;\r
+                                       pPatch->CodeLength = 5;\r
+                                       memcpy(&pPatch->BackupCode, pPatch->pCode, pPatch->CodeLength);\r
+                                       pPatch->PatchCode[0] = 0xe9;\r
+                                       l = (long)pNew - ((long)pCode + 5);\r
+                                       memcpy(&pPatch->PatchCode[1], &l, 4);\r
+                               }\r
+                       }\r
+                       if(VirtualProtect(pPatch->pCode, pPatch->CodeLength, PAGE_EXECUTE_READWRITE, &Protect))\r
                        {\r
-                               memcpy(pOriginal, &JumpCode, HOOK_JUMP_CODE_LENGTH);\r
-                               VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);\r
+                               memcpy(pPatch->pCode, &pPatch->PatchCode, pPatch->CodeLength);\r
+                               VirtualProtect(pPatch->pCode, pPatch->CodeLength, Protect, &Protect);\r
                                bResult = TRUE;\r
                        }\r
                }\r
        }\r
 #elif defined(_M_AMD64)\r
        {\r
-               BYTE JumpCode[HOOK_JUMP_CODE_LENGTH] = {0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\r
-               size_t Absolute;\r
                DWORD Protect;\r
-               Absolute = (size_t)pNew;\r
-               memcpy(&JumpCode[6], &Absolute, 8);\r
+               BYTE* pCode;\r
+               CHAR c;\r
+               LONG l;\r
                bResult = FALSE;\r
                if(bRestore)\r
                {\r
-                       if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))\r
+                       if(VirtualProtect(pPatch->pCode, pPatch->CodeLength, PAGE_EXECUTE_READWRITE, &Protect))\r
                        {\r
-                               memcpy(pOriginal, pBackupCode, HOOK_JUMP_CODE_LENGTH);\r
-                               VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);\r
+                               memcpy(pPatch->pCode, &pPatch->BackupCode, pPatch->CodeLength);\r
+                               VirtualProtect(pPatch->pCode, pPatch->CodeLength, Protect, &Protect);\r
                                bResult = TRUE;\r
                        }\r
                }\r
                else\r
                {\r
-                       if(pBackupCode)\r
-                               memcpy(pBackupCode, pOriginal, HOOK_JUMP_CODE_LENGTH);\r
-                       if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))\r
+                       if(!pPatch->pCode)\r
+                       {\r
+                               pCode = (BYTE*)pOriginal;\r
+                               while(pCode[0] == 0xeb || pCode[0] == 0xe9)\r
+                               {\r
+                                       if(pCode[0] == 0xeb)\r
+                                       {\r
+                                               memcpy(&c, pCode + 1, 1);\r
+                                               pCode = pCode + 2 + c;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               memcpy(&l, pCode + 1, 4);\r
+                                               pCode = pCode + 5 + l;\r
+                                       }\r
+                               }\r
+                               if(pCode[0] == 0xff && pCode[1] == 0x25)\r
+                               {\r
+                                       memcpy(&l, pCode + 2, 4);\r
+                                       pPatch->pCode = pCode + 6 + l;\r
+                                       pPatch->CodeLength = 8;\r
+                                       memcpy(&pPatch->BackupCode, pPatch->pCode, pPatch->CodeLength);\r
+                                       memcpy(&pPatch->PatchCode[0], &pNew, 8);\r
+                               }\r
+                               else\r
+                               {\r
+                                       pPatch->pCode = pCode;\r
+                                       pPatch->CodeLength = 14;\r
+                                       memcpy(&pPatch->BackupCode, pPatch->pCode, pPatch->CodeLength);\r
+                                       pPatch->PatchCode[0] = 0xff;\r
+                                       pPatch->PatchCode[1] = 0x25;\r
+                                       l = 0;\r
+                                       memcpy(&pPatch->PatchCode[2], &l, 4);\r
+                                       memcpy(&pPatch->PatchCode[6], &pNew, 8);\r
+                               }\r
+                       }\r
+                       if(VirtualProtect(pPatch->pCode, pPatch->CodeLength, PAGE_EXECUTE_READWRITE, &Protect))\r
                        {\r
-                               memcpy(pOriginal, &JumpCode, HOOK_JUMP_CODE_LENGTH);\r
-                               VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);\r
+                               memcpy(pPatch->pCode, &pPatch->PatchCode, pPatch->CodeLength);\r
+                               VirtualProtect(pPatch->pCode, pPatch->CodeLength, Protect, &Protect);\r
                                bResult = TRUE;\r
                        }\r
                }\r
@@ -730,8 +791,8 @@ HMODULE System_LoadLibrary(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
        HANDLE hDataFile;\r
        HANDLE hMapping;\r
        DWORD DllFlags;\r
-       us.Length = sizeof(wchar_t) * wcslen(lpLibFileName);\r
-       us.MaximumLength = sizeof(wchar_t) * (wcslen(lpLibFileName) + 1);\r
+       us.Length = sizeof(wchar_t) * (USHORT)wcslen(lpLibFileName);\r
+       us.MaximumLength = sizeof(wchar_t) * ((USHORT)wcslen(lpLibFileName) + 1);\r
        us.Buffer = (PWSTR)lpLibFileName;\r
 //     if(dwFlags & (LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE))\r
        if(dwFlags & (LOAD_LIBRARY_AS_DATAFILE | 0x00000040))\r
index 8c85cc2..2eb603d 100644 (file)
@@ -1227,8 +1227,12 @@ BOOL LoadPuTTY()
                return FALSE;\r
 #ifdef ENABLE_PROCESS_PROTECTION\r
        // ビルドしたputty.dllに合わせてSHA1ハッシュ値を変更すること\r
+#if defined(_M_IX86)\r
+       RegisterTrustedModuleSHA1Hash("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00");\r
+#elif defined(_M_AMD64)\r
        RegisterTrustedModuleSHA1Hash("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00");\r
 #endif\r
+#endif\r
        // デバッグ用\r
 #ifdef _DEBUG\r
        {\r