From dcc83de7c5cdfa35fc002cec11c413cb74f5c065 Mon Sep 17 00:00:00 2001 From: shunf4 Date: Tue, 3 Mar 2020 15:46:20 +0800 Subject: [PATCH] BREAKING: integrated proxychains_common into Hook DLL fix: race condition in StdWprintf --- .vscode/settings.json | 15 +- README.md | 1 + cygwin_build/Makefile | 16 +- include/common_generic.h | 50 ----- include/common_win32.h | 27 --- include/defines_generic.h | 2 +- include/defines_win32.h | 4 +- include/hookdll_generic.h | 3 +- include/hookdll_interior_generic.h | 25 --- include/hookdll_util_generic.h | 49 ++++ ...c_generic.h => hookdll_util_ipc_generic.h} | 6 +- .../{ipc_win32.h => hookdll_util_ipc_win32.h} | 16 +- ..._interior_win32.h => hookdll_util_win32.h} | 13 +- include/log_generic.h | 6 +- include/log_win32.h | 37 ++- include/proc_bookkeeping_win32.h | 2 +- include/tls_generic.h | 19 +- include/version.h | 2 +- proxychains.exe.sln | 14 -- proxychains.exe/proxychains.exe.vcxproj | 12 +- .../proxychains.exe.vcxproj.filters | 19 +- .../proxychains_common.vcxproj.filters | 2 +- proxychains_helper/proxychains_helper.vcxproj | 9 +- .../proxychains_helper.vcxproj.filters | 12 +- .../proxychains_hook.dll.vcxproj | 20 +- .../proxychains_hook.dll.vcxproj.filters | 23 +- src/common.c | 126 ----------- src/common_wsock.c | 149 ------------- src/dll/dllutil_log_func.c | 85 ------- src/dll/hook_connect_win32.c | 3 +- src/dll/hook_createprocess_win32.c | 3 +- src/dll/hook_installer.c | 3 +- src/dll/{dllmain.c => hookdll_main.c} | 32 ++- src/dll/hookdll_util.c | 210 ++++++++++++++++++ .../hookdll_util_ipc_message.c} | 27 ++- .../{dllutil_wsock.c => hookdll_util_wsock.c} | 132 ++++++++++- src/dll/ipc_client_and_child_data.c | 2 +- src/exe/args_and_config.c | 13 ++ src/exe/ipc_proc_bookkeeping.c | 5 +- src/exe/main.c | 10 +- src/log.c | 34 --- src/stdlib_config_reader.c | 14 +- 42 files changed, 590 insertions(+), 662 deletions(-) delete mode 100644 include/common_generic.h delete mode 100644 include/common_win32.h delete mode 100644 include/hookdll_interior_generic.h create mode 100644 include/hookdll_util_generic.h rename include/{ipc_generic.h => hookdll_util_ipc_generic.h} (93%) rename include/{ipc_win32.h => hookdll_util_ipc_win32.h} (56%) rename include/{hookdll_interior_win32.h => hookdll_util_win32.h} (84%) delete mode 100644 src/common.c delete mode 100644 src/common_wsock.c delete mode 100644 src/dll/dllutil_log_func.c rename src/dll/{dllmain.c => hookdll_main.c} (93%) create mode 100644 src/dll/hookdll_util.c rename src/{ipc_message.c => dll/hookdll_util_ipc_message.c} (75%) rename src/dll/{dllutil_wsock.c => hookdll_util_wsock.c} (55%) delete mode 100644 src/log.c diff --git a/.vscode/settings.json b/.vscode/settings.json index fcf8d3c..01ed971 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,7 +11,6 @@ "objbase.h": "c", "shtypes.h": "c", "cwchar": "cpp", - "common.h": "c", "stdio.h": "c", "unistd.h": "c", "spawn.h": "c", @@ -21,14 +20,12 @@ "socket.h": "c", "winsock2.h": "c", "_fd_types.h": "c", - "log.h": "c", "ipc.h": "c", "stdlib.h": "c", "log_win32.h": "c", - "common_win32.h": "c", "system_error": "cpp", - "ipc_generic.h": "c", - "ipc_win32.h": "c", + "hookdll_util_ipc_generic.h": "c", + "hookdll_util_ipc_win32.h": "c", "remote_win32.h": "c", "defines_win32.h": "c", "log_generic.h": "c", @@ -49,7 +46,6 @@ "minwindef.h": "c", "proxy_core.h": "c", "minhook.h": "c", - "common_generic.h": "c", "sstream": "c", "version.h": "c", "tls_generic.h": "c", @@ -59,8 +55,9 @@ "string_view": "c", "initializer_list": "c", "utility": "c", - "hookdll_interior_win32.h": "c", - "hookdll_interior_generic.h": "c", - "ut_helpers.h": "c" + "hookdll_util_win32.h": "c", + "hookdll_util_generic.h": "c", + "ut_helpers.h": "c", + "remote_func_bin_x64.h": "c" } } \ No newline at end of file diff --git a/README.md b/README.md index 6a351c5..b559092 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,7 @@ programs). See "To-do and Known Issues". Perhaps solution based on - [X] ~~Resolve remote thread exit code `0xc0000005` (Access Denied) when calling `C:\ProgramData\chocolatey\tools\7z.exe`~~ Finally fixed in ~~0.4.3~~ ~~0.4.4~~ 0.4.5 +- [X] ~~Resolve race condition in `StdWprintf()`~~ Fixed in 0.4.5 # Licensing diff --git a/cygwin_build/Makefile b/cygwin_build/Makefile index bd5097c..2c22a96 100644 --- a/cygwin_build/Makefile +++ b/cygwin_build/Makefile @@ -132,10 +132,16 @@ $(REMOTE_FUNC_BIN_HEADER_DEBUG) : $(HELPER_PATH_DEBUG) $(REMOTE_FUNC_BIN_HEADER_RELEASE) : $(HELPER_PATH_RELEASE) $(HELPER_PATH_RELEASE) --dump-remote-function > $@ -$(DLL_PATH_DEBUG) : ../minhook/libMinHook.a dll/dllmain.o dll/hook_connect_win32.o dll/hook_connect_win32.o dll/hook_connect_cygwin.o dll/hook_createprocess_win32.o dll/hook_installer.o dll/ipc_client_and_child_data.o dll/dllutil_log_func.o dll/dllutil_wsock.o common.o common_wsock.o ipc_message.o log.o cygwin_strsafe/strsafe.o +dll/hookdll_main.o : MADE_REMOTE_FUNC_BIN_HEADER + +MADE_REMOTE_FUNC_BIN_HEADER : proxychains_helper.o remote_function.o + $(MAKE) $(REMOTE_FUNC_BIN_HEADER) + touch MADE_REMOTE_FUNC_BIN_HEADER + +$(DLL_PATH_DEBUG) : ../minhook/libMinHook.a dll/hookdll_main.o dll/hook_connect_win32.o dll/hook_connect_win32.o dll/hook_connect_cygwin.o dll/hook_createprocess_win32.o dll/hook_installer.o dll/ipc_client_and_child_data.o dll/hookdll_util.o dll/hookdll_util_wsock.o dll/hookdll_util_ipc_message.o cygwin_strsafe/strsafe.o $(CC) -shared -o$@ -Wl,--out-implib=$(DLL_IMPLIB_PATH_DEBUG) $(LIB_DIR_LDFLAGS) $(filter %.c %.o %.a %.lib,$^) -Wl,-static -lMinHook -Wl,-Bdynamic -lntdllcrt -lws2_32 -lshlwapi -$(DLL_PATH_RELEASE) : ../minhook/libMinHook.a dll/dllmain.o dll/hook_connect_win32.o dll/hook_connect_win32.o dll/hook_connect_cygwin.o dll/hook_createprocess_win32.o dll/hook_installer.o dll/ipc_client_and_child_data.o dll/dllutil_log_func.o dll/dllutil_wsock.o common.o common_wsock.o ipc_message.o log.o cygwin_strsafe/strsafe.o +$(DLL_PATH_RELEASE) : ../minhook/libMinHook.a dll/hookdll_main.o dll/hook_connect_win32.o dll/hook_connect_win32.o dll/hook_connect_cygwin.o dll/hook_createprocess_win32.o dll/hook_installer.o dll/ipc_client_and_child_data.o dll/hookdll_util.o dll/hookdll_util_wsock.o dll/hookdll_util_ipc_message.o cygwin_strsafe/strsafe.o $(CC) -shared -o$@ -Wl,--out-implib=$(DLL_IMPLIB_PATH_RELEASE) $(LIB_DIR_LDFLAGS) $(filter %.c %.o %.a %.lib,$^) -Wl,-static -lMinHook -Wl,-Bdynamic -lntdllcrt -lws2_32 -lshlwapi # -Wl,--export-all-symbols \ @@ -144,16 +150,16 @@ $(DLL_PATH_RELEASE) : ../minhook/libMinHook.a dll/dllmain.o dll/hook_connect_win $(DLL_IMPLIB_PATH_DEBUG) : $(DLL_PATH_DEBUG) $(DLL_IMPLIB_PATH_RELEASE) : $(DLL_PATH_RELEASE) -$(EXEC_PATH_DEBUG) : ../minhook/libMinHook.a exe/main.o exe/args_and_config.o exe/ipc_proc_bookkeeping.o stdlib_config_reader.o common.o common_wsock.o ipc_message.o log.o cygwin_strsafe/strsafe.o $(DLL_IMPLIB_PATH_DEBUG) +$(EXEC_PATH_DEBUG) : ../minhook/libMinHook.a exe/main.o exe/args_and_config.o exe/ipc_proc_bookkeeping.o stdlib_config_reader.o cygwin_strsafe/strsafe.o $(DLL_IMPLIB_PATH_DEBUG) $(CC) -o$@ $(filter %.c %.o %.a %.lib,$^) $(LIB_DIR_LDFLAGS) -Wl,-static -lMinHook -Wl,-Bdynamic -lntdllcrt -lkernel32 -lshlwapi -ladvapi32 -lcygwin -lws2_32 -$(EXEC_PATH_RELEASE) : ../minhook/libMinHook.a exe/main.o exe/args_and_config.o exe/ipc_proc_bookkeeping.o stdlib_config_reader.o common.o common_wsock.o ipc_message.o log.o cygwin_strsafe/strsafe.o $(DLL_IMPLIB_PATH_RELEASE) +$(EXEC_PATH_RELEASE) : ../minhook/libMinHook.a exe/main.o exe/args_and_config.o exe/ipc_proc_bookkeeping.o stdlib_config_reader.o cygwin_strsafe/strsafe.o $(DLL_IMPLIB_PATH_RELEASE) $(CC) -o$@ $(filter %.c %.o %.a %.lib,$^) $(LIB_DIR_LDFLAGS) -Wl,-static -lMinHook -Wl,-Bdynamic -lntdllcrt -lkernel32 -lshlwapi -ladvapi32 -lcygwin -lws2_32 .PHONY : clean dist pre_debug pre_release clean : - $(RM) MAKING_DEBUG MAKING_RELEASE + $(RM) MAKING_DEBUG MAKING_RELEASE MADE_REMOTE_FUNC_BIN_HEADER $(RM) $(ALL_EXECS_DEBUG) $(ALL_EXECS_RELEASE) $(RM) $(ALL_SHARED_LIBS_DEBUG) $(ALL_SHARED_LIBS_RELEASE) $(RM) $(ALL_IMPLIBS_DEBUG) $(ALL_IMPLIBS_RELEASE) diff --git a/include/common_generic.h b/include/common_generic.h deleted file mode 100644 index 2075740..0000000 --- a/include/common_generic.h +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* common_generic.h - * Copyright (C) 2020 Feng Shun. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License version 2 for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program. If not, see - * . - */ -#pragma once - -#include "defines_generic.h" -#include "tls_generic.h" - -extern const wchar_t* g_szRuleTargetDesc[3]; - -// *_early are per-process instead of per-thread, which will cause race condition, and are only used at early stages of DLL loading and hook initializing -extern wchar_t g_szDumpMemoryBuf_early[PXCH_MAX_DUMP_MEMORY_BUFSIZE]; -extern wchar_t g_szErrorMessageBuf_early[PXCH_MAX_ERROR_MESSAGE_BUFSIZE]; -extern wchar_t g_szFormatHostPortBuf_early[PXCH_MAX_FORMAT_HOST_PORT_BUFSIZE]; - -// After the load of Hook DLL, they will be per-thread(in TLS), thread safe -#define g_szDumpMemoryBuf (g_dwTlsIndex ? PXCH_TLS_PTR_DUMP_MEMORY_BUF(g_dwTlsIndex) : g_szDumpMemoryBuf_early) -#define g_szErrorMessageBuf (g_dwTlsIndex ? PXCH_TLS_PTR_ERROR_MESSAGE_BUF(g_dwTlsIndex) : g_szErrorMessageBuf_early) -#define g_szFormatHostPortBuf (g_dwTlsIndex ? PXCH_TLS_PTR_FORMAT_HOST_PORT_BUF(g_dwTlsIndex) : g_szFormatHostPortBuf_early) - -const wchar_t* FormatHostPortToStr(const void* pHostPort, int iAddrLen); -const wchar_t* DumpMemory(const void* p, int iLength); -void IndexToIp(const PROXYCHAINS_CONFIG* pPxchConfig, PXCH_IP_ADDRESS* pIp, PXCH_UINT32 iIndex); -void IpToIndex(const PROXYCHAINS_CONFIG* pPxchConfig, PXCH_UINT32* piIndex, const PXCH_IP_ADDRESS* pIp); -PXCH_UINT32 OpenConfigurationFile(PROXYCHAINS_CONFIG* pPxchConfig); -PXCH_UINT32 OpenHostsFile(const WCHAR* szHostsFilePath); -PXCH_UINT32 ConfigurationFileReadLine(unsigned long long* pullLineNum, wchar_t* chBuf, size_t cbBufSize); -PXCH_UINT32 HostsFileReadLine(unsigned long long* pullHostsLineNum, wchar_t* chBuf, size_t cbBufSize); -PXCH_UINT32 CloseConfigurationFile(); -PXCH_UINT32 CloseHostsFile(); -long ConfigurationTellPos(); -void ConfigurationRewind(); -long HostsTellPos(); -void HostsRewind(); - diff --git a/include/common_win32.h b/include/common_win32.h deleted file mode 100644 index 7d1c833..0000000 --- a/include/common_win32.h +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* common_win32.h - * Copyright (C) 2020 Feng Shun. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License version 2 for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program. If not, see - * . - */ -#pragma once - -#include "defines_win32.h" -#include "common_generic.h" - -PWCHAR FormatErrorToStr(DWORD dwError); -void StdWprintf(DWORD dwStdHandle, const WCHAR* fmt, ...); -void StdVwprintf(DWORD dwStdHandle, const WCHAR* fmt, va_list args); -void StdFlush(DWORD dwStdHandle); diff --git a/include/defines_generic.h b/include/defines_generic.h index b7a8e07..62a56d6 100644 --- a/include/defines_generic.h +++ b/include/defines_generic.h @@ -430,4 +430,4 @@ static const wchar_t g_szMinHookDllFileName[] = L"MinHook.x64.dll"; static const wchar_t g_szMinHookDllFileName[] = L"MinHook.x86.dll"; #endif -extern PXCH_DLL_API PROXYCHAINS_CONFIG* g_pPxchConfig; +PXCH_DLL_API extern PROXYCHAINS_CONFIG* g_pPxchConfig; diff --git a/include/defines_win32.h b/include/defines_win32.h index 0e601a8..50e0446 100644 --- a/include/defines_win32.h +++ b/include/defines_win32.h @@ -79,6 +79,6 @@ typedef struct _PXCH_INJECT_REMOTE_DATA { } PXCH_INJECT_REMOTE_DATA; #pragma pack(pop) -extern PXCH_DLL_API BOOL g_bCurrentlyInWinapiCall; -extern PXCH_DLL_API DWORD g_dwCurrentProcessIdForVerify; +PXCH_DLL_API extern BOOL g_bCurrentlyInWinapiCall; +PXCH_DLL_API extern DWORD g_dwCurrentProcessIdForVerify; diff --git a/include/hookdll_generic.h b/include/hookdll_generic.h index 60980a8..719af86 100644 --- a/include/hookdll_generic.h +++ b/include/hookdll_generic.h @@ -63,4 +63,5 @@ extern FP_ORIGINAL_FUNC2(Cygwin1, connect); DECLARE_HOOK_FUNC2(Cygwin1, connect); -PXCH_UINT32 RestoreChildData(); \ No newline at end of file +void Win32HookWs2_32(void); +void CygwinHook(void); \ No newline at end of file diff --git a/include/hookdll_interior_generic.h b/include/hookdll_interior_generic.h deleted file mode 100644 index b46cad5..0000000 --- a/include/hookdll_interior_generic.h +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* hookdll_interior_generic.h - * Copyright (C) 2020 Feng Shun. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License version 2 for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program. If not, see - * . - */ -#pragma once - -#include "defines_win32.h" -#include "ipc_win32.h" - -extern PXCH_INJECT_REMOTE_DATA* g_pRemoteData; -PXCH_UINT32 IpcCommunicateWithServer(const PXCH_IPC_MSGBUF sendMessage, PXCH_UINT32 cbSendMessageSize, PXCH_IPC_MSGBUF responseMessage, PXCH_UINT32* pcbResponseMessageSize); diff --git a/include/hookdll_util_generic.h b/include/hookdll_util_generic.h new file mode 100644 index 0000000..e4e2a17 --- /dev/null +++ b/include/hookdll_util_generic.h @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* hookdll_util_generic.h + * Copyright (C) 2020 Feng Shun. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License version 2 for more details. + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program. If not, see + * . + */ +#pragma once + +#include "defines_win32.h" +#include "tls_generic.h" +#include "hookdll_util_ipc_win32.h" + +extern PXCH_INJECT_REMOTE_DATA* g_pRemoteData; +PXCH_DLL_API extern const wchar_t* g_szRuleTargetDesc[3]; + +// *_early are per-process instead of per-thread, which will cause race condition, and are only used at early stages of DLL loading and hook initializing +PXCH_DLL_API extern wchar_t g_szDumpMemoryBuf_early[PXCH_MAX_DUMP_MEMORY_BUFSIZE]; +PXCH_DLL_API extern wchar_t g_szErrorMessageBuf_early[PXCH_MAX_ERROR_MESSAGE_BUFSIZE]; +PXCH_DLL_API extern wchar_t g_szFormatHostPortBuf_early[PXCH_MAX_FORMAT_HOST_PORT_BUFSIZE]; + +PXCH_DLL_API extern wchar_t g_szFwprintfWbuf_early[PXCH_MAX_FWPRINTF_BUFSIZE]; +PXCH_DLL_API extern char g_szFwprintfBuf_early[PXCH_MAX_FWPRINTF_BUFSIZE]; + +// After the load of Hook DLL, they will be per-thread(in TLS), thread safe +#define g_szDumpMemoryBuf ((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_DUMP_MEMORY_BUF(g_dwTlsIndex) : g_szDumpMemoryBuf_early) +#define g_szErrorMessageBuf ((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_ERROR_MESSAGE_BUF(g_dwTlsIndex) : g_szErrorMessageBuf_early) +#define g_szFormatHostPortBuf ((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_FORMAT_HOST_PORT_BUF(g_dwTlsIndex) : g_szFormatHostPortBuf_early) +#define g_szFwprintfWbuf ((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_FORMAT_FWPRINTF_W_BUF(g_dwTlsIndex) : g_szFwprintfWbuf_early) +#define g_szFwprintfBuf ((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_FORMAT_FWPRINTF_BUF(g_dwTlsIndex) : g_szFwprintfBuf_early) + + +PXCH_DLL_API const wchar_t* FormatHostPortToStr(const void* pHostPort, int iAddrLen); +PXCH_DLL_API const wchar_t* DumpMemory(const void* p, int iLength); + +PXCH_DLL_API void IndexToIp(const PROXYCHAINS_CONFIG* pPxchConfig, PXCH_IP_ADDRESS* pIp, PXCH_UINT32 iIndex); +PXCH_DLL_API void IpToIndex(const PROXYCHAINS_CONFIG* pPxchConfig, PXCH_UINT32* piIndex, const PXCH_IP_ADDRESS* pIp); + diff --git a/include/ipc_generic.h b/include/hookdll_util_ipc_generic.h similarity index 93% rename from include/ipc_generic.h rename to include/hookdll_util_ipc_generic.h index d8b1ab7..e64ef76 100644 --- a/include/ipc_generic.h +++ b/include/hookdll_util_ipc_generic.h @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-or-later -/* ipc_generic.h +/* hookdll_util_ipc_generic.h * Copyright (C) 2020 Feng Shun. * * This program is free software: you can redistribute it and/or modify @@ -89,6 +89,6 @@ typedef struct _IPC_MSGHDR_HOSTNAMEANDIPS { PXCH_UINT32 IpcCommunicateWithServer(const PXCH_IPC_MSGBUF sendMessage, PXCH_UINT32 cbSendMessageSize, PXCH_IPC_MSGBUF responseMessage, PXCH_UINT32* pcbResponseMessageSize); -PXCH_UINT32 WstrToMessage(PXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32* pcbMessageSize, const wchar_t* szWstr); -PXCH_UINT32 MessageToWstr(wchar_t* wstr, CPXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32 cbMessageSize); +PXCH_DLL_API PXCH_UINT32 WstrToMessage(PXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32* pcbMessageSize, const wchar_t* szWstr); +PXCH_DLL_API PXCH_UINT32 MessageToWstr(wchar_t* wstr, CPXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32 cbMessageSize); diff --git a/include/ipc_win32.h b/include/hookdll_util_ipc_win32.h similarity index 56% rename from include/ipc_win32.h rename to include/hookdll_util_ipc_win32.h index e6abb1f..07f442d 100644 --- a/include/ipc_win32.h +++ b/include/hookdll_util_ipc_win32.h @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-or-later -/* ipc_win32.h +/* hookdll_util_ipc_win32.h * Copyright (C) 2020 Feng Shun. * * This program is free software: you can redistribute it and/or modify @@ -19,7 +19,7 @@ #pragma once #include "defines_win32.h" -#include "ipc_generic.h" +#include "hookdll_util_ipc_generic.h" #pragma pack(push, 1) typedef struct _REPORTED_CHILD_DATA { @@ -43,11 +43,11 @@ typedef struct _IPC_MSGHDR_QUERYSTORAGE { } PXCH_IPC_MSGHDR_QUERYSTORAGE; #pragma pack(pop) -DWORD ChildDataToMessage(PXCH_IPC_MSGBUF chMessageBuf, DWORD* pcbMessageSize, const REPORTED_CHILD_DATA* pChildData); -DWORD MessageToChildData(REPORTED_CHILD_DATA* pChildData, CPXCH_IPC_MSGBUF chMessageBuf, DWORD cbMessageSize); +PXCH_DLL_API DWORD ChildDataToMessage(PXCH_IPC_MSGBUF chMessageBuf, DWORD* pcbMessageSize, const REPORTED_CHILD_DATA* pChildData); +PXCH_DLL_API DWORD MessageToChildData(REPORTED_CHILD_DATA* pChildData, CPXCH_IPC_MSGBUF chMessageBuf, DWORD cbMessageSize); -DWORD QueryStorageToMessage(PXCH_IPC_MSGBUF chMessageBuf, DWORD* pcbMessageSize, DWORD dwChildPid); -DWORD MessageToQueryStorage(DWORD* pdwChildPid, CPXCH_IPC_MSGBUF chMessageBuf, DWORD cbMessageSize); +PXCH_DLL_API DWORD QueryStorageToMessage(PXCH_IPC_MSGBUF chMessageBuf, DWORD* pcbMessageSize, DWORD dwChildPid); +PXCH_DLL_API DWORD MessageToQueryStorage(DWORD* pdwChildPid, CPXCH_IPC_MSGBUF chMessageBuf, DWORD cbMessageSize); -PXCH_UINT32 HostnameAndIpsToMessage(PXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32* pcbMessageSize, PXCH_UINT32 dwPid, const PXCH_HOSTNAME* Hostname, BOOL bWillMapResolvedIpToHost, PXCH_UINT32 dwIpNum, const PXCH_IP_ADDRESS* Ips, PXCH_UINT32 dwTarget); -PXCH_UINT32 MessageToHostnameAndIps(PXCH_UINT32* pdwPid, PXCH_HOSTNAME* pHostname, BOOL* pbWillMapResolvedIpToHost, PXCH_UINT32* pdwIpNum, PXCH_IP_ADDRESS* Ips, PXCH_UINT32* pdwTarget, CPXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32 cbMessageSize); \ No newline at end of file +PXCH_DLL_API PXCH_UINT32 HostnameAndIpsToMessage(PXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32* pcbMessageSize, PXCH_UINT32 dwPid, const PXCH_HOSTNAME* Hostname, BOOL bWillMapResolvedIpToHost, PXCH_UINT32 dwIpNum, const PXCH_IP_ADDRESS* Ips, PXCH_UINT32 dwTarget); +PXCH_DLL_API PXCH_UINT32 MessageToHostnameAndIps(PXCH_UINT32* pdwPid, PXCH_HOSTNAME* pHostname, BOOL* pbWillMapResolvedIpToHost, PXCH_UINT32* pdwIpNum, PXCH_IP_ADDRESS* Ips, PXCH_UINT32* pdwTarget, CPXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32 cbMessageSize); \ No newline at end of file diff --git a/include/hookdll_interior_win32.h b/include/hookdll_util_win32.h similarity index 84% rename from include/hookdll_interior_win32.h rename to include/hookdll_util_win32.h index 325c000..2f73d47 100644 --- a/include/hookdll_interior_win32.h +++ b/include/hookdll_util_win32.h @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-or-later -/* hookdll_interior_win32.h +/* hookdll_util_win32.h * Copyright (C) 2020 Feng Shun. * * This program is free software: you can redistribute it and/or modify @@ -18,16 +18,19 @@ */ #pragma once -#include "hookdll_interior_generic.h" +#include "defines_win32.h" +#include "hookdll_util_generic.h" + +PXCH_DLL_API PWCHAR FormatErrorToStr(DWORD dwError); +PXCH_DLL_API void StdWprintf(DWORD dwStdHandle, const WCHAR* fmt, ...); +PXCH_DLL_API void StdVwprintf(DWORD dwStdHandle, const WCHAR* fmt, va_list args); +PXCH_DLL_API void StdFlush(DWORD dwStdHandle); DWORD IpcClientRegisterChildProcess(); PXCH_UINT32 RestoreChildData(); DWORD InjectTargetProcess(const PROCESS_INFORMATION* pPi); -void Win32HookWs2_32(void); -void CygwinHook(void); - #ifdef PXCH_INCLUDE_WINSOCK_UTIL #include #include diff --git a/include/log_generic.h b/include/log_generic.h index 100a71a..681087e 100644 --- a/include/log_generic.h +++ b/include/log_generic.h @@ -20,10 +20,10 @@ #include "tls_generic.h" // *_early are per-process instead of per-thread, which will cause race condition, and are only used at early stages of DLL loading and hook initializing -extern wchar_t log_ods_buf_early[PXCH_LOG_ODS_BUFSIZE]; +PXCH_DLL_API extern wchar_t log_ods_buf_early[PXCH_LOG_ODS_BUFSIZE]; // After the load of Hook DLL, they will be per-thread(in TLS), thread safe -#define log_ods_buf (g_dwTlsIndex ? PXCH_TLS_PTR_LOG_ODS_BUF(g_dwTlsIndex) : log_ods_buf_early) +#define log_ods_buf ((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_LOG_ODS_BUF(g_dwTlsIndex) : log_ods_buf_early) #define PXCH_LOG_LEVEL_VERBOSE 600 #define PXCH_LOG_LEVEL_DEBUG 500 @@ -58,6 +58,8 @@ extern wchar_t log_ods_buf_early[PXCH_LOG_ODS_BUFSIZE]; #define PXCH_LOG_IPC_PID_PREFIX PXCH_LOG_IPC_PID_PREFIX_WIN #endif +#define ODBGSTRLOG_FORCE_WITH_EARLY_BUF(fmt, ...) do { StringCchPrintfW(log_ods_buf_early, PXCH_LOG_ODS_BUFSIZE, fmt, ##__VA_ARGS__); OutputDebugStringW(log_ods_buf_early); } while(0) + #if PXCH_LOG_LEVEL_ENABLED >= PXCH_LOG_LEVEL_DEBUG #define ODBGSTRLOG(fmt, ...) do { StringCchPrintfW(log_ods_buf, PXCH_LOG_ODS_BUFSIZE, fmt, ##__VA_ARGS__); OutputDebugStringW(log_ods_buf); } while(0) #else diff --git a/include/log_win32.h b/include/log_win32.h index ce7f690..61f5205 100644 --- a/include/log_win32.h +++ b/include/log_win32.h @@ -21,21 +21,20 @@ #include #endif -#include "common_win32.h" #include "defines_win32.h" -#include "ipc_win32.h" +#include "hookdll_util_ipc_win32.h" #include "log_generic.h" #include "tls_win32.h" // *_early are per-process instead of per-thread, which will cause race condition, and are only used at early stages of DLL loading and hook initializing -extern SYSTEMTIME log_time_early; -extern wchar_t log_szLogLine_early[PXCH_LOG_IPC_BUFSIZE]; -extern PXCH_IPC_MSGBUF log_msg_early; -extern PXCH_IPC_MSGBUF log_respMsg_early; -extern PXCH_UINT32 log_cbMsgSize_early; -extern PXCH_UINT32 log_cbRespMsgSize_early; -extern PXCH_UINT32 log_pid_early; -extern PXCH_UINT32 log_tid_early; +PXCH_DLL_API extern SYSTEMTIME log_time_early; +PXCH_DLL_API extern wchar_t log_szLogLine_early[PXCH_LOG_IPC_BUFSIZE]; +PXCH_DLL_API extern PXCH_IPC_MSGBUF log_msg_early; +PXCH_DLL_API extern PXCH_IPC_MSGBUF log_respMsg_early; +PXCH_DLL_API extern PXCH_UINT32 log_cbMsgSize_early; +PXCH_DLL_API extern PXCH_UINT32 log_cbRespMsgSize_early; +PXCH_DLL_API extern PXCH_UINT32 log_pid_early; +PXCH_DLL_API extern PXCH_UINT32 log_tid_early; #ifdef __CYGWIN__ extern PXCH_UINT32 log_cygpid_early; @@ -62,15 +61,15 @@ static void __attribute__((unused)) suppress_unused_variable(void) #endif // After the load of Hook DLL, they will be per-thread(in TLS), thread safe -#define log_time (*(g_dwTlsIndex ? PXCH_TLS_PTR_LOG_TIME(g_dwTlsIndex) : &log_time_early)) -#define log_szLogLine (g_dwTlsIndex ? PXCH_TLS_PTR_LOG_SZLOGLINE(g_dwTlsIndex) : log_szLogLine_early) -#define log_msg (g_dwTlsIndex ? PXCH_TLS_PTR_LOG_MSG(g_dwTlsIndex) : log_msg_early) -#define log_respMsg (g_dwTlsIndex ? PXCH_TLS_PTR_LOG_RESPMSG(g_dwTlsIndex) : log_respMsg_early) -#define log_cbMsgSize (*(g_dwTlsIndex ? PXCH_TLS_PTR_LOG_CBMSGSIZE(g_dwTlsIndex) : &log_cbMsgSize_early)) -#define log_cbRespMsgSize (*(g_dwTlsIndex ? PXCH_TLS_PTR_LOG_CBRESPMSGSIZE(g_dwTlsIndex) : &log_cbRespMsgSize_early)) -#define log_pid (*(g_dwTlsIndex ? PXCH_TLS_PTR_LOG_PID(g_dwTlsIndex) : &log_pid_early)) -#define log_cygpid (*(g_dwTlsIndex ? PXCH_TLS_PTR_LOG_CYGPID(g_dwTlsIndex) : &log_cygpid_early)) -#define log_tid (*(g_dwTlsIndex ? PXCH_TLS_PTR_LOG_TID(g_dwTlsIndex) : &log_tid_early)) +#define log_time (*((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_LOG_TIME(g_dwTlsIndex) : &log_time_early)) +#define log_szLogLine ((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_LOG_SZLOGLINE(g_dwTlsIndex) : log_szLogLine_early) +#define log_msg ((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_LOG_MSG(g_dwTlsIndex) : log_msg_early) +#define log_respMsg ((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_LOG_RESPMSG(g_dwTlsIndex) : log_respMsg_early) +#define log_cbMsgSize (*((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_LOG_CBMSGSIZE(g_dwTlsIndex) : &log_cbMsgSize_early)) +#define log_cbRespMsgSize (*((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_LOG_CBRESPMSGSIZE(g_dwTlsIndex) : &log_cbRespMsgSize_early)) +#define log_pid (*((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_LOG_PID(g_dwTlsIndex) : &log_pid_early)) +#define log_cygpid (*((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_LOG_CYGPID(g_dwTlsIndex) : &log_cygpid_early)) +#define log_tid (*((g_dwTlsIndex != TLS_OUT_OF_INDEXES) ? PXCH_TLS_PTR_LOG_TID(g_dwTlsIndex) : &log_tid_early)) #define PXCH_LOG_IPC_PID_QUERY_CYG() log_pid = GetCurrentProcessId(); log_cygpid = g_bCurrentlyInWinapiCall ? -1 : cygwin_winpid_to_pid(log_pid) #define PXCH_LOG_IPC_PID_VALUE_CYG log_cygpid, log_pid diff --git a/include/proc_bookkeeping_win32.h b/include/proc_bookkeeping_win32.h index f9083d4..9377b86 100644 --- a/include/proc_bookkeeping_win32.h +++ b/include/proc_bookkeeping_win32.h @@ -18,7 +18,7 @@ */ #pragma once #include "defines_win32.h" -#include "ipc_win32.h" +#include "hookdll_util_ipc_win32.h" #include "ut_helpers.h" diff --git a/include/tls_generic.h b/include/tls_generic.h index e236179..c0a89c5 100644 --- a/include/tls_generic.h +++ b/include/tls_generic.h @@ -17,7 +17,7 @@ * . */ #include "defines_generic.h" -#include "ipc_generic.h" +#include "hookdll_util_ipc_generic.h" // Thread-local storage offsets and sizes @@ -26,9 +26,9 @@ #define PXCH_TLS_W32HOSTENT_ALIAS_NUM 16 #define PXCH_TLS_W32HOSTENT_ALIAS_BUFSIZE 64 -extern PXCH_UINT32 g_dwTlsIndex; -extern const PXCH_UINT32 g_dwW32HostentSize; -extern const PXCH_UINT32 g_dwW32SystemTimeSize; +PXCH_DLL_API extern PXCH_UINT32 g_dwTlsIndex; +PXCH_DLL_API extern const PXCH_UINT32 g_dwW32HostentSize; +PXCH_DLL_API extern const PXCH_UINT32 g_dwW32SystemTimeSize; #define PXCH_TLS_OFFSET_W32HOSTENT_IP_PTR_LIST (PXCH_TLS_OFFSET_W32HOSTENT + g_dwW32HostentSize) #define PXCH_TLS_OFFSET_W32HOSTENT_IP_BUF (PXCH_TLS_OFFSET_W32HOSTENT_IP_PTR_LIST + sizeof(PXCH_UINT32*[PXCH_TLS_W32HOSTENT_IP_NUM])) @@ -49,10 +49,11 @@ extern const PXCH_UINT32 g_dwW32SystemTimeSize; #define PXCH_TLS_OFFSET_DUMP_MEMORY_BUF (PXCH_TLS_OFFSET_LOG_ODS_BUF + sizeof(wchar_t[PXCH_LOG_ODS_BUFSIZE])) #define PXCH_TLS_OFFSET_ERROR_MESSAGE_BUF (PXCH_TLS_OFFSET_DUMP_MEMORY_BUF + sizeof(wchar_t[PXCH_MAX_DUMP_MEMORY_BUFSIZE])) #define PXCH_TLS_OFFSET_FORMAT_HOST_PORT_BUF (PXCH_TLS_OFFSET_ERROR_MESSAGE_BUF + sizeof(wchar_t[PXCH_MAX_ERROR_MESSAGE_BUFSIZE])) +#define PXCH_TLS_OFFSET_FWPRINTF_W_BUF (PXCH_TLS_OFFSET_FORMAT_HOST_PORT_BUF + sizeof(wchar_t[PXCH_MAX_FORMAT_HOST_PORT_BUFSIZE])) +#define PXCH_TLS_OFFSET_FWPRINTF_BUF (PXCH_TLS_OFFSET_FWPRINTF_W_BUF + sizeof(wchar_t[PXCH_MAX_FWPRINTF_BUFSIZE])) - -#define PXCH_TLS_TOTAL_SIZE (PXCH_TLS_OFFSET_FORMAT_HOST_PORT_BUF + sizeof(wchar_t[PXCH_MAX_FORMAT_HOST_PORT_BUFSIZE])) +#define PXCH_TLS_TOTAL_SIZE (PXCH_TLS_OFFSET_FWPRINTF_BUF + sizeof(char[PXCH_MAX_FWPRINTF_BUFSIZE])) #define PXCH_TLS_PTR_LOG_SZLOGLINE_BY_BASE(base) ((wchar_t*)((char*)base + PXCH_TLS_OFFSET_LOG_SZLOGLINE)) @@ -67,6 +68,8 @@ extern const PXCH_UINT32 g_dwW32SystemTimeSize; #define PXCH_TLS_PTR_DUMP_MEMORY_BUF_BY_BASE(base) ((wchar_t*)((char*)base + PXCH_TLS_OFFSET_DUMP_MEMORY_BUF)) #define PXCH_TLS_PTR_ERROR_MESSAGE_BUF_BY_BASE(base) ((wchar_t*)((char*)base + PXCH_TLS_OFFSET_ERROR_MESSAGE_BUF)) #define PXCH_TLS_PTR_FORMAT_HOST_PORT_BUF_BY_BASE(base) ((wchar_t*)((char*)base + PXCH_TLS_OFFSET_FORMAT_HOST_PORT_BUF)) +#define PXCH_TLS_PTR_FORMAT_FWPRINTF_W_BUF_BY_BASE(base) ((wchar_t*)((char*)base + PXCH_TLS_OFFSET_FWPRINTF_W_BUF)) +#define PXCH_TLS_PTR_FORMAT_FWPRINTF_BUF_BY_BASE(base) ((char*)((char*)base + PXCH_TLS_OFFSET_FWPRINTF_BUF)) #define PXCH_TLS_PTR_LOG_SZLOGLINE(dwTlsIndex) PXCH_TLS_PTR_LOG_SZLOGLINE_BY_BASE(TlsGetValue(dwTlsIndex)) #define PXCH_TLS_PTR_LOG_MSG(dwTlsIndex) PXCH_TLS_PTR_LOG_MSG_BY_BASE(TlsGetValue(dwTlsIndex)) @@ -79,4 +82,6 @@ extern const PXCH_UINT32 g_dwW32SystemTimeSize; #define PXCH_TLS_PTR_LOG_ODS_BUF(dwTlsIndex) PXCH_TLS_PTR_LOG_ODS_BUF_BY_BASE(TlsGetValue(dwTlsIndex)) #define PXCH_TLS_PTR_DUMP_MEMORY_BUF(dwTlsIndex) PXCH_TLS_PTR_DUMP_MEMORY_BUF_BY_BASE(TlsGetValue(dwTlsIndex)) #define PXCH_TLS_PTR_ERROR_MESSAGE_BUF(dwTlsIndex) PXCH_TLS_PTR_ERROR_MESSAGE_BUF_BY_BASE(TlsGetValue(dwTlsIndex)) -#define PXCH_TLS_PTR_FORMAT_HOST_PORT_BUF(dwTlsIndex) PXCH_TLS_PTR_FORMAT_HOST_PORT_BUF_BY_BASE(TlsGetValue(dwTlsIndex)) \ No newline at end of file +#define PXCH_TLS_PTR_FORMAT_HOST_PORT_BUF(dwTlsIndex) PXCH_TLS_PTR_FORMAT_HOST_PORT_BUF_BY_BASE(TlsGetValue(dwTlsIndex)) +#define PXCH_TLS_PTR_FORMAT_FWPRINTF_W_BUF(dwTlsIndex) PXCH_TLS_PTR_FORMAT_FWPRINTF_W_BUF_BY_BASE(TlsGetValue(dwTlsIndex)) +#define PXCH_TLS_PTR_FORMAT_FWPRINTF_BUF(dwTlsIndex) PXCH_TLS_PTR_FORMAT_FWPRINTF_BUF_BY_BASE(TlsGetValue(dwTlsIndex)) diff --git a/include/version.h b/include/version.h index b3643df..6a5c188 100644 --- a/include/version.h +++ b/include/version.h @@ -23,5 +23,5 @@ #define PXCH_VERSION_MINOR 4 #endif #ifndef PXCH_VERSION_PATCH -#define PXCH_VERSION_PATCH 4 +#define PXCH_VERSION_PATCH 5 #endif \ No newline at end of file diff --git a/proxychains.exe.sln b/proxychains.exe.sln index c0e10bb..4e5d715 100644 --- a/proxychains.exe.sln +++ b/proxychains.exe.sln @@ -3,16 +3,10 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29613.14 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "proxychains_common", "proxychains_common\proxychains_common.vcxproj", "{D7744E4C-B1F8-495B-BDD4-DCDB0738B2BE}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "proxychains.exe", "proxychains.exe\proxychains.exe.vcxproj", "{3F3F5D43-FEE4-4656-A992-D4D0371E303D}" - ProjectSection(ProjectDependencies) = postProject - {D7744E4C-B1F8-495B-BDD4-DCDB0738B2BE} = {D7744E4C-B1F8-495B-BDD4-DCDB0738B2BE} - EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "proxychains_hook.dll", "proxychains_hook.dll\proxychains_hook.dll.vcxproj", "{FDBD3C8E-2DDF-4BBB-A157-0CB0054D5782}" ProjectSection(ProjectDependencies) = postProject - {D7744E4C-B1F8-495B-BDD4-DCDB0738B2BE} = {D7744E4C-B1F8-495B-BDD4-DCDB0738B2BE} {91EF5C95-F872-47AE-B045-C39C7DBE2FF0} = {91EF5C95-F872-47AE-B045-C39C7DBE2FF0} EndProjectSection EndProject @@ -30,14 +24,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D7744E4C-B1F8-495B-BDD4-DCDB0738B2BE}.Debug|x64.ActiveCfg = Debug|x64 - {D7744E4C-B1F8-495B-BDD4-DCDB0738B2BE}.Debug|x64.Build.0 = Debug|x64 - {D7744E4C-B1F8-495B-BDD4-DCDB0738B2BE}.Debug|x86.ActiveCfg = Debug|Win32 - {D7744E4C-B1F8-495B-BDD4-DCDB0738B2BE}.Debug|x86.Build.0 = Debug|Win32 - {D7744E4C-B1F8-495B-BDD4-DCDB0738B2BE}.Release|x64.ActiveCfg = Release|x64 - {D7744E4C-B1F8-495B-BDD4-DCDB0738B2BE}.Release|x64.Build.0 = Release|x64 - {D7744E4C-B1F8-495B-BDD4-DCDB0738B2BE}.Release|x86.ActiveCfg = Release|Win32 - {D7744E4C-B1F8-495B-BDD4-DCDB0738B2BE}.Release|x86.Build.0 = Release|Win32 {3F3F5D43-FEE4-4656-A992-D4D0371E303D}.Debug|x64.ActiveCfg = Debug|x64 {3F3F5D43-FEE4-4656-A992-D4D0371E303D}.Debug|x64.Build.0 = Debug|x64 {3F3F5D43-FEE4-4656-A992-D4D0371E303D}.Debug|x86.ActiveCfg = Debug|Win32 diff --git a/proxychains.exe/proxychains.exe.vcxproj b/proxychains.exe/proxychains.exe.vcxproj index 542771f..ace85cb 100644 --- a/proxychains.exe/proxychains.exe.vcxproj +++ b/proxychains.exe/proxychains.exe.vcxproj @@ -248,26 +248,24 @@ + - - {d7744e4c-b1f8-495b-bdd4-dcdb0738b2be} - {fdbd3c8e-2ddf-4bbb-a157-0cb0054d5782} - - + + - - + + diff --git a/proxychains.exe/proxychains.exe.vcxproj.filters b/proxychains.exe/proxychains.exe.vcxproj.filters index 367bfbb..2855191 100644 --- a/proxychains.exe/proxychains.exe.vcxproj.filters +++ b/proxychains.exe/proxychains.exe.vcxproj.filters @@ -24,12 +24,15 @@ Sources + + Sources + - + Headers - + Headers @@ -41,12 +44,6 @@ Headers - - Headers - - - Headers - Headers @@ -83,5 +80,11 @@ Headers + + Headers + + + Headers + \ No newline at end of file diff --git a/proxychains_common/proxychains_common.vcxproj.filters b/proxychains_common/proxychains_common.vcxproj.filters index 4925873..9dff525 100644 --- a/proxychains_common/proxychains_common.vcxproj.filters +++ b/proxychains_common/proxychains_common.vcxproj.filters @@ -21,7 +21,7 @@ Sources - + Sources diff --git a/proxychains_helper/proxychains_helper.vcxproj b/proxychains_helper/proxychains_helper.vcxproj index 991612a..6d3f67e 100644 --- a/proxychains_helper/proxychains_helper.vcxproj +++ b/proxychains_helper/proxychains_helper.vcxproj @@ -46,10 +46,10 @@ - - + + @@ -58,11 +58,6 @@ - - - {d7744e4c-b1f8-495b-bdd4-dcdb0738b2be} - - 16.0 {91EF5C95-F872-47AE-B045-C39C7DBE2FF0} diff --git a/proxychains_helper/proxychains_helper.vcxproj.filters b/proxychains_helper/proxychains_helper.vcxproj.filters index e59a467..f1540be 100644 --- a/proxychains_helper/proxychains_helper.vcxproj.filters +++ b/proxychains_helper/proxychains_helper.vcxproj.filters @@ -32,9 +32,6 @@ Header Files - - Header Files - Header Files @@ -44,9 +41,6 @@ Header Files - - Header Files - Header Files @@ -56,5 +50,11 @@ Header Files + + Header Files + + + Header Files + \ No newline at end of file diff --git a/proxychains_hook.dll/proxychains_hook.dll.vcxproj b/proxychains_hook.dll/proxychains_hook.dll.vcxproj index 7bf7ca8..38ad4ad 100644 --- a/proxychains_hook.dll/proxychains_hook.dll.vcxproj +++ b/proxychains_hook.dll/proxychains_hook.dll.vcxproj @@ -204,36 +204,32 @@ - + - - + + + {f142a341-5ee0-442d-a15f-98ae9b48dbae} - - {d7744e4c-b1f8-495b-bdd4-dcdb0738b2be} - - - - - + + - - + + diff --git a/proxychains_hook.dll/proxychains_hook.dll.vcxproj.filters b/proxychains_hook.dll/proxychains_hook.dll.vcxproj.filters index 56413e0..ae578e7 100644 --- a/proxychains_hook.dll/proxychains_hook.dll.vcxproj.filters +++ b/proxychains_hook.dll/proxychains_hook.dll.vcxproj.filters @@ -15,7 +15,7 @@ - + Sources @@ -33,10 +33,13 @@ Sources - + Sources - + + Sources + + Sources @@ -47,12 +50,6 @@ Headers - - Headers - - - Headers - Headers @@ -71,10 +68,10 @@ Headers - + Headers - + Headers @@ -86,10 +83,10 @@ Headers - + Headers - + Headers diff --git a/src/common.c b/src/common.c deleted file mode 100644 index 8a005bb..0000000 --- a/src/common.c +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* common.c - * Copyright (C) 2020 Feng Shun. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License version 2 for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program. If not, see - * . - */ -#include "common_win32.h" -#include "tls_generic.h" - -PXCH_UINT32 g_dwTlsIndex; -const PXCH_UINT32 g_dwW32SystemTimeSize = sizeof(SYSTEMTIME); - -wchar_t g_szDumpMemoryBuf_early[PXCH_MAX_DUMP_MEMORY_BUFSIZE]; -wchar_t g_szErrorMessageBuf_early[PXCH_MAX_ERROR_MESSAGE_BUFSIZE]; - -static WCHAR szFwprintfWbuf[PXCH_MAX_FWPRINTF_BUFSIZE]; -static CHAR szFwprintfBuf[PXCH_MAX_FWPRINTF_BUFSIZE]; - -const wchar_t* g_szRuleTargetDesc[3] = { - L"DIRECT", - L"PROXY", - L"BLOCK", -}; - -void StdVwprintf(DWORD dwStdHandle, const WCHAR* fmt, va_list args) -{ - HANDLE h; - STRSAFE_LPWSTR pEnd = szFwprintfWbuf; - int iBufSize; - DWORD cbWritten; - - szFwprintfWbuf[0] = L'\0'; - szFwprintfBuf[0] = '\0'; - -#ifdef __CYGWIN__ - pEnd = szFwprintfWbuf + newlib_vswprintf(szFwprintfWbuf, _countof(szFwprintfWbuf), fmt, args); -#else - StringCchVPrintfExW(szFwprintfWbuf, _countof(szFwprintfWbuf), &pEnd, NULL, 0, fmt, args); -#endif - - if (pEnd < szFwprintfWbuf) pEnd = szFwprintfWbuf; - - if (szFwprintfWbuf[_countof(szFwprintfWbuf) - 2]) szFwprintfWbuf[_countof(szFwprintfWbuf) - 2] = L'\n'; - szFwprintfWbuf[_countof(szFwprintfWbuf) - 1] = L'\0'; - iBufSize = WideCharToMultiByte(CP_ACP, 0, szFwprintfWbuf, (int)(pEnd - szFwprintfWbuf), szFwprintfBuf, _countof(szFwprintfBuf), NULL, NULL); - szFwprintfBuf[_countof(szFwprintfBuf) - 1] = '\0'; - - h = GetStdHandle(dwStdHandle); - if (h && h != INVALID_HANDLE_VALUE) WriteFile(h, szFwprintfBuf, iBufSize, &cbWritten, NULL); -} - -void StdWprintf(DWORD dwStdHandle, const WCHAR* fmt, ...) -{ - va_list args; - va_start(args, fmt); - StdVwprintf(dwStdHandle, fmt, args); - va_end(args); -} - -void StdFlush(DWORD dwStdHandle) -{ - HANDLE h; - - h = GetStdHandle(dwStdHandle); - if (h) FlushFileBuffers(h); -} - -PWCHAR FormatErrorToStr(DWORD dwError) -{ - DWORD dwCb; - HLOCAL hLocalBuffer; - HMODULE hDll; - - DWORD neutralLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL); - dwCb = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwError, neutralLocale, (LPWSTR)&hLocalBuffer, 0, NULL); - if (dwCb) goto after_fmt; - - // Might be a network error - hDll = LoadLibraryExW(L"netmsg.dll", NULL, DONT_RESOLVE_DLL_REFERENCES); - - if (hDll != NULL) { - dwCb = FormatMessageW(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, hDll, dwError, neutralLocale, (LPWSTR)&hLocalBuffer, 0, NULL); - FreeLibrary(hDll); - } - -after_fmt: - if (dwCb && hLocalBuffer != NULL) { - PWSTR buf = (PWSTR)LocalLock(hLocalBuffer); - if (buf[dwCb - 1] == L'\n') { - buf[dwCb - 1] = L'\0'; - } - if (buf[dwCb - 2] == L'\r') { - buf[dwCb - 2] = L'\0'; - } - StringCchPrintfW(g_szErrorMessageBuf, PXCH_MAX_ERROR_MESSAGE_BUFSIZE, L"%ls(" WPRDW L")", buf, dwError); - LocalFree(hLocalBuffer); - } - else { - StringCchPrintfW(g_szErrorMessageBuf, PXCH_MAX_ERROR_MESSAGE_BUFSIZE, L"(" WPRDW L")", dwError); - } - return g_szErrorMessageBuf; -} - -const wchar_t* DumpMemory(const void* p, int iLength) -{ - int i; - wchar_t* pDumpMemoryBuf = g_szDumpMemoryBuf; - - if (iLength == 0) iLength = 64; - for (i = 0; i < iLength; i++) { - StringCchPrintfExW(pDumpMemoryBuf, PXCH_MAX_DUMP_MEMORY_BUFSIZE - (pDumpMemoryBuf - g_szDumpMemoryBuf), &pDumpMemoryBuf, NULL, 0, L"%02x ", (unsigned int)*((const unsigned char*)p + i)); - } - return g_szDumpMemoryBuf; -} diff --git a/src/common_wsock.c b/src/common_wsock.c deleted file mode 100644 index c258d5b..0000000 --- a/src/common_wsock.c +++ /dev/null @@ -1,149 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* common_wsock.c - * Copyright (C) 2020 Feng Shun. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License version 2 for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program. If not, see - * . - */ -#define PXCH_DO_NOT_INCLUDE_STD_HEADERS_NOW -#define PXCH_DO_NOT_INCLUDE_STRSAFE_NOW -#include "includes_win32.h" -#include "defines_win32.h" -#include -#include -#include -#include -#include - -#include "common_win32.h" -#include "log_generic.h" - -const PXCH_UINT32 g_dwW32HostentSize = sizeof(struct hostent); - -wchar_t g_szFormatHostPortBuf_early[PXCH_MAX_FORMAT_HOST_PORT_BUFSIZE]; - -const wchar_t* FormatHostPortToStr(const void* pHostPort, int iAddrLen) -{ - DWORD dwLen; - dwLen = PXCH_MAX_FORMAT_HOST_PORT_BUFSIZE; - g_szFormatHostPortBuf[0] = L'\0'; - - if (HostIsType(HOSTNAME, *(PXCH_HOST*)pHostPort)) { - if (((PXCH_HOSTNAME*)pHostPort)->wPort) { - StringCchPrintfW(g_szFormatHostPortBuf, dwLen, L"%ls:%hu", ((PXCH_HOSTNAME*)pHostPort)->szValue, ntohs(((PXCH_HOSTNAME*)pHostPort)->wPort)); - } else { - StringCchPrintfW(g_szFormatHostPortBuf, dwLen, L"%ls", ((PXCH_HOSTNAME*)pHostPort)->szValue); - } - } else { - WSAAddressToStringW((struct sockaddr*)(pHostPort), iAddrLen, NULL, g_szFormatHostPortBuf, &dwLen); - } - return g_szFormatHostPortBuf; -} - -void IndexToIp(const PROXYCHAINS_CONFIG* pPxchConfig, PXCH_IP_ADDRESS* pIp, PXCH_UINT32 iIndex) -{ - PXCH_HOST* pHost = (PXCH_HOST*)pIp; - if (HostIsType(IPV4, *pHost)) { - struct sockaddr_in* pIpv4 = (struct sockaddr_in*)pIp; - ZeroMemory(pIp, sizeof(PXCH_IP_ADDRESS)); - pIpv4->sin_family = PXCH_HOST_TYPE_IPV4; - PXCH_UINT32 dwMaskInvert; - PXCH_UINT32 dwToShift = pPxchConfig->dwFakeIpv4PrefixLength > 32 ? 0 : 32 - pPxchConfig->dwFakeIpv4PrefixLength; - - pIpv4->sin_addr = ((struct sockaddr_in*) & pPxchConfig->FakeIpv4Range)->sin_addr; - dwMaskInvert = htonl((PXCH_UINT32)((((PXCH_UINT64)1) << dwToShift) - 1)); - pIpv4->sin_addr.s_addr &= ~dwMaskInvert; - pIpv4->sin_addr.s_addr |= (htonl(iIndex) & dwMaskInvert); - goto out_succ; - } - - if (HostIsType(IPV6, *pHost)) { - struct sockaddr_in6* pIpv6 = (struct sockaddr_in6*)pIp; - ZeroMemory(pIp, sizeof(PXCH_IP_ADDRESS)); - pIpv6->sin6_family = PXCH_HOST_TYPE_IPV6; - struct { - PXCH_UINT64 First64; - PXCH_UINT64 Last64; - } MaskInvert, * pIpv6AddrInQwords; - - PXCH_UINT32 dwToShift = pPxchConfig->dwFakeIpv6PrefixLength > 128 ? 0 : 128 - pPxchConfig->dwFakeIpv6PrefixLength; - PXCH_UINT32 dwShift1 = dwToShift >= 64 ? 64 : dwToShift; - PXCH_UINT32 dwShift2 = dwToShift >= 64 ? (dwToShift - 64) : 0; - - MaskInvert.Last64 = dwShift1 == 64 ? 0xFFFFFFFFFFFFFFFFU : ((((PXCH_UINT64)1) << dwShift1) - 1); - MaskInvert.First64 = dwShift2 == 64 ? 0xFFFFFFFFFFFFFFFFU : ((((PXCH_UINT64)1) << dwShift2) - 1); - - if (LITTLEENDIAN) { - MaskInvert.Last64 = _byteswap_uint64(MaskInvert.Last64); - MaskInvert.First64 = _byteswap_uint64(MaskInvert.First64); - } - - - pIpv6->sin6_addr = ((struct sockaddr_in6*) & pPxchConfig->FakeIpv6Range)->sin6_addr; - pIpv6AddrInQwords = (void*)&pIpv6->sin6_addr; - pIpv6AddrInQwords->First64 &= ~MaskInvert.First64; - pIpv6AddrInQwords->Last64 &= ~MaskInvert.Last64; - pIpv6AddrInQwords->Last64 |= (_byteswap_uint64((PXCH_UINT64)iIndex) & MaskInvert.Last64); - goto out_succ; - } - return; - -out_succ: - ; -} - -void IpToIndex(const PROXYCHAINS_CONFIG* pPxchConfig, PXCH_UINT32* piIndex, const PXCH_IP_ADDRESS* pIp) -{ - PXCH_HOST* pHost = (PXCH_HOST*)pIp; - if (HostIsType(IPV4, *pHost)) { - struct sockaddr_in* pIpv4 = (struct sockaddr_in*)pIp; - PXCH_UINT32 dwMaskInvert; - PXCH_UINT32 dwToShift = pPxchConfig->dwFakeIpv4PrefixLength > 32 ? 0 : 32 - pPxchConfig->dwFakeIpv4PrefixLength; - - dwMaskInvert = htonl((PXCH_UINT32)((((PXCH_UINT64)1) << dwToShift) - 1)); - *piIndex = pIpv4->sin_addr.s_addr & dwMaskInvert; - goto out_succ; - } - - if (HostIsType(IPV6, *pHost)) { - struct sockaddr_in6* pIpv6 = (struct sockaddr_in6*)pIp; - struct { - PXCH_UINT64 First64; - PXCH_UINT64 Last64; - } MaskInvert, * pIpv6AddrInQwords; - - PXCH_UINT32 dwToShift = pPxchConfig->dwFakeIpv6PrefixLength > 128 ? 0 : 128 - pPxchConfig->dwFakeIpv6PrefixLength; - PXCH_UINT32 dwShift1 = dwToShift >= 64 ? 64 : dwToShift; - PXCH_UINT32 dwShift2 = dwToShift >= 64 ? (dwToShift - 64) : 0; - - MaskInvert.Last64 = dwShift1 == 64 ? 0xFFFFFFFFFFFFFFFFU : ((((PXCH_UINT64)1) << dwShift1) - 1); - MaskInvert.First64 = dwShift2 == 64 ? 0xFFFFFFFFFFFFFFFFU : ((((PXCH_UINT64)1) << dwShift2) - 1); - - if (LITTLEENDIAN) { - MaskInvert.Last64 = _byteswap_uint64(MaskInvert.Last64); - MaskInvert.First64 = _byteswap_uint64(MaskInvert.First64); - } - - pIpv6AddrInQwords = (void*)&pIpv6->sin6_addr; - - *piIndex = (PXCH_UINT32)(pIpv6AddrInQwords->Last64 & MaskInvert.Last64); - goto out_succ; - } - - *piIndex = -1; - return; - -out_succ: - ; -} \ No newline at end of file diff --git a/src/dll/dllutil_log_func.c b/src/dll/dllutil_log_func.c deleted file mode 100644 index 6557740..0000000 --- a/src/dll/dllutil_log_func.c +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* dllutil_log_func.c - * Copyright (C) 2020 Feng Shun. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License version 2 for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program. If not, see - * . - */ -#include "log_win32.h" -#include "tls_generic.h" -#include "hookdll_generic.h" - -WCHAR log_ods_buf_early[PXCH_LOG_ODS_BUFSIZE]; - -void pxchlog_ipc_func_e(const wchar_t* prefix_fmt, const wchar_t* ipc_prefix_fmt, const wchar_t* fmt, ...) -{ - va_list args; - - PXCH_LOG_IPC_PID_QUERY(); - if (g_pPxchConfig && log_pid == g_pPxchConfig->dwMasterProcessId) { - GetLocalTime(&log_time); - StdWprintf(STD_ERROR_HANDLE, prefix_fmt, log_time.wYear, log_time.wMonth, log_time.wDay, log_time.wHour, log_time.wMinute, log_time.wSecond); - va_start(args, fmt); - StdVwprintf(STD_ERROR_HANDLE, fmt, args); - va_end(args); - StdFlush(STD_ERROR_HANDLE); - } else { - wchar_t* p = log_szLogLine; - - GetLocalTime(&log_time); - log_szLogLine[0] = L'\0'; - StringCchPrintfExW(log_szLogLine, PXCH_MAX_FWPRINTF_BUFSIZE, &p, NULL, 0, ipc_prefix_fmt, PXCH_LOG_IPC_PID_VALUE, log_time.wYear, log_time.wMonth, log_time.wDay, log_time.wHour, log_time.wMinute, log_time.wSecond); - - va_start(args, fmt); - StringCchVPrintfExW(p, PXCH_MAX_FWPRINTF_BUFSIZE - (p - log_szLogLine), NULL, NULL, 0, fmt, args); - va_end(args); - - if (log_szLogLine[PXCH_MAX_FWPRINTF_BUFSIZE - 2]) log_szLogLine[PXCH_MAX_FWPRINTF_BUFSIZE - 2] = L'\n'; - log_szLogLine[PXCH_MAX_FWPRINTF_BUFSIZE - 1] = L'\0'; - - WstrToMessage(log_msg, &log_cbMsgSize, log_szLogLine); - IpcCommunicateWithServer(log_msg, log_cbMsgSize, log_respMsg, &log_cbRespMsgSize); - } -} - -void pxchlog_ipc_func(const wchar_t* prefix_fmt, const wchar_t* ipc_prefix_fmt, const wchar_t* fmt, ...) -{ - va_list args; - - PXCH_LOG_IPC_PID_QUERY(); - if (g_pPxchConfig && log_pid == g_pPxchConfig->dwMasterProcessId) { - GetLocalTime(&log_time); - StdWprintf(STD_OUTPUT_HANDLE, prefix_fmt, log_time.wYear, log_time.wMonth, log_time.wDay, log_time.wHour, log_time.wMinute, log_time.wSecond); - va_start(args, fmt); - StdVwprintf(STD_OUTPUT_HANDLE, fmt, args); - va_end(args); - StdFlush(STD_OUTPUT_HANDLE); - } else { - wchar_t* p = log_szLogLine; - - GetLocalTime(&log_time); - log_szLogLine[0] = L'\0'; - StringCchPrintfExW(log_szLogLine, PXCH_MAX_FWPRINTF_BUFSIZE, &p, NULL, 0, ipc_prefix_fmt, PXCH_LOG_IPC_PID_VALUE, log_time.wYear, log_time.wMonth, log_time.wDay, log_time.wHour, log_time.wMinute, log_time.wSecond); - - va_start(args, fmt); - StringCchVPrintfExW(p, PXCH_MAX_FWPRINTF_BUFSIZE - (p - log_szLogLine), NULL, NULL, 0, fmt, args); - va_end(args); - - if (log_szLogLine[PXCH_MAX_FWPRINTF_BUFSIZE - 2]) log_szLogLine[PXCH_MAX_FWPRINTF_BUFSIZE - 2] = L'\n'; - log_szLogLine[PXCH_MAX_FWPRINTF_BUFSIZE - 1] = L'\0'; - - WstrToMessage(log_msg, &log_cbMsgSize, log_szLogLine); - IpcCommunicateWithServer(log_msg, log_cbMsgSize, log_respMsg, &log_cbRespMsgSize); - } -} diff --git a/src/dll/hook_connect_win32.c b/src/dll/hook_connect_win32.c index 298410f..7e17642 100644 --- a/src/dll/hook_connect_win32.c +++ b/src/dll/hook_connect_win32.c @@ -20,14 +20,13 @@ #define PXCH_DO_NOT_INCLUDE_STRSAFE_NOW #define PXCH_INCLUDE_WINSOCK_UTIL #include "includes_win32.h" -#include "common_win32.h" #include #include #include #include #include #include -#include "hookdll_interior_win32.h" +#include "hookdll_util_win32.h" #include "log_generic.h" #include "tls_win32.h" #include diff --git a/src/dll/hook_createprocess_win32.c b/src/dll/hook_createprocess_win32.c index 9a4b6c8..7559163 100644 --- a/src/dll/hook_createprocess_win32.c +++ b/src/dll/hook_createprocess_win32.c @@ -16,8 +16,7 @@ * version 2 along with this program. If not, see * . */ -#include "common_win32.h" -#include "hookdll_interior_win32.h" +#include "hookdll_util_win32.h" #include "log_win32.h" #include "hookdll_win32.h" diff --git a/src/dll/hook_installer.c b/src/dll/hook_installer.c index 419589a..525eb1b 100644 --- a/src/dll/hook_installer.c +++ b/src/dll/hook_installer.c @@ -19,11 +19,10 @@ #define PXCH_DO_NOT_INCLUDE_STD_HEADERS_NOW #define PXCH_DO_NOT_INCLUDE_STRSAFE_NOW #include "includes_win32.h" -#include "common_win32.h" #include #include #include -#include "hookdll_interior_win32.h" +#include "hookdll_util_win32.h" #include "log_win32.h" #include diff --git a/src/dll/dllmain.c b/src/dll/hookdll_main.c similarity index 93% rename from src/dll/dllmain.c rename to src/dll/hookdll_main.c index cce8200..2fb32ae 100644 --- a/src/dll/dllmain.c +++ b/src/dll/hookdll_main.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-or-later -/* dllmain.c +/* hookdll_main.c * Copyright (C) 2020 Feng Shun. * * This program is free software: you can redistribute it and/or modify @@ -19,17 +19,30 @@ #define _CRT_SECURE_NO_WARNINGS #include "defines_win32.h" #include "log_win32.h" -#include "hookdll_interior_win32.h" +#include "hookdll_util_win32.h" #include #include "hookdll_win32.h" +#if defined(_M_X64) || defined(__x86_64__) || !defined(__CYGWIN__) #ifdef _DEBUG -#include "remote_func_bin_x86d.h" #include "remote_func_bin_x64d.h" -#else -#include "remote_func_bin_x86.h" +#else // _DEBUG #include "remote_func_bin_x64.h" -#endif +#endif // _DEBUG +#else // defined(_M_X64) || defined(__x86_64__) || !defined(__CYGWIN__) +static const char g_RemoteFuncX64[1]; +#endif // defined(_M_X64) || defined(__x86_64__) || !defined(__CYGWIN__) + +#if !(defined(_M_X64) || defined(__x86_64__)) || !defined(__CYGWIN__) +#ifdef _DEBUG +#include "remote_func_bin_x86d.h" +#else // _DEBUG +#include "remote_func_bin_x86.h" +#endif // _DEBUG +#else // !(defined(_M_X64) || defined(__x86_64__)) || !defined(__CYGWIN__) +static const char g_RemoteFuncX86[1]; +#endif // !(defined(_M_X64) || defined(__x86_64__)) || !defined(__CYGWIN__) + PXCH_INJECT_REMOTE_DATA* g_pRemoteData; PXCH_DLL_API PROXYCHAINS_CONFIG* g_pPxchConfig; @@ -355,9 +368,10 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) } // No break: initailize the index for the main thread. case DLL_THREAD_ATTACH: - pvData = HeapAlloc(GetProcessHeap(), 0, PXCH_TLS_TOTAL_SIZE); - TlsSetValue(g_dwTlsIndex, pvData); - ODBGSTRLOG(L"Initialized TLS: g_dwTlsIndex = " WPRDW, g_dwTlsIndex); + if (g_dwTlsIndex != TLS_OUT_OF_INDEXES) { + pvData = HeapAlloc(GetProcessHeap(), 0, PXCH_TLS_TOTAL_SIZE); + TlsSetValue(g_dwTlsIndex, pvData); + } break; case DLL_THREAD_DETACH: diff --git a/src/dll/hookdll_util.c b/src/dll/hookdll_util.c new file mode 100644 index 0000000..7ac5172 --- /dev/null +++ b/src/dll/hookdll_util.c @@ -0,0 +1,210 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* hookdll_util.c + * Copyright (C) 2020 Feng Shun. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License version 2 for more details. + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program. If not, see + * . + */ +#include "log_win32.h" +#include "tls_generic.h" +#include "hookdll_generic.h" +#include "hookdll_util_win32.h" + +PXCH_DLL_API PXCH_UINT32 g_dwTlsIndex = TLS_OUT_OF_INDEXES; +PXCH_DLL_API const PXCH_UINT32 g_dwW32SystemTimeSize = sizeof(SYSTEMTIME); + +PXCH_DLL_API SYSTEMTIME log_time_early; +PXCH_DLL_API wchar_t log_szLogLine_early[PXCH_MAX_FWPRINTF_BUFSIZE] = { 0 }; +PXCH_DLL_API SYSTEMTIME log_time_early; +PXCH_DLL_API PXCH_IPC_MSGBUF log_msg_early; +PXCH_DLL_API PXCH_IPC_MSGBUF log_respMsg_early; +PXCH_DLL_API PXCH_UINT32 log_cbMsgSize_early; +PXCH_DLL_API PXCH_UINT32 log_cbRespMsgSize_early; +PXCH_DLL_API PXCH_UINT32 log_pid_early; +PXCH_DLL_API PXCH_UINT32 log_tid_early; +PXCH_DLL_API wchar_t log_ods_buf_early[PXCH_LOG_ODS_BUFSIZE]; +#ifdef __CYGWIN__ +PXCH_DLL_API PXCH_UINT32 log_cygpid_early; +#endif +PXCH_DLL_API WCHAR log_ods_buf_early[PXCH_LOG_ODS_BUFSIZE]; + +PXCH_DLL_API wchar_t g_szDumpMemoryBuf_early[PXCH_MAX_DUMP_MEMORY_BUFSIZE]; +PXCH_DLL_API wchar_t g_szErrorMessageBuf_early[PXCH_MAX_ERROR_MESSAGE_BUFSIZE]; + +PXCH_DLL_API wchar_t g_szFwprintfWbuf_early[PXCH_MAX_FWPRINTF_BUFSIZE]; +PXCH_DLL_API char g_szFwprintfBuf_early[PXCH_MAX_FWPRINTF_BUFSIZE]; + +const wchar_t* g_szRuleTargetDesc[3] = { + L"DIRECT", + L"PROXY", + L"BLOCK", +}; + + +void pxchlog_ipc_func_e(const wchar_t* prefix_fmt, const wchar_t* ipc_prefix_fmt, const wchar_t* fmt, ...) +{ + va_list args; + + PXCH_LOG_IPC_PID_QUERY(); + if (g_pPxchConfig && log_pid == g_pPxchConfig->dwMasterProcessId) { + GetLocalTime(&log_time); + StdWprintf(STD_ERROR_HANDLE, prefix_fmt, log_time.wYear, log_time.wMonth, log_time.wDay, log_time.wHour, log_time.wMinute, log_time.wSecond); + va_start(args, fmt); + StdVwprintf(STD_ERROR_HANDLE, fmt, args); + va_end(args); + StdFlush(STD_ERROR_HANDLE); + } else { + wchar_t* p = log_szLogLine; + + GetLocalTime(&log_time); + log_szLogLine[0] = L'\0'; + StringCchPrintfExW(log_szLogLine, PXCH_MAX_FWPRINTF_BUFSIZE, &p, NULL, 0, ipc_prefix_fmt, PXCH_LOG_IPC_PID_VALUE, log_time.wYear, log_time.wMonth, log_time.wDay, log_time.wHour, log_time.wMinute, log_time.wSecond); + + va_start(args, fmt); + StringCchVPrintfExW(p, PXCH_MAX_FWPRINTF_BUFSIZE - (p - log_szLogLine), NULL, NULL, 0, fmt, args); + va_end(args); + + if (log_szLogLine[PXCH_MAX_FWPRINTF_BUFSIZE - 2]) log_szLogLine[PXCH_MAX_FWPRINTF_BUFSIZE - 2] = L'\n'; + log_szLogLine[PXCH_MAX_FWPRINTF_BUFSIZE - 1] = L'\0'; + + WstrToMessage(log_msg, &log_cbMsgSize, log_szLogLine); + IpcCommunicateWithServer(log_msg, log_cbMsgSize, log_respMsg, &log_cbRespMsgSize); + } +} + +void pxchlog_ipc_func(const wchar_t* prefix_fmt, const wchar_t* ipc_prefix_fmt, const wchar_t* fmt, ...) +{ + va_list args; + + PXCH_LOG_IPC_PID_QUERY(); + if (g_pPxchConfig && log_pid == g_pPxchConfig->dwMasterProcessId) { + GetLocalTime(&log_time); + StdWprintf(STD_OUTPUT_HANDLE, prefix_fmt, log_time.wYear, log_time.wMonth, log_time.wDay, log_time.wHour, log_time.wMinute, log_time.wSecond); + va_start(args, fmt); + StdVwprintf(STD_OUTPUT_HANDLE, fmt, args); + va_end(args); + StdFlush(STD_OUTPUT_HANDLE); + } else { + wchar_t* p = log_szLogLine; + + GetLocalTime(&log_time); + log_szLogLine[0] = L'\0'; + StringCchPrintfExW(log_szLogLine, PXCH_MAX_FWPRINTF_BUFSIZE, &p, NULL, 0, ipc_prefix_fmt, PXCH_LOG_IPC_PID_VALUE, log_time.wYear, log_time.wMonth, log_time.wDay, log_time.wHour, log_time.wMinute, log_time.wSecond); + + va_start(args, fmt); + StringCchVPrintfExW(p, PXCH_MAX_FWPRINTF_BUFSIZE - (p - log_szLogLine), NULL, NULL, 0, fmt, args); + va_end(args); + + if (log_szLogLine[PXCH_MAX_FWPRINTF_BUFSIZE - 2]) log_szLogLine[PXCH_MAX_FWPRINTF_BUFSIZE - 2] = L'\n'; + log_szLogLine[PXCH_MAX_FWPRINTF_BUFSIZE - 1] = L'\0'; + + WstrToMessage(log_msg, &log_cbMsgSize, log_szLogLine); + IpcCommunicateWithServer(log_msg, log_cbMsgSize, log_respMsg, &log_cbRespMsgSize); + } +} + + +PXCH_DLL_API void StdVwprintf(DWORD dwStdHandle, const WCHAR* fmt, va_list args) +{ + HANDLE h; + STRSAFE_LPWSTR pEnd = g_szFwprintfWbuf; + int iBufSize; + DWORD cbWritten; + + g_szFwprintfWbuf[0] = L'\0'; + g_szFwprintfBuf[0] = '\0'; + +#ifdef __CYGWIN__ + pEnd = g_szFwprintfWbuf + newlib_vswprintf(g_szFwprintfWbuf, PXCH_MAX_FWPRINTF_BUFSIZE, fmt, args); +#else + StringCchVPrintfExW(g_szFwprintfWbuf, PXCH_MAX_FWPRINTF_BUFSIZE, &pEnd, NULL, 0, fmt, args); +#endif + + if (pEnd < g_szFwprintfWbuf) pEnd = g_szFwprintfWbuf; + + if (g_szFwprintfWbuf[PXCH_MAX_FWPRINTF_BUFSIZE - 2]) g_szFwprintfWbuf[PXCH_MAX_FWPRINTF_BUFSIZE - 2] = L'\n'; + g_szFwprintfWbuf[PXCH_MAX_FWPRINTF_BUFSIZE - 1] = L'\0'; + iBufSize = WideCharToMultiByte(CP_ACP, 0, g_szFwprintfWbuf, (int)(pEnd - g_szFwprintfWbuf), g_szFwprintfBuf, PXCH_MAX_FWPRINTF_BUFSIZE, NULL, NULL); + g_szFwprintfBuf[PXCH_MAX_FWPRINTF_BUFSIZE - 1] = '\0'; + + h = GetStdHandle(dwStdHandle); + if (h && h != INVALID_HANDLE_VALUE) WriteFile(h, g_szFwprintfBuf, iBufSize, &cbWritten, NULL); +} + + +PXCH_DLL_API void StdWprintf(DWORD dwStdHandle, const WCHAR* fmt, ...) +{ + va_list args; + va_start(args, fmt); + StdVwprintf(dwStdHandle, fmt, args); + va_end(args); +} + + +PXCH_DLL_API void StdFlush(DWORD dwStdHandle) +{ + HANDLE h; + + h = GetStdHandle(dwStdHandle); + if (h && h != INVALID_HANDLE_VALUE) FlushFileBuffers(h); +} + + +PXCH_DLL_API PWCHAR FormatErrorToStr(DWORD dwError) +{ + DWORD dwCb; + HLOCAL hLocalBuffer; + HMODULE hDll; + + DWORD neutralLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL); + dwCb = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwError, neutralLocale, (LPWSTR)&hLocalBuffer, 0, NULL); + if (dwCb) goto after_fmt; + + // Might be a network error + hDll = LoadLibraryExW(L"netmsg.dll", NULL, DONT_RESOLVE_DLL_REFERENCES); + + if (hDll != NULL) { + dwCb = FormatMessageW(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, hDll, dwError, neutralLocale, (LPWSTR)&hLocalBuffer, 0, NULL); + FreeLibrary(hDll); + } + +after_fmt: + if (dwCb && hLocalBuffer != NULL) { + PWSTR buf = (PWSTR)LocalLock(hLocalBuffer); + if (buf[dwCb - 1] == L'\n') { + buf[dwCb - 1] = L'\0'; + } + if (buf[dwCb - 2] == L'\r') { + buf[dwCb - 2] = L'\0'; + } + StringCchPrintfW(g_szErrorMessageBuf, PXCH_MAX_ERROR_MESSAGE_BUFSIZE, L"%ls(" WPRDW L")", buf, dwError); + LocalFree(hLocalBuffer); + } + else { + StringCchPrintfW(g_szErrorMessageBuf, PXCH_MAX_ERROR_MESSAGE_BUFSIZE, L"(" WPRDW L")", dwError); + } + return g_szErrorMessageBuf; +} + +PXCH_DLL_API const wchar_t* DumpMemory(const void* p, int iLength) +{ + int i; + wchar_t* pDumpMemoryBuf = g_szDumpMemoryBuf; + + if (iLength == 0) iLength = 64; + for (i = 0; i < iLength; i++) { + StringCchPrintfExW(pDumpMemoryBuf, PXCH_MAX_DUMP_MEMORY_BUFSIZE - (pDumpMemoryBuf - g_szDumpMemoryBuf), &pDumpMemoryBuf, NULL, 0, L"%02x ", (unsigned int)*((const unsigned char*)p + i)); + } + return g_szDumpMemoryBuf; +} diff --git a/src/ipc_message.c b/src/dll/hookdll_util_ipc_message.c similarity index 75% rename from src/ipc_message.c rename to src/dll/hookdll_util_ipc_message.c index 8424f7a..867333a 100644 --- a/src/ipc_message.c +++ b/src/dll/hookdll_util_ipc_message.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-or-later -/* ipc_message.c +/* hookdll_util_ipc_message.c * Copyright (C) 2020 Feng Shun. * * This program is free software: you can redistribute it and/or modify @@ -16,9 +16,9 @@ * version 2 along with this program. If not, see * . */ -#include "ipc_win32.h" +#include "hookdll_util_ipc_win32.h" -PXCH_UINT32 WstrToMessage(PXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32* pcbMessageSize, const wchar_t* szWstr) +PXCH_DLL_API PXCH_UINT32 WstrToMessage(PXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32* pcbMessageSize, const wchar_t* szWstr) { PXCH_IPC_MSGHDR_WSTR* pHdr = (PXCH_IPC_MSGHDR_WSTR*)chMessageBuf; PWCHAR szWstrEnd; @@ -35,7 +35,8 @@ PXCH_UINT32 WstrToMessage(PXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32* pcbMessageS return ERROR_FUNCTION_FAILED; } -PXCH_UINT32 MessageToWstr(wchar_t* szWstr, CPXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32 cbMessageSize) + +PXCH_DLL_API PXCH_UINT32 MessageToWstr(wchar_t* szWstr, CPXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32 cbMessageSize) { const PXCH_IPC_MSGHDR_WSTR* pHdr = (const PXCH_IPC_MSGHDR_WSTR*)chMessageBuf; szWstr[0] = L'\0'; @@ -45,7 +46,8 @@ PXCH_UINT32 MessageToWstr(wchar_t* szWstr, CPXCH_IPC_MSGBUF chMessageBuf, PXCH_U return 0; } -DWORD ChildDataToMessage(PXCH_IPC_MSGBUF chMessageBuf, DWORD* pcbMessageSize, const REPORTED_CHILD_DATA* pChildData) + +PXCH_DLL_API DWORD ChildDataToMessage(PXCH_IPC_MSGBUF chMessageBuf, DWORD* pcbMessageSize, const REPORTED_CHILD_DATA* pChildData) { PXCH_IPC_MSGHDR_CHILDDATA* pHdr = (PXCH_IPC_MSGHDR_CHILDDATA*)chMessageBuf; @@ -55,7 +57,8 @@ DWORD ChildDataToMessage(PXCH_IPC_MSGBUF chMessageBuf, DWORD* pcbMessageSize, co return 0; } -DWORD MessageToChildData(REPORTED_CHILD_DATA* pChildData, CPXCH_IPC_MSGBUF chMessageBuf, DWORD cbMessageSize) + +PXCH_DLL_API DWORD MessageToChildData(REPORTED_CHILD_DATA* pChildData, CPXCH_IPC_MSGBUF chMessageBuf, DWORD cbMessageSize) { const PXCH_IPC_MSGHDR_CHILDDATA* pHdr = (const PXCH_IPC_MSGHDR_CHILDDATA*)chMessageBuf; if (!MsgIsType(CHILDDATA, chMessageBuf)) return ERROR_INVALID_PARAMETER; @@ -63,7 +66,8 @@ DWORD MessageToChildData(REPORTED_CHILD_DATA* pChildData, CPXCH_IPC_MSGBUF chMes return 0; } -DWORD QueryStorageToMessage(PXCH_IPC_MSGBUF chMessageBuf, DWORD* pcbMessageSize, DWORD dwChildPid) + +PXCH_DLL_API DWORD QueryStorageToMessage(PXCH_IPC_MSGBUF chMessageBuf, DWORD* pcbMessageSize, DWORD dwChildPid) { PXCH_IPC_MSGHDR_QUERYSTORAGE* pHdr = (PXCH_IPC_MSGHDR_QUERYSTORAGE*)chMessageBuf; @@ -73,7 +77,8 @@ DWORD QueryStorageToMessage(PXCH_IPC_MSGBUF chMessageBuf, DWORD* pcbMessageSize, return 0; } -DWORD MessageToQueryStorage(DWORD* pdwChildPid, CPXCH_IPC_MSGBUF chMessageBuf, DWORD cbMessageSize) + +PXCH_DLL_API DWORD MessageToQueryStorage(DWORD* pdwChildPid, CPXCH_IPC_MSGBUF chMessageBuf, DWORD cbMessageSize) { const PXCH_IPC_MSGHDR_QUERYSTORAGE* pHdr = (const PXCH_IPC_MSGHDR_QUERYSTORAGE*)chMessageBuf; if (!MsgIsType(QUERYSTORAGE, chMessageBuf)) return ERROR_INVALID_PARAMETER; @@ -81,7 +86,8 @@ DWORD MessageToQueryStorage(DWORD* pdwChildPid, CPXCH_IPC_MSGBUF chMessageBuf, D return 0; } -PXCH_UINT32 HostnameAndIpsToMessage(PXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32* pcbMessageSize, PXCH_UINT32 dwPid, const PXCH_HOSTNAME* Hostname, BOOL bWillMapResolvedIpToHost, PXCH_UINT32 dwIpNum, const PXCH_IP_ADDRESS* Ips, PXCH_UINT32 dwTarget) + +PXCH_DLL_API PXCH_UINT32 HostnameAndIpsToMessage(PXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32* pcbMessageSize, PXCH_UINT32 dwPid, const PXCH_HOSTNAME* Hostname, BOOL bWillMapResolvedIpToHost, PXCH_UINT32 dwIpNum, const PXCH_IP_ADDRESS* Ips, PXCH_UINT32 dwTarget) { PXCH_IPC_MSGHDR_HOSTNAMEANDIPS* pHdr = (PXCH_IPC_MSGHDR_HOSTNAMEANDIPS*)chMessageBuf; @@ -97,7 +103,8 @@ PXCH_UINT32 HostnameAndIpsToMessage(PXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32* p return 0; } -PXCH_UINT32 MessageToHostnameAndIps(PXCH_UINT32* pdwPid, PXCH_HOSTNAME* pHostname, BOOL* pbWillMapResolvedIpToHost, PXCH_UINT32* pdwIpNum, PXCH_IP_ADDRESS* Ips, PXCH_UINT32* pdwTarget, CPXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32 cbMessageSize) + +PXCH_DLL_API PXCH_UINT32 MessageToHostnameAndIps(PXCH_UINT32* pdwPid, PXCH_HOSTNAME* pHostname, BOOL* pbWillMapResolvedIpToHost, PXCH_UINT32* pdwIpNum, PXCH_IP_ADDRESS* Ips, PXCH_UINT32* pdwTarget, CPXCH_IPC_MSGBUF chMessageBuf, PXCH_UINT32 cbMessageSize) { const PXCH_IPC_MSGHDR_HOSTNAMEANDIPS* pHdr = (const PXCH_IPC_MSGHDR_HOSTNAMEANDIPS*)chMessageBuf; if (!MsgIsType(HOSTNAMEANDIPS, chMessageBuf)) return ERROR_INVALID_PARAMETER; diff --git a/src/dll/dllutil_wsock.c b/src/dll/hookdll_util_wsock.c similarity index 55% rename from src/dll/dllutil_wsock.c rename to src/dll/hookdll_util_wsock.c index 74af3ff..abce27c 100644 --- a/src/dll/dllutil_wsock.c +++ b/src/dll/hookdll_util_wsock.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-or-later -/* dllutil_wsock.c +/* hookdll_util_wsock.c * Copyright (C) 2020 Feng Shun. * * This program is free software: you can redistribute it and/or modify @@ -21,7 +21,7 @@ #define PXCH_INCLUDE_WINSOCK_UTIL #include "includes_win32.h" #include "defines_win32.h" -#include "hookdll_interior_win32.h" +#include "hookdll_util_win32.h" #include #include #include @@ -30,7 +30,129 @@ #include "tls_win32.h" #include "hookdll_win32.h" #include "ut_helpers.h" - + +PXCH_DLL_API const PXCH_UINT32 g_dwW32HostentSize = sizeof(struct hostent); +PXCH_DLL_API wchar_t g_szFormatHostPortBuf_early[PXCH_MAX_FORMAT_HOST_PORT_BUFSIZE]; + + +const wchar_t* FormatHostPortToStr(const void* pHostPort, int iAddrLen) +{ + DWORD dwLen; + dwLen = PXCH_MAX_FORMAT_HOST_PORT_BUFSIZE; + g_szFormatHostPortBuf[0] = L'\0'; + + if (HostIsType(HOSTNAME, *(PXCH_HOST*)pHostPort)) { + if (((PXCH_HOSTNAME*)pHostPort)->wPort) { + StringCchPrintfW(g_szFormatHostPortBuf, dwLen, L"%ls:%hu", ((PXCH_HOSTNAME*)pHostPort)->szValue, ntohs(((PXCH_HOSTNAME*)pHostPort)->wPort)); + } else { + StringCchPrintfW(g_szFormatHostPortBuf, dwLen, L"%ls", ((PXCH_HOSTNAME*)pHostPort)->szValue); + } + } else { + WSAAddressToStringW((struct sockaddr*)(pHostPort), iAddrLen, NULL, g_szFormatHostPortBuf, &dwLen); + } + return g_szFormatHostPortBuf; +} + + +void IndexToIp(const PROXYCHAINS_CONFIG* pPxchConfig, PXCH_IP_ADDRESS* pIp, PXCH_UINT32 iIndex) +{ + PXCH_HOST* pHost = (PXCH_HOST*)pIp; + if (HostIsType(IPV4, *pHost)) { + struct sockaddr_in* pIpv4 = (struct sockaddr_in*)pIp; + ZeroMemory(pIp, sizeof(PXCH_IP_ADDRESS)); + pIpv4->sin_family = PXCH_HOST_TYPE_IPV4; + PXCH_UINT32 dwMaskInvert; + PXCH_UINT32 dwToShift = pPxchConfig->dwFakeIpv4PrefixLength > 32 ? 0 : 32 - pPxchConfig->dwFakeIpv4PrefixLength; + + pIpv4->sin_addr = ((struct sockaddr_in*) & pPxchConfig->FakeIpv4Range)->sin_addr; + dwMaskInvert = htonl((PXCH_UINT32)((((PXCH_UINT64)1) << dwToShift) - 1)); + pIpv4->sin_addr.s_addr &= ~dwMaskInvert; + pIpv4->sin_addr.s_addr |= (htonl(iIndex) & dwMaskInvert); + goto out_succ; + } + + if (HostIsType(IPV6, *pHost)) { + struct sockaddr_in6* pIpv6 = (struct sockaddr_in6*)pIp; + ZeroMemory(pIp, sizeof(PXCH_IP_ADDRESS)); + pIpv6->sin6_family = PXCH_HOST_TYPE_IPV6; + struct { + PXCH_UINT64 First64; + PXCH_UINT64 Last64; + } MaskInvert, * pIpv6AddrInQwords; + + PXCH_UINT32 dwToShift = pPxchConfig->dwFakeIpv6PrefixLength > 128 ? 0 : 128 - pPxchConfig->dwFakeIpv6PrefixLength; + PXCH_UINT32 dwShift1 = dwToShift >= 64 ? 64 : dwToShift; + PXCH_UINT32 dwShift2 = dwToShift >= 64 ? (dwToShift - 64) : 0; + + MaskInvert.Last64 = dwShift1 == 64 ? 0xFFFFFFFFFFFFFFFFU : ((((PXCH_UINT64)1) << dwShift1) - 1); + MaskInvert.First64 = dwShift2 == 64 ? 0xFFFFFFFFFFFFFFFFU : ((((PXCH_UINT64)1) << dwShift2) - 1); + + if (LITTLEENDIAN) { + MaskInvert.Last64 = _byteswap_uint64(MaskInvert.Last64); + MaskInvert.First64 = _byteswap_uint64(MaskInvert.First64); + } + + + pIpv6->sin6_addr = ((struct sockaddr_in6*) & pPxchConfig->FakeIpv6Range)->sin6_addr; + pIpv6AddrInQwords = (void*)&pIpv6->sin6_addr; + pIpv6AddrInQwords->First64 &= ~MaskInvert.First64; + pIpv6AddrInQwords->Last64 &= ~MaskInvert.Last64; + pIpv6AddrInQwords->Last64 |= (_byteswap_uint64((PXCH_UINT64)iIndex) & MaskInvert.Last64); + goto out_succ; + } + return; + +out_succ: + ; +} + + +void IpToIndex(const PROXYCHAINS_CONFIG* pPxchConfig, PXCH_UINT32* piIndex, const PXCH_IP_ADDRESS* pIp) +{ + PXCH_HOST* pHost = (PXCH_HOST*)pIp; + if (HostIsType(IPV4, *pHost)) { + struct sockaddr_in* pIpv4 = (struct sockaddr_in*)pIp; + PXCH_UINT32 dwMaskInvert; + PXCH_UINT32 dwToShift = pPxchConfig->dwFakeIpv4PrefixLength > 32 ? 0 : 32 - pPxchConfig->dwFakeIpv4PrefixLength; + + dwMaskInvert = htonl((PXCH_UINT32)((((PXCH_UINT64)1) << dwToShift) - 1)); + *piIndex = pIpv4->sin_addr.s_addr & dwMaskInvert; + goto out_succ; + } + + if (HostIsType(IPV6, *pHost)) { + struct sockaddr_in6* pIpv6 = (struct sockaddr_in6*)pIp; + struct { + PXCH_UINT64 First64; + PXCH_UINT64 Last64; + } MaskInvert, * pIpv6AddrInQwords; + + PXCH_UINT32 dwToShift = pPxchConfig->dwFakeIpv6PrefixLength > 128 ? 0 : 128 - pPxchConfig->dwFakeIpv6PrefixLength; + PXCH_UINT32 dwShift1 = dwToShift >= 64 ? 64 : dwToShift; + PXCH_UINT32 dwShift2 = dwToShift >= 64 ? (dwToShift - 64) : 0; + + MaskInvert.Last64 = dwShift1 == 64 ? 0xFFFFFFFFFFFFFFFFU : ((((PXCH_UINT64)1) << dwShift1) - 1); + MaskInvert.First64 = dwShift2 == 64 ? 0xFFFFFFFFFFFFFFFFU : ((((PXCH_UINT64)1) << dwShift2) - 1); + + if (LITTLEENDIAN) { + MaskInvert.Last64 = _byteswap_uint64(MaskInvert.Last64); + MaskInvert.First64 = _byteswap_uint64(MaskInvert.First64); + } + + pIpv6AddrInQwords = (void*)&pIpv6->sin6_addr; + + *piIndex = (PXCH_UINT32)(pIpv6AddrInQwords->Last64 & MaskInvert.Last64); + goto out_succ; + } + + *piIndex = -1; + return; + +out_succ: + ; +} + + void HostentToHostnameAndIps(PXCH_HOSTNAME* pHostname, PXCH_UINT32* pdwIpNum, PXCH_IP_ADDRESS* Ips, const struct hostent* pHostent) { PXCH_UINT32 i; @@ -90,6 +212,7 @@ void HostnameAndIpsToHostent(struct hostent** ppHostent, void* pTlsBase, const P StringCchPrintfA(*PXCH_TLS_PTR_W32HOSTENT_HOSTNAME_BUF_BY_BASE(pTlsBase), _countof(*PXCH_TLS_PTR_W32HOSTENT_HOSTNAME_BUF_BY_BASE(pTlsBase)), "%ls", pHostname->szValue); } + void AddrInfoToIps(PXCH_UINT32* pdwIpNum, PXCH_IP_ADDRESS* Ips, const void* pAddrInfo, BOOL bIsW) { const ADDRINFOA* pAddrInfoA = pAddrInfo; @@ -113,6 +236,7 @@ void AddrInfoToIps(PXCH_UINT32* pdwIpNum, PXCH_IP_ADDRESS* Ips, const void* pAdd *pdwIpNum = i; } + void HostnameAndIpPortsToAddrInfo_WillAllocate(ADDRINFOW** ppAddrInfoW, const PXCH_HOSTNAME* pHostname, PXCH_UINT32 dwIpNum, const PXCH_IP_PORT* IpPorts, BOOL bCanonName, int iSockType, int iProtocol) { PXCH_DO_IN_CRITICAL_SECTION_RETURN_VOID{ @@ -151,4 +275,4 @@ void HostnameAndIpPortsToAddrInfo_WillAllocate(ADDRINFOW** ppAddrInfoW, const PX ppTempAddrInfoW = &pAddrInfoW->ai_next; } } -} \ No newline at end of file +} diff --git a/src/dll/ipc_client_and_child_data.c b/src/dll/ipc_client_and_child_data.c index ddd2c6d..adc0971 100644 --- a/src/dll/ipc_client_and_child_data.c +++ b/src/dll/ipc_client_and_child_data.c @@ -18,7 +18,7 @@ */ #include "defines_win32.h" #include "log_win32.h" -#include "hookdll_interior_win32.h" +#include "hookdll_util_win32.h" #include "hookdll_win32.h" diff --git a/src/exe/args_and_config.c b/src/exe/args_and_config.c index 830d11a..32f848f 100644 --- a/src/exe/args_and_config.c +++ b/src/exe/args_and_config.c @@ -31,6 +31,7 @@ #include "defines_win32.h" #include "log_win32.h" #include "hookdll_win32.h" +#include "hookdll_util_win32.h" #ifndef __CYGWIN__ #pragma comment(lib, "Shlwapi.lib") @@ -65,6 +66,18 @@ static const WCHAR* pszParseErrorMessage; +// stdlib_config_reader.c +PXCH_UINT32 OpenConfigurationFile(PROXYCHAINS_CONFIG* pPxchConfig); +PXCH_UINT32 OpenHostsFile(const WCHAR* szHostsFilePath); +PXCH_UINT32 ConfigurationFileReadLine(unsigned long long* pullLineNum, wchar_t* chBuf, size_t cbBufSize); +PXCH_UINT32 HostsFileReadLine(unsigned long long* pullHostsLineNum, wchar_t* chBuf, size_t cbBufSize); +PXCH_UINT32 CloseConfigurationFile(); +PXCH_UINT32 CloseHostsFile(); +long ConfigurationTellPos(); +void ConfigurationRewind(); +long HostsTellPos(); +void HostsRewind(); + static inline size_t SizeMin(size_t a, size_t b) { return a > b ? b : a; diff --git a/src/exe/ipc_proc_bookkeeping.c b/src/exe/ipc_proc_bookkeeping.c index 54e0a46..c05ee00 100644 --- a/src/exe/ipc_proc_bookkeeping.c +++ b/src/exe/ipc_proc_bookkeeping.c @@ -20,6 +20,7 @@ #include "log_win32.h" #include "proc_bookkeeping_win32.h" #include "hookdll_win32.h" +#include "hookdll_util_win32.h" tab_per_process_t* g_tabPerProcess; tab_fake_ip_hostname_t* g_tabFakeIpHostname; @@ -96,7 +97,7 @@ DWORD ChildProcessExitedCallbackWorker(PVOID lpParameter, BOOLEAN TimerOrWaitFir if (!GetExitCodeProcess(Entry->hProcess, &dwExitCode)) { LOGE(L"GetExitCodeProcess() error: %ls", FormatErrorToStr(GetLastError())); } - LOGI(L"Child process winpid " WPRDW L" exited (%#010x).", Entry->Data.dwPid, dwExitCode); + LOGD(L"Child process winpid " WPRDW L" exited (%#010x).", Entry->Data.dwPid, dwExitCode); LL_FOREACH_SAFE(Entry->Ips, pIpNode, pTmpIpNode) { IpHostnameAsKey.Ip = pIpNode->Ip; @@ -417,7 +418,7 @@ DWORD HandleMessage(int i, PXCH_IPC_INSTANCE* pipc) REPORTED_CHILD_DATA ChildData; LOGV(L"Message is CHILDDATA"); MessageToChildData(&ChildData, pMsg, pipc->cbRead); - LOGD(L"Child process pid " WPRDW L" created.", ChildData.dwPid); + LOGD(L"Child process winpid " WPRDW L" created.", ChildData.dwPid); LOGV(L"RegisterNewChildProcess..."); RegisterNewChildProcess(&ChildData); LOGV(L"RegisterNewChildProcess done."); diff --git a/src/exe/main.c b/src/exe/main.c index 66a9c12..2ededcd 100644 --- a/src/exe/main.c +++ b/src/exe/main.c @@ -27,6 +27,7 @@ #include "log_win32.h" #include "proc_bookkeeping_win32.h" #include "hookdll_win32.h" +#include "hookdll_util_win32.h" #ifdef __CYGWIN__ #include @@ -561,11 +562,18 @@ int main(int argc, char* const argv[], char* const envp[]) const char* szLocale; PROXYCHAINS_CONFIG TempProxychainsConfig; - // char* spawn_argv[] = { "bash.exe", NULL }; WCHAR** wargv = malloc(argc * sizeof(WCHAR*)); const void* ctx[2]; setvbuf(stderr, NULL, _IOFBF, 65536); + // WriteFile() executed inside StdWprintf() in DLL won't work??? This is a workaround. + { + DWORD cbWritten; + WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), "", 0, &cbWritten, NULL); + FlushFileBuffers(GetStdHandle(STD_OUTPUT_HANDLE)); + WriteFile(GetStdHandle(STD_ERROR_HANDLE), "", 0, &cbWritten, NULL); + FlushFileBuffers(GetStdHandle(STD_ERROR_HANDLE)); + } for (i = 0; i < argc; i++) { int iNeededChars = MultiByteToWideChar(CP_UTF8, 0, argv[i], -1, NULL, 0); diff --git a/src/log.c b/src/log.c deleted file mode 100644 index eac599f..0000000 --- a/src/log.c +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* log.c - * Copyright (C) 2020 Feng Shun. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License version 2 for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program. If not, see - * . - */ -#include "log_win32.h" - -SYSTEMTIME log_time_early; -wchar_t log_szLogLine_early[PXCH_MAX_FWPRINTF_BUFSIZE] = { 0 }; -SYSTEMTIME log_time_early; -PXCH_IPC_MSGBUF log_msg_early; -PXCH_IPC_MSGBUF log_respMsg_early; -PXCH_UINT32 log_cbMsgSize_early; -PXCH_UINT32 log_cbRespMsgSize_early; -PXCH_UINT32 log_pid_early; -PXCH_UINT32 log_tid_early; -wchar_t log_ods_buf_early[PXCH_LOG_ODS_BUFSIZE]; - -#ifdef __CYGWIN__ -PXCH_UINT32 log_cygpid_early; -#endif \ No newline at end of file diff --git a/src/stdlib_config_reader.c b/src/stdlib_config_reader.c index 5ffbe65..8ffc7cc 100644 --- a/src/stdlib_config_reader.c +++ b/src/stdlib_config_reader.c @@ -19,7 +19,7 @@ #define _CRT_SECURE_NO_WARNINGS #include "defines_win32.h" #include "log_win32.h" -#include "common_win32.h" +#include "hookdll_util_win32.h" #include #include #include @@ -29,6 +29,18 @@ static FILE* fHosts; static unsigned long long ullConfigurationLineNum; static unsigned long long ullHostsLineNum; +// stdlib_config_reader.c +PXCH_UINT32 OpenConfigurationFile(PROXYCHAINS_CONFIG* pPxchConfig); +PXCH_UINT32 OpenHostsFile(const WCHAR* szHostsFilePath); +PXCH_UINT32 ConfigurationFileReadLine(unsigned long long* pullLineNum, wchar_t* chBuf, size_t cbBufSize); +PXCH_UINT32 HostsFileReadLine(unsigned long long* pullHostsLineNum, wchar_t* chBuf, size_t cbBufSize); +PXCH_UINT32 CloseConfigurationFile(); +PXCH_UINT32 CloseHostsFile(); +long ConfigurationTellPos(); +void ConfigurationRewind(); +long HostsTellPos(); +void HostsRewind(); + PXCH_UINT32 OpenConfigurationFile(PROXYCHAINS_CONFIG* pPxchConfig) { char szTempConfigPath[PXCH_MAX_CONFIG_FILE_PATH_BUFSIZE * 2];