FFFTPのソースコードです。
Revision | e541a4bcc1e72d1ec9880c6adeeaa8046f68353a (tree) |
---|---|
Zeit | 2012-03-14 14:43:24 |
Autor | s_kawamoto <s_kawamoto@user...> |
Commiter | s_kawamoto |
Fix bugs of hooking routines.
@@ -73,7 +73,7 @@ BOOL IsModuleTrusted(LPCWSTR Filename); | ||
73 | 73 | // フック対象のコードを置換してフックを開始 |
74 | 74 | #define SET_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, &c_##name, FALSE) |
75 | 75 | // フック対象を呼び出す前に対象のコードを復元 |
76 | -#define START_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, &c_##name, TRUE) | |
76 | +#define BEGIN_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, &c_##name, TRUE) | |
77 | 77 | // フック対象を呼び出した後に対象のコードを置換 |
78 | 78 | #define END_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, NULL, FALSE) |
79 | 79 |
@@ -103,7 +103,7 @@ BYTE g_TrustedMD5HashTable[MAX_TRUSTED_MD5_HASH_TABLE][20]; | ||
103 | 103 | WNDPROC g_PasswordEditControlProc; |
104 | 104 | |
105 | 105 | // 以下フック関数 |
106 | -// フック対象を呼び出す場合は前後でSTART_HOOK_FUNCTIONとEND_HOOK_FUNCTIONを実行する必要がある | |
106 | +// フック対象を呼び出す場合は前後でBEGIN_HOOK_FUNCTIONとEND_HOOK_FUNCTIONを実行する必要がある | |
107 | 107 | |
108 | 108 | HMODULE WINAPI h_LoadLibraryA(LPCSTR lpLibFileName) |
109 | 109 | { |
@@ -248,57 +248,62 @@ BOOL UnlockThreadLock() | ||
248 | 248 | BOOL HookFunctionInCode(void* pOriginal, void* pNew, void* pBackupCode, BOOL bRestore) |
249 | 249 | { |
250 | 250 | BOOL bResult; |
251 | - DWORD Protect; | |
252 | -#if defined(_X86_) | |
253 | - BYTE JumpCode[HOOK_JUMP_CODE_LENGTH] = {0xe9, 0x00, 0x00, 0x00, 0x00}; | |
254 | - size_t Relative; | |
255 | - Relative = (size_t)pNew - (size_t)pOriginal - HOOK_JUMP_CODE_LENGTH; | |
256 | - memcpy(&JumpCode[1], &Relative, 4); | |
257 | 251 | bResult = FALSE; |
258 | - if(bRestore) | |
252 | +#if defined(_X86_) | |
259 | 253 | { |
260 | - if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect)) | |
254 | + BYTE JumpCode[HOOK_JUMP_CODE_LENGTH] = {0xe9, 0x00, 0x00, 0x00, 0x00}; | |
255 | + size_t Relative; | |
256 | + DWORD Protect; | |
257 | + Relative = (size_t)pNew - (size_t)pOriginal - HOOK_JUMP_CODE_LENGTH; | |
258 | + memcpy(&JumpCode[1], &Relative, 4); | |
259 | + if(bRestore) | |
261 | 260 | { |
262 | - memcpy(pOriginal, pBackupCode, HOOK_JUMP_CODE_LENGTH); | |
263 | - VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect); | |
264 | - bResult = TRUE; | |
261 | + if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect)) | |
262 | + { | |
263 | + memcpy(pOriginal, pBackupCode, HOOK_JUMP_CODE_LENGTH); | |
264 | + VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect); | |
265 | + bResult = TRUE; | |
266 | + } | |
265 | 267 | } |
266 | - } | |
267 | - else | |
268 | - { | |
269 | - if(pBackupCode) | |
270 | - memcpy(pBackupCode, pOriginal, HOOK_JUMP_CODE_LENGTH); | |
271 | - if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect)) | |
268 | + else | |
272 | 269 | { |
273 | - memcpy(pOriginal, &JumpCode, HOOK_JUMP_CODE_LENGTH); | |
274 | - VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect); | |
275 | - bResult = TRUE; | |
270 | + if(pBackupCode) | |
271 | + memcpy(pBackupCode, pOriginal, HOOK_JUMP_CODE_LENGTH); | |
272 | + if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect)) | |
273 | + { | |
274 | + memcpy(pOriginal, &JumpCode, HOOK_JUMP_CODE_LENGTH); | |
275 | + VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect); | |
276 | + bResult = TRUE; | |
277 | + } | |
276 | 278 | } |
277 | 279 | } |
278 | 280 | #elif defined(_AMD64_) |
279 | - BYTE JumpCode[HOOK_JUMP_CODE_LENGTH] = {0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; | |
280 | - size_t Absolute; | |
281 | - Absolute = (size_t)pOriginal; | |
282 | - memcpy(&JumpCode[6], &Absolute, 8); | |
283 | - bResult = FALSE; | |
284 | - if(bRestore) | |
285 | 281 | { |
286 | - if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect)) | |
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; | |
284 | + DWORD Protect; | |
285 | + Absolute = (size_t)pNew; | |
286 | + memcpy(&JumpCode[6], &Absolute, 8); | |
287 | + bResult = FALSE; | |
288 | + if(bRestore) | |
287 | 289 | { |
288 | - memcpy(pOriginal, pBackupCode, HOOK_JUMP_CODE_LENGTH); | |
289 | - VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect); | |
290 | - bResult = TRUE; | |
290 | + if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect)) | |
291 | + { | |
292 | + memcpy(pOriginal, pBackupCode, HOOK_JUMP_CODE_LENGTH); | |
293 | + VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect); | |
294 | + bResult = TRUE; | |
295 | + } | |
291 | 296 | } |
292 | - } | |
293 | - else | |
294 | - { | |
295 | - if(pBackupCode) | |
296 | - memcpy(pBackupCode, pOriginal, HOOK_JUMP_CODE_LENGTH); | |
297 | - if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect)) | |
297 | + else | |
298 | 298 | { |
299 | - memcpy(pOriginal, &JumpCode, HOOK_JUMP_CODE_LENGTH); | |
300 | - VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect); | |
301 | - bResult = TRUE; | |
299 | + if(pBackupCode) | |
300 | + memcpy(pBackupCode, pOriginal, HOOK_JUMP_CODE_LENGTH); | |
301 | + if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect)) | |
302 | + { | |
303 | + memcpy(pOriginal, &JumpCode, HOOK_JUMP_CODE_LENGTH); | |
304 | + VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect); | |
305 | + bResult = TRUE; | |
306 | + } | |
302 | 307 | } |
303 | 308 | } |
304 | 309 | #endif |
@@ -1012,13 +1017,13 @@ BOOL EnableLoadLibraryHook(BOOL bEnable) | ||
1012 | 1017 | { |
1013 | 1018 | bResult = TRUE; |
1014 | 1019 | #ifdef USE_CODE_HOOK |
1015 | - if(!END_HOOK_FUNCTION(LoadLibraryA)) | |
1020 | + if(!BEGIN_HOOK_FUNCTION(LoadLibraryA)) | |
1016 | 1021 | bResult = FALSE; |
1017 | - if(!END_HOOK_FUNCTION(LoadLibraryW)) | |
1022 | + if(!BEGIN_HOOK_FUNCTION(LoadLibraryW)) | |
1018 | 1023 | bResult = FALSE; |
1019 | - if(!END_HOOK_FUNCTION(LoadLibraryExA)) | |
1024 | + if(!BEGIN_HOOK_FUNCTION(LoadLibraryExA)) | |
1020 | 1025 | bResult = FALSE; |
1021 | - if(!END_HOOK_FUNCTION(LoadLibraryExW)) | |
1026 | + if(!BEGIN_HOOK_FUNCTION(LoadLibraryExW)) | |
1022 | 1027 | bResult = FALSE; |
1023 | 1028 | #endif |
1024 | 1029 | #ifdef USE_IAT_HOOK |