• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Loweynet


Commit MetaInfo

Revision25e4bc92bcd934ea3f23a7c79a4211dfb7a09c0a (tree)
Zeit2014-04-30 12:22:40
Autors_kawamoto <s_kawamoto@user...>
Commiters_kawamoto

Log Message

Fix bugs of process protection.

Ändern Zusammenfassung

Diff

Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
Binary files a/FFFTP_Eng_Release_64/FFFTP.exe and b/FFFTP_Eng_Release_64/FFFTP.exe differ
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
Binary files a/Release_64/FFFTP.exe and b/Release_64/FFFTP.exe differ
--- a/protectprocess.c
+++ b/protectprocess.c
@@ -26,9 +26,6 @@
2626 #include <sfc.h>
2727 #include <tlhelp32.h>
2828 #include <imagehlp.h>
29-#ifdef USE_IAT_HOOK
30-#include <dbghelp.h>
31-#endif
3229
3330 #define DO_NOT_REPLACE
3431 #include "protectprocess.h"
@@ -44,12 +41,19 @@
4441 #elif defined(_M_AMD64)
4542 #define HOOK_JUMP_CODE_LENGTH 14
4643 #endif
44+typedef struct
45+{
46+ void* pCode;
47+ size_t CodeLength;
48+ BYTE PatchCode[HOOK_JUMP_CODE_LENGTH];
49+ BYTE BackupCode[HOOK_JUMP_CODE_LENGTH];
50+} HOOK_JUMP_CODE_PATCH;
4751 #endif
4852
4953 BOOL LockThreadLock();
5054 BOOL UnlockThreadLock();
5155 #ifdef USE_CODE_HOOK
52-BOOL HookFunctionInCode(void* pOriginal, void* pNew, void* pBackupCode, BOOL bRestore);
56+BOOL HookFunctionInCode(void* pOriginal, void* pNew, HOOK_JUMP_CODE_PATCH* pPatch, BOOL bRestore);
5357 #endif
5458 #ifdef USE_IAT_HOOK
5559 BOOL HookFunctionInIAT(void* pOriginal, void* pNew);
@@ -63,7 +67,7 @@ BOOL IsModuleTrusted(LPCWSTR Filename);
6367
6468 // 変数の宣言
6569 #ifdef USE_CODE_HOOK
66-#define HOOK_FUNCTION_VAR(name) _##name p_##name;BYTE c_##name[HOOK_JUMP_CODE_LENGTH * 2];
70+#define HOOK_FUNCTION_VAR(name) _##name p_##name;HOOK_JUMP_CODE_PATCH c_##name;
6771 #endif
6872 #ifdef USE_IAT_HOOK
6973 #define HOOK_FUNCTION_VAR(name) _##name p_##name;
@@ -75,7 +79,7 @@ BOOL IsModuleTrusted(LPCWSTR Filename);
7579 // フック対象を呼び出す前に対象のコードを復元
7680 #define BEGIN_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, &c_##name, TRUE)
7781 // フック対象を呼び出した後に対象のコードを置換
78-#define END_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, NULL, FALSE)
82+#define END_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, &c_##name, FALSE)
7983
8084 HOOK_FUNCTION_VAR(LoadLibraryA)
8185 HOOK_FUNCTION_VAR(LoadLibraryW)
@@ -245,63 +249,120 @@ BOOL UnlockThreadLock()
245249 }
246250
247251 #ifdef USE_CODE_HOOK
248-BOOL HookFunctionInCode(void* pOriginal, void* pNew, void* pBackupCode, BOOL bRestore)
252+BOOL HookFunctionInCode(void* pOriginal, void* pNew, HOOK_JUMP_CODE_PATCH* pPatch, BOOL bRestore)
249253 {
250254 BOOL bResult;
251255 bResult = FALSE;
252256 #if defined(_M_IX86)
253257 {
254- BYTE JumpCode[HOOK_JUMP_CODE_LENGTH] = {0xe9, 0x00, 0x00, 0x00, 0x00};
255- size_t Relative;
256258 DWORD Protect;
257- Relative = (size_t)pNew - (size_t)pOriginal - HOOK_JUMP_CODE_LENGTH;
258- memcpy(&JumpCode[1], &Relative, 4);
259+ BYTE* pCode;
260+ CHAR c;
261+ LONG l;
262+ bResult = FALSE;
259263 if(bRestore)
260264 {
261- if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))
265+ if(VirtualProtect(pPatch->pCode, pPatch->CodeLength, PAGE_EXECUTE_READWRITE, &Protect))
262266 {
263- memcpy(pOriginal, pBackupCode, HOOK_JUMP_CODE_LENGTH);
264- VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);
267+ memcpy(pPatch->pCode, &pPatch->BackupCode, pPatch->CodeLength);
268+ VirtualProtect(pPatch->pCode, pPatch->CodeLength, Protect, &Protect);
265269 bResult = TRUE;
266270 }
267271 }
268272 else
269273 {
270- if(pBackupCode)
271- memcpy(pBackupCode, pOriginal, HOOK_JUMP_CODE_LENGTH);
272- if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))
274+ if(!pPatch->pCode)
275+ {
276+ pCode = (BYTE*)pOriginal;
277+ while(pCode[0] == 0xeb)
278+ {
279+ memcpy(&c, pCode + 1, 1);
280+ pCode = pCode + 2 + c;
281+ }
282+ if(pCode[0] == 0xe9)
283+ {
284+ pPatch->pCode = pCode + 1;
285+ pPatch->CodeLength = 4;
286+ memcpy(&pPatch->BackupCode, pPatch->pCode, pPatch->CodeLength);
287+ l = (long)pNew - ((long)pCode + 5);
288+ memcpy(&pPatch->PatchCode[0], &l, 4);
289+ }
290+ else
291+ {
292+ pPatch->pCode = pCode;
293+ pPatch->CodeLength = 5;
294+ memcpy(&pPatch->BackupCode, pPatch->pCode, pPatch->CodeLength);
295+ pPatch->PatchCode[0] = 0xe9;
296+ l = (long)pNew - ((long)pCode + 5);
297+ memcpy(&pPatch->PatchCode[1], &l, 4);
298+ }
299+ }
300+ if(VirtualProtect(pPatch->pCode, pPatch->CodeLength, PAGE_EXECUTE_READWRITE, &Protect))
273301 {
274- memcpy(pOriginal, &JumpCode, HOOK_JUMP_CODE_LENGTH);
275- VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);
302+ memcpy(pPatch->pCode, &pPatch->PatchCode, pPatch->CodeLength);
303+ VirtualProtect(pPatch->pCode, pPatch->CodeLength, Protect, &Protect);
276304 bResult = TRUE;
277305 }
278306 }
279307 }
280308 #elif defined(_M_AMD64)
281309 {
282- BYTE JumpCode[HOOK_JUMP_CODE_LENGTH] = {0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
283- size_t Absolute;
284310 DWORD Protect;
285- Absolute = (size_t)pNew;
286- memcpy(&JumpCode[6], &Absolute, 8);
311+ BYTE* pCode;
312+ CHAR c;
313+ LONG l;
287314 bResult = FALSE;
288315 if(bRestore)
289316 {
290- if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))
317+ if(VirtualProtect(pPatch->pCode, pPatch->CodeLength, PAGE_EXECUTE_READWRITE, &Protect))
291318 {
292- memcpy(pOriginal, pBackupCode, HOOK_JUMP_CODE_LENGTH);
293- VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);
319+ memcpy(pPatch->pCode, &pPatch->BackupCode, pPatch->CodeLength);
320+ VirtualProtect(pPatch->pCode, pPatch->CodeLength, Protect, &Protect);
294321 bResult = TRUE;
295322 }
296323 }
297324 else
298325 {
299- if(pBackupCode)
300- memcpy(pBackupCode, pOriginal, HOOK_JUMP_CODE_LENGTH);
301- if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))
326+ if(!pPatch->pCode)
327+ {
328+ pCode = (BYTE*)pOriginal;
329+ while(pCode[0] == 0xeb || pCode[0] == 0xe9)
330+ {
331+ if(pCode[0] == 0xeb)
332+ {
333+ memcpy(&c, pCode + 1, 1);
334+ pCode = pCode + 2 + c;
335+ }
336+ else
337+ {
338+ memcpy(&l, pCode + 1, 4);
339+ pCode = pCode + 5 + l;
340+ }
341+ }
342+ if(pCode[0] == 0xff && pCode[1] == 0x25)
343+ {
344+ memcpy(&l, pCode + 2, 4);
345+ pPatch->pCode = pCode + 6 + l;
346+ pPatch->CodeLength = 8;
347+ memcpy(&pPatch->BackupCode, pPatch->pCode, pPatch->CodeLength);
348+ memcpy(&pPatch->PatchCode[0], &pNew, 8);
349+ }
350+ else
351+ {
352+ pPatch->pCode = pCode;
353+ pPatch->CodeLength = 14;
354+ memcpy(&pPatch->BackupCode, pPatch->pCode, pPatch->CodeLength);
355+ pPatch->PatchCode[0] = 0xff;
356+ pPatch->PatchCode[1] = 0x25;
357+ l = 0;
358+ memcpy(&pPatch->PatchCode[2], &l, 4);
359+ memcpy(&pPatch->PatchCode[6], &pNew, 8);
360+ }
361+ }
362+ if(VirtualProtect(pPatch->pCode, pPatch->CodeLength, PAGE_EXECUTE_READWRITE, &Protect))
302363 {
303- memcpy(pOriginal, &JumpCode, HOOK_JUMP_CODE_LENGTH);
304- VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);
364+ memcpy(pPatch->pCode, &pPatch->PatchCode, pPatch->CodeLength);
365+ VirtualProtect(pPatch->pCode, pPatch->CodeLength, Protect, &Protect);
305366 bResult = TRUE;
306367 }
307368 }
@@ -730,8 +791,8 @@ HMODULE System_LoadLibrary(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
730791 HANDLE hDataFile;
731792 HANDLE hMapping;
732793 DWORD DllFlags;
733- us.Length = sizeof(wchar_t) * wcslen(lpLibFileName);
734- us.MaximumLength = sizeof(wchar_t) * (wcslen(lpLibFileName) + 1);
794+ us.Length = sizeof(wchar_t) * (USHORT)wcslen(lpLibFileName);
795+ us.MaximumLength = sizeof(wchar_t) * ((USHORT)wcslen(lpLibFileName) + 1);
735796 us.Buffer = (PWSTR)lpLibFileName;
736797 // if(dwFlags & (LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE))
737798 if(dwFlags & (LOAD_LIBRARY_AS_DATAFILE | 0x00000040))
--- a/socketwrapper.c
+++ b/socketwrapper.c
@@ -1227,8 +1227,12 @@ BOOL LoadPuTTY()
12271227 return FALSE;
12281228 #ifdef ENABLE_PROCESS_PROTECTION
12291229 // ビルドしたputty.dllに合わせてSHA1ハッシュ値を変更すること
1230+#if defined(_M_IX86)
1231+ RegisterTrustedModuleSHA1Hash("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00");
1232+#elif defined(_M_AMD64)
12301233 RegisterTrustedModuleSHA1Hash("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00");
12311234 #endif
1235+#endif
12321236 // デバッグ用
12331237 #ifdef _DEBUG
12341238 {