From c619f3370a5fb7bdd3baacc2b78fdcdad0045df1 Mon Sep 17 00:00:00 2001 From: shunf4 Date: Mon, 2 Mar 2020 22:47:27 +0800 Subject: [PATCH] update to 0.4.4 with various fixes. see below fix: finally resolved x64 -> x86 injection issue; fix: switch to non-debug runtime dlls, enabling debug versions to run on machines without dev env fix: avoid hanging when first injection fails --- .gitignore | 23 ++- .vscode/settings.json | 3 +- Configure/Configure.vcxproj.filters | 22 --- README.md | 39 +++-- README_zh-Hans.md | 10 +- cygwin-build/dist.sh | 54 ------ cygwin-build/test/spawn_ctrlc/_ctrlc.exe | Bin 164421 -> 0 bytes cygwin-build/test/spawn_ctrlc/_test.exe | Bin 165865 -> 0 bytes cygwin-build/test/sprintf/_sprintf.exe | Bin 158916 -> 0 bytes cygwin-build/windows_install.bat | 15 -- {cygwin-build => cygwin_build}/Makefile | 57 ++++--- cygwin_build/dist.sh | 69 ++++++++ {cygwin-build => cygwin_build}/test/a.sh | 0 {cygwin-build => cygwin_build}/test/b.sh | 0 {cygwin-build => cygwin_build}/test/c.sh | 0 {cygwin-build => cygwin_build}/test/d.sh | 0 {cygwin-build => cygwin_build}/test/e.sh | 0 {cygwin-build => cygwin_build}/test/f.sh | 0 .../test/fork_exec/Makefile | 0 .../test/fork_exec/test.c | 0 .../test/fork_exec/test2.c | 0 .../test/spawn_ctrlc/Makefile | 0 .../test/spawn_ctrlc/ctrlc.c | 0 .../test/spawn_ctrlc/test.c | 0 .../test/sprintf/Makefile | 0 .../test/sprintf/sprintf.c | 0 .../dist.bat => cygwin_build/win32_build.bat | 2 +- cygwin_build/win32_clean.bat | 22 +++ cygwin_build/win32_install.bat | 34 ++++ include/common_generic.h | 9 +- include/defines_generic.h | 28 +++ include/defines_win32.h | 8 - include/hookdll_win32.h | 1 - include/log_generic.h | 1 - include/log_win32.h | 1 - include/remote_win32.h | 17 +- include/tls_generic.h | 6 +- include/version.h | 2 +- proxychains.exe.sln | 10 +- proxychains.exe/proxychains.exe.vcxproj | 14 +- proxychains_common/proxychains_common.vcxproj | 2 + .../proxychains_helper.vcxproj | 61 ++++++- .../proxychains_helper.vcxproj.filters | 60 +++++++ .../proxychains_hook.dll.vcxproj | 38 ++--- .../proxychains_hook.dll.vcxproj.filters | 3 - src/common.c | 6 +- src/common_wsock.c | 3 +- src/configure.c | 53 ------ src/dll/dllmain.c | 111 ++++-------- src/dll/dllutil_log_func.c | 2 - src/dll/dllutil_wsock.c | 3 - src/dll/hook_createprocess_win32.c | 4 +- src/exe/args_and_config.c | 159 +++++++++++------- src/exe/main.c | 33 ++-- src/proxychains_helper.c | 89 ++++++++++ .../remote_function => }/remote_function.c | 16 +- test/test.cpp | 1 - 57 files changed, 649 insertions(+), 442 deletions(-) delete mode 100644 Configure/Configure.vcxproj.filters delete mode 100644 cygwin-build/dist.sh delete mode 100644 cygwin-build/test/spawn_ctrlc/_ctrlc.exe delete mode 100644 cygwin-build/test/spawn_ctrlc/_test.exe delete mode 100644 cygwin-build/test/sprintf/_sprintf.exe delete mode 100644 cygwin-build/windows_install.bat rename {cygwin-build => cygwin_build}/Makefile (71%) create mode 100644 cygwin_build/dist.sh rename {cygwin-build => cygwin_build}/test/a.sh (100%) rename {cygwin-build => cygwin_build}/test/b.sh (100%) rename {cygwin-build => cygwin_build}/test/c.sh (100%) rename {cygwin-build => cygwin_build}/test/d.sh (100%) rename {cygwin-build => cygwin_build}/test/e.sh (100%) rename {cygwin-build => cygwin_build}/test/f.sh (100%) rename {cygwin-build => cygwin_build}/test/fork_exec/Makefile (100%) rename {cygwin-build => cygwin_build}/test/fork_exec/test.c (100%) rename {cygwin-build => cygwin_build}/test/fork_exec/test2.c (100%) rename {cygwin-build => cygwin_build}/test/spawn_ctrlc/Makefile (100%) rename {cygwin-build => cygwin_build}/test/spawn_ctrlc/ctrlc.c (100%) rename {cygwin-build => cygwin_build}/test/spawn_ctrlc/test.c (100%) rename {cygwin-build => cygwin_build}/test/sprintf/Makefile (100%) rename {cygwin-build => cygwin_build}/test/sprintf/sprintf.c (100%) rename cygwin-build/dist.bat => cygwin_build/win32_build.bat (98%) create mode 100644 cygwin_build/win32_clean.bat create mode 100644 cygwin_build/win32_install.bat rename Configure/Configure.vcxproj => proxychains_helper/proxychains_helper.vcxproj (69%) create mode 100644 proxychains_helper/proxychains_helper.vcxproj.filters delete mode 100644 src/configure.c create mode 100644 src/proxychains_helper.c rename src/{dll/remote_function => }/remote_function.c (77%) diff --git a/.gitignore b/.gitignore index 723a1ce..73b84bf 100644 --- a/.gitignore +++ b/.gitignore @@ -340,15 +340,14 @@ ASALocalRun/ healthchecksdb cygwin-archive -cygwin-build/**/*.d -cygwin-build/**/*.o -cygwin-build/**/*.dll -cygwin-build/**/*.exe -cygwin-build/**/*.a -cygwin-build/**/*.lib -cygwin-build/**/MAKING_* -cygwin-build/**/distx* -cygwin-build/**/*.stackdump -cygwin-build/**/*.bin -win32_output/ -include/function_pointers_configured.h \ No newline at end of file +cygwin_build/**/*.d +cygwin_build/**/*.o +cygwin_build/**/*.dll +cygwin_build/**/*.exe +cygwin_build/**/*.a +cygwin_build/**/*.lib +cygwin_build/**/MAKING_* +cygwin_build/**/distx* +cygwin_build/**/*.stackdump +cygwin_build/**/*.bin +win32_output/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index bc3a8da..fcf8d3c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -60,6 +60,7 @@ "initializer_list": "c", "utility": "c", "hookdll_interior_win32.h": "c", - "hookdll_interior_generic.h": "c" + "hookdll_interior_generic.h": "c", + "ut_helpers.h": "c" } } \ No newline at end of file diff --git a/Configure/Configure.vcxproj.filters b/Configure/Configure.vcxproj.filters deleted file mode 100644 index c3194b3..0000000 --- a/Configure/Configure.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - \ No newline at end of file diff --git a/README.md b/README.md index 038233e..6a351c5 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ [README](README.md) | [简体中文文档](README_zh-Hans.md) -Proxychains.exe is a proxifier for Win32(Windows) or Cygwin programs. It hijacks -most of the Win32 or Cygwin programs' TCP connection, making them through one or -more SOCKS5 proxy(ies). +Proxychains.exe is a proxifier for Win32(Windows) or Cygwin programs. +It hijacks most of the Win32 or Cygwin programs' TCP connection, making +them through one or more SOCKS5 proxy(ies). Proxychains.exe hooks network-related Ws2_32.dll Winsock functions in dynamically linked programs via injecting a DLL and redirects the connections @@ -19,8 +19,8 @@ It also uses [uthash](https://github.com/troydhanson/uthash) for some data structures and [minhook](https://github.com/TsudaKageyu/minhook) for API hooking. -Proxychains.exe is tested on Windows 10 x64 1909 (18363.418), Windows XP x86 SP3 -and Cygwin 64-bit 3.1.2. Target OS should have +Proxychains.exe is tested on Windows 10 x64 1909 (18363.418), Windows 7 x64 +SP1, Windows XP x86 SP3 and Cygwin 64-bit 3.1.2. Target OS should have [Visual C++ Redistributable for Visual Studio 2015](https://www.microsoft.com/en-us/download/details.aspx?id=48145) installed. @@ -41,10 +41,10 @@ doing so can be VERY DANGEROUS in certain countries. ALWAYS MAKE SURE THAT PROXYCHAINS.EXE WORKS AS EXPECTED BEFORE USING IT FOR ANYTHING SERIOUS. -this involves both the program and the proxy that you're going to +This involves both the program and the proxy that you're going to use. -for example, you can connect to some "what is my ip" service +For example, you can connect to some "what is my ip" service like ifconfig.me to make sure that it's not using your real ip. ONLY USE PROXYCHAINS.EXE IF YOU KNOW WHAT YOU'RE DOING. @@ -61,19 +61,21 @@ First you need to clone this repository and run ## Win32 Build Open proxychains.exe.sln with a recent version Visual Studio (tested with -Visual Studio 2019) with platform toolset v141_xp. Build Solution and see -DLL file and executable file generated under `win32_output/`. +Visual Studio 2019) with platform toolset v141_xp on a 64-bit Windows. + +Build the whole solution and you will see DLL file and executable +file generated under `win32_output/`. ## Cygwin Build Install Cygwin and various build tool packages (gcc, w32api-headers, -w32api-runtime etc). Run Cygwin bash, switch to `cygwin-build` directory and +w32api-runtime etc). Run Cygwin bash, switch to `cygwin_build` directory and run `make`. # Install -Copy `proxychains*.exe`, `[cyg]proxychains_hook*.dll`, -`proxychains_remote_function_*.bin` to some directory included in your `PATH` +Copy `proxychains*.exe`, `[cyg]proxychains_hook*.dll` + to some directory included in your `PATH` environment variable. Also create the needed configuration file in correct place. See "Configuration". @@ -136,7 +138,8 @@ programs). See "To-do and Known Issues". Perhaps solution based on - [ ] Remote DNS resolving based on UDP associate - [ ] Hook `sendto()`, coping with applications which do TCP fast open -- [ ] Fix Cygwin proxychains pip failure (0xc0000005 Access Denied) +- [ ] ~~Fix Cygwin proxychains pip failure (0xc0000005 Access Denied)~~ + Not reproduced - [ ] ~~Adapt proxychains_hook.dll to Sandboxie (???)~~ - [X] ~~Make -lVERBOSE available in proxychainsd.exe (The debug versions)~~ Fixed in 0.4 @@ -146,16 +149,16 @@ programs). See "To-do and Known Issues". Perhaps solution based on - [ ] ~~Fix 32-bit proxychains SearchPath(ssh) failure~~ (Windows Filesystem Redirection) - [X] ~~Dynamic selection of 32-bit DLL and 64-bit DLL~~ ~~Fixed in 0.4~~ - Finally fixed in 0.4.3 (More tests needed) + Finally fixed in ~~0.4.3~~ ~~0.4.4~~ 0.4.5 - [ ] ~~Try to fix `proxychains git clone https://...` under Cygwin~~ Using `-q` in 0.4.1 reduces the probability to happen - [X] ~~Try to fix `proxychains npm install` in a huge project~~ - (may be caused by excess usage of stack in GetAddrInfoW, turning off - `proxy_dns` in 0.4 fixes this) -- [X] ~~Resolve race condition in `FormatHostPortToStr()`~~ (0.4.3) + ~~(may be caused by excess usage of stack in GetAddrInfoW, turning off + `proxy_dns` in 0.4 fixes this)~~ Fixed in 0.4.3 +- [X] ~~Resolve race condition in `FormatHostPortToStr()`~~ Fixed in 0.4.3 - [X] ~~Resolve remote thread exit code `0xc0000005` (Access Denied) when calling `C:\ProgramData\chocolatey\tools\7z.exe`~~ - Finally fixed in 0.4.3 (More tests needed) + Finally fixed in ~~0.4.3~~ ~~0.4.4~~ 0.4.5 # Licensing diff --git a/README_zh-Hans.md b/README_zh-Hans.md index 9ea7d8e..5216e3a 100644 --- a/README_zh-Hans.md +++ b/README_zh-Hans.md @@ -10,7 +10,7 @@ Proxychains.exe 通过给动态链接的程序注入一个 DLL,对 Ws2_32.dll Proxychains.exe 是 [proxychains4](https://github.com/haad/proxychains) 或者 [proxychains-ng](https://github.com/rofl0r/proxychains-ng) 到 Win32 和 Cygwin 的移植产物。它也使用了 [uthash](https://github.com/troydhanson/uthash) 构建一些数据结构,以及使用了 [minhook](https://github.com/TsudaKageyu/minhook) 进行 API 的挂钩。 -Proxychains.exe 在 Windows 10 x64 1909 (18363.418)、Windows XP x86 SP3 和 Cygwin 64-bit 3.1.2 经过测试。注意目标操作系统需要安装 [Visual C++ Redistributable for Visual Studio 2015](https://www.microsoft.com/zh-cn/download/details.aspx?id=48145)。 +Proxychains.exe 在 Windows 10 x64 1909 (18363.418)、Windows 7 x64 SP1、Windows XP x86 SP3 和 Cygwin 64-bit 3.1.2 经过测试。注意目标操作系统需要安装 [Visual C++ Redistributable for Visual Studio 2015](https://www.microsoft.com/zh-cn/download/details.aspx?id=48145)。 警告:此程序只对动态链接的程序有用。同时,Proxychains.exe 和需要运行的目标程序必须是同一架构和平台(用 proxychains_x86.exe 运行 x86 程序,用 proxychains_x64.exe 运行 x64 程序;用 Cygwin 下构建的版本来运行 Cygwin 程序)。 @@ -32,15 +32,17 @@ Proxychains.exe 在 Windows 10 x64 1909 (18363.418)、Windows XP x86 SP3 和 Cyg ## 构建 Win32 版本 -使用较新版本的 Visual Studio 打开 proxychains.exe.sln (Visual Studio 2019 测试有效)。Visual Studio 应该安装 v141_xp 平台工具集。构建整个解决方案,在 `win32_output/` 找到输出的 EXE 和 DLL 文件。 +在 64 位 Windows 下使用较新版本的 Visual Studio 打开 proxychains.exe.sln (Visual Studio 2019 测试有效)。Visual Studio 应该安装 v141_xp 平台工具集。 + +构建整个解决方案,在 `win32_output/` 找到输出的 EXE 和 DLL 文件。 ## 构建 Cygwin 版本 -安装 Cygwin 和各种构建工具程序包(gcc、w32api-headers、w32api-runtime 等)。运行 Cygwin bash,切换到 `cygwin-build` 目录下,执行 `make`。 +安装 Cygwin 和各种构建工具程序包(gcc、w32api-headers、w32api-runtime 等)。运行 Cygwin bash,切换到 `cygwin_build` 目录下,执行 `make`。 # 安装 -把生成的 `proxychains*.exe`、 `[cyg]proxychains_hook*.dll` 和 `proxychains_remote_function_*.bin` 复制到 `PATH` 环境变量包含的某个目录下。另外你还需要在正确的位置创建配置文件。参见“配置”。 +把生成的 `proxychains*.exe`、 `[cyg]proxychains_hook*.dll` 复制到 `PATH` 环境变量包含的某个目录下。另外你还需要在正确的位置创建配置文件。参见“配置”。 # 配置 diff --git a/cygwin-build/dist.sh b/cygwin-build/dist.sh deleted file mode 100644 index a66d56c..0000000 --- a/cygwin-build/dist.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash -# dist.sh -# 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 -# . - -set -euo pipefail - -if [ -z "$PXCH_VERSION" ]; then -echo "Please execute \`make dist\`." >&2 -exit 1 -fi - -echo Distributing "$PXCH_VERSION"... - -cmd /c dist.bat -zip -j ../../proxychains_"$PXCH_VERSION"_win32_x64_debug.zip ../COPYING ../README*.md ../proxychains.conf ../win32_output/proxychains_x64d.exe ../win32_output/proxychains_hook_x64d.dll ../win32_output/proxychains_hook_x86d.dll ../win32_output/proxychains_remote_function_x64d.bin ../win32_output/proxychains_remote_function_x86d.bin -zip -j ../../proxychains_"$PXCH_VERSION"_win32_x64.zip ../COPYING ../README*.md ../proxychains.conf ../win32_output/proxychains_x64.exe ../win32_output/proxychains_hook_x64.dll ../win32_output/proxychains_hook_x86.dll ../win32_output/proxychains_remote_function_x64.bin ../win32_output/proxychains_remote_function_x86.bin -zip -j ../../proxychains_"$PXCH_VERSION"_win32_x86_debug.zip ../COPYING ../README*.md ../proxychains.conf ../win32_output/proxychains_x86d.exe ../win32_output/proxychains_hook_x86d.dll ../win32_output/proxychains_remote_function_x86d.bin -zip -j ../../proxychains_"$PXCH_VERSION"_win32_x86.zip ../COPYING ../README*.md ../proxychains.conf ../win32_output/proxychains_x86.exe ../win32_output/proxychains_hook_x86.dll ../win32_output/proxychains_remote_function_x86.bin - -make release -if [ "$1" = "--install" ]; then - cp proxychains_x64.exe /bin/proxychains.exe - ln -sf /bin/proxychains.exe /bin/px.exe - cp cygproxychains_hook_x64.dll /bin/ - cp proxychains_remote_function_*.bin /bin/ -fi -zip -j ../../proxychains_"$PXCH_VERSION"_cygwin_x64.zip ../COPYING ../README*.md ../proxychains.conf proxychains_x64.exe cygproxychains_hook_x64.dll proxychains_remote_function_x64.bin - -make debug -if [ "$1" = "--install" ]; then - cp proxychains_x64d.exe /bin/proxychainsd.exe - ln -sf /bin/proxychainsd.exe /bin/pxd.exe - cp cygproxychains_hook_x64d.dll /bin/ - cp proxychains_remote_function_*.bin /bin/ -fi -zip -j ../../proxychains_"$PXCH_VERSION"_cygwin_x64_debug.zip ../COPYING ../README*.md ../proxychains.conf proxychains_x64d.exe cygproxychains_hook_x64d.dll proxychains_remote_function_x64d.bin - -if [ "$1" = "--install" ]; then - cmd /c windows_install.bat -fi \ No newline at end of file diff --git a/cygwin-build/test/spawn_ctrlc/_ctrlc.exe b/cygwin-build/test/spawn_ctrlc/_ctrlc.exe deleted file mode 100644 index 2a3c21fd954f4ce9210ad97655c2ec30b16a7837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164421 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 diff --git a/cygwin-build/test/spawn_ctrlc/_test.exe b/cygwin-build/test/spawn_ctrlc/_test.exe deleted file mode 100644 index 5afd24ffa0f540abe4bb25eed971922a5cac6606..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165865 zcmeFa3w&Hvxi`G_WF|97+TDRp+w_uj(iS=alIGSnl>$kVX%m_@AxTTi#mOX@Btw%- zoS8IfK`9onu@uTxK;$AI1r-qy0TnBt;05I14Mc_G?JKVy556815f9)0zt-M+_Dm)T za*n_6eZNC~nVI!G>simbJ!|c?*M9zMZ#n0%$Pq#~@p=1gAs)dm|LWxT^k4fBtuK8{ z7Z2q90hD+lI99S0}oTmdBOgKGvlIAJ*k~ zL%{f{6K!?n-J{XL-e~V?^6K!RzWMmr{^~?UUHOR8C))yTBIOEgLI_H^aV2*tqq^{+ zzD4-h{-j)YB0<*e?935cq%F9Q^@u8cvQPFQlJ&@Fc<4iY6Y(BI$v!)b0Nc)wkL{0g zt7;UZi{-ihwluR$%;xLr5u1+dX z{YkkR*}~%IEc*k9FUD_i7P-}HWx@da?RmtreCspi>Nc!eTOsA1qui^8TwSId>QSr8 zx6}=}*AY+qYMd-5mA&`%KduFu_Wv%>bZGXMQSoE1!^DG?M=M{b{MIp=uo?E)!n0E0 zru|O^UL$?j_P4ER;@2&QTzAhA0%~=rt$gA9*K(n`Z_d(2AsB!Dlc@xxQ3n6S7VqKu zM<6C1V;?;FHvW#ag1+qN#s3d9buL8#=YW2c(Z_y>uft5sbmu>5XsH9$G_kF)Wg_T5 z_DP5|9h&!JD0&oy6vzIc7#}6WN5-pU91Iq=9IEs1w`u=T{Cb-X1>a~oxW(Tz(Xt}Y zGSRrgUoSJQm)FLoiLW0UL&AyRTL-tjaWME+{lxPVPoRX~#fUyOM7>SaduaCe$rwaf zrQ82h9V-6z3AM}(wP}IeW`YTJa|Fk`ddKpy9!PzyS zS`N-z&7X<IIR|Ojk4$<%+0yK4 z_QAvhhPlj>R9h`F^rIAONFJK~J(=$a3~04a3BaD3#*vKHGw0Gz|0l9BEN9|L8qZ}< zBFopV1%J-ceKNy?j;0A$A6AF2J%y;lO$Rq16W1X!=E>w6pwl%<`Y$Z*!3_b>=aYU( z(SFcD(qC3I2864O^d}UJDbzKO^u>xsqq_c{2RaP8<)G`eov`P5zr}ac!P&pV&uc$M z$;|TY|6T3=H??GceD(e}9m%=--^>|Z@)$Y+CiztDYoA5nF;rbqw;^EmZ0(cs`hdA; z0^G}vCVvaA>?!?Jj` zNzfLQQg5H|&8U6SeEWpQGw6pi=$Ya(<|}*C!C&<{|%Bh>npFvuWfw8tTbDff1=R1&yua8T3zxD`n{j`THw7F z_`kme8U}Ft?{AC8dLoI0zcUgaiVla9k=}BV7zvLJ`{R-1`}`;Lp6VZo_A-z!M#7_s zNTAdo8Scd${HBJ6_xS^xwr(r+uPv`Bukcq@RMu8jRjly`Hb#15@vy&PPyZM;e`IV~ zWobr}Wv0)Fo}_=K`2TAD@1_5*_22*W_M6E*GvohHqPZ?xh|iKbe6R=D-qG0M|M-&k zZ~FPKe)#F{eev(#`+VRWE~ei5`~Oi3c(EObkLbcyH-0a`$Aj<)es|;JMR*^6zk*L8 z!uRq1!*4x4O$fK)_bhx`5bnZn z1?;Vj^7w7W=RC^b*Rufe2z&8651#>q{rEi*pFzsww-TQbgdf1~%lIS_7KPYC$LAu3 z-}{@g1vIB7oEvbH&bC>s>rd$kry|4MmlKboM3%&b42b2M}^j9@TkAr z7Ef81L%6E63NtUT-uwIis0G&VOJ)4VhlThZ=%3nnp8Y~xaY;(X9=gTgf5!NI#Q1&6 z`2B(L`>OH#AI7f-`S7pM`1KpV0pqvE_+4-Owi&-&#_yo2p+8NXK;ze>9hH)hcP zx0QE}2!(pa!y&B4$D?>SSPpt99L2sT<~|YX9UKhx#FG^wAwtoikZ8156~wOkQ+28Ho>vu>~fs)u;|1sZoe$HI-+Bqc0wb2yrN9 z$kO?5Ir1Jr{3T~3mWYmrh9ZcI_RDh3b}F8{dl^nHXUAb7u5zYQtv_RYXwbhq5>G^9!>28) zEU#FGJI0<^Z*;i-v}M~mH1&+PPkzkhu) zKAK225BJ61p|a{_OooJsNY7|In%tvEFyfI9j3SFjZ(BUNJ31KYk0i`Edu(tV36rRC zOJsLs&_BrU)0Tx3&BME6yCU&rtIR~}S52vL{VIFz>sMKoVA}Pl_((Vz?T!wjcr#Zk zO`NTz3a~yrGBOzLfuh*3Riu)#vd)2szqt`E8-uYicx?1iB$Dvkr2UD}k&#$D>Fb{B(+M4Ixmu2m=<)~g=SzX(`E?l;{cOA;n*WFuI8>#9o3s=?DR8&>1 z?ps$K{_iPA?X=~n30L)1)kdnzR#$hgE32ugsVwUbuj?u6U9+yYCR`I<6REEKZz@N5 z<+LTK>|3*TP0!jjWwjNN%CefO>UCx7R(E%o)mHab^sVWw=nb!xCGpFV0SkQhT~k>x zZAoe)6@6>Nl~rZkecjdQn@DXLdTMo9O>JNA>WXmX>hL<*H>xD-SJ|vm4vkf5#*V3E zl{uH3j;9&#{bg-|Q^0k|7>|ng*2%fPF{?E0^`v~;3CfX#_l8RT-=~!ys5a%r@k$=I zd|CgL{(n8&l=mC*T2^VZJio`o998~`cO?HeJdjlKb?->t^L|sl?H$R_>oVoL4Eg7C zvR6RW_m{e6mVdr#pI>JeH`>3T+m!b&Q1ThBVpeLU|J#?F@)d^s^zHe%1E%}~hWyEv z#`FN)nH=Ku2Tl3(*!QUa(_5egBUvrmJQ{ZK{SB3s?{FjEUpCZ3Z_dHf61+74nHH= z@o-Nhj?2zSm@cV_#7J59XkT9hSw{CpPOA~KR*fd&tKd7hsyEU-+P_NO7nD_(SC&_m zRj$I53#?@f?ke6JmG=mfWGW?}mMo1Zt1L$ogx1uol8%0CpJrODxS%5ZON zw0kfj99nMAKsYX(boO#MUChkoQG`2PljgB#nItFF*0i;;rCsEl(T>C}&klU&_TbA+ zHwfVg?PzH04AnPuHn(ntb8Y>n!Oh#zGm_joIwW#7uqGm}Bib*?2Bz`I==vV6Peo2+ z16W>>Pn8ejQy^xAm>lt);ck($i3;tkhS(_Es)?%X{0=mp$Z1yWjnQ}_8QRzu3^fn; zj*FZ#6&r;hQ{-$WJ=^1OI{OA=VKljxYqYYgwZq|3&8%9g1@pTe3gNChJjf2prxQsJ zm<7VQ13$AuJ;^;Ik&tlSPp;W>le-VQZb<0~ZQ9n{D7>z@KZkT)Bb(QmIB8)bMKCWe|#u3)-xb-?|B<} zD56{B9$}O!(}xj~Wy%qAJ-MI!G{`(`cF2Cqy^AeRdUtqmG$L~E-HK=@G8^i~z)rGx zbMK>uoKR?63xHgX>J*+?OOY=MkM7t7Y4`H)LfRAB5bbAg`Q0^}UCdyZ zKG*IwBtY#F?zPO>lZRcF@i9EzRP?O85If$Wym_HilrJwdF5IV?<6*X5?p?rHW|rFJi+z=W>a%+t58Kh1$UD8H|L7M@NKv%uxi*I~Jol ziP1sG>~(MubeRl}g$re}fyJSb)oA~Vq`=7H5Vr#dalbFzA9O5-lJUi%p4~}YgoS&b zOtDWg*!1p89Bjn{i!so~g!?YXi?iXCw8ZRu_YnuX`wh+HR0#LI4tA+q1Ylt7UKg0i9#(O-UNP$(h+nhRgGP zd@n3U=lk>0#K}?@FPF!GsDbo zU4*`u0($al=!3)7)tlxE>->oGVx)U7pq<++=Y^H-C|yl5)oM2B8?ZE8&x6E zn(oD#1|zs#+CEBMti6o*Ba6+8gmC*cURE9u3(N3BS(`nOWp*$-#TyE-mxOzn#?C7W zNkc1i2eeKkqyh6vagwA+Mq}ORpp#`GJs850JVoP}_rfx0o-U6Y-$kJ~=F6H|p}QNk zTcs|vGCCnBDd-xK18}1xa~Frgy@=eT@oGK`a~po{M=Ha*ieGeJ<~SFl2(3H}H=JIn zUARBukShaDF7ae+S7p0h9sPXyLxn!RCi?40R`CV?8GO zD#?bKjA7+J)NQg4OZGmLYE4a874&MyF4Xh@DkYx~DCRYe3pt6Pl#wKiJ;M1{xUZFE zl${^972!Im^fN31nk7|+>m~mo@)I&5VHV>C8S@pE4iTy1eN6J7BA+Rc&P;KmjQQ^3 z(13XCfGyu-82JMHk{qp)zVqCM_H#=xaC5Gh)_ni)Au8MIyCQzBOP~`H` zAcqP}n0%Lq*9Mn|i~D@q^ckkGLoBmDd2(0haN=2p!4vBa52i)c1m zLge-H+K~Sj%sd~3J}i?j#?P!!Vo!n%DK9bkK1L}X?keLVf1aEn(_|J%8M2f}p%gJd zh`6}!#*&=(5uxGmP(4v*8gIarm`u%k02KWLNR-rN{WHI^tCniMD7BR#|6Nka8ox3=!A z-`WsNUFnWlWqCf?AxwWAegX3BMR)_0;Q$891o_tvv5 z0n;Kx!5*88QAR_Vy5%!1Yp+etDwk@t4Z$W1TePq_&_uz7HtDUfKr2P_*0yan`@6^{ zC(S#h;)9t{S*-6vnKE*)S)<|N%;*i<+F||8o3^&L!#tZXDw|qcFv|923R>m0G8F}v z*n~P-g26UheLp-YPL(8;#eTa)XZ_a34LegteW@*S+t&Kd&fwO@kjlfV%w;y2rsfTJ zs*XNRskl6A^v3#*&W;*bH|<&!e8eWy(B9l>n>Rb#>$i4*!|`#zCf2dDqcgZARDX8; z&MmEtFscb#q%x{h+(#$H!4hRvrA1;O9h@Z5-q{d3yM8k?Uok1p$UJ4OhioE7~M zE4Hzvep3g=V<98M#)Af?KDRQ@KLywrRywt`NK3Cf3&8+JI{dr_EqzCs#c-8@?l}AZD!A&Q8qp z=6L?(^kP_7HE-FrMHJjQgIx1gC3ja=IW@|S%u!HLaCcTYPI=P2t@3>;s~pxg8`I_P znNrSL7}%%lBU6hv2Gu&kE`IOS;^wl$D)D_&%UY_<*8lX>vX)*>-=g3%Q%hP}mE>oq zmZU%kYt@F$qTv3i#Wu9I;u>d`@pCf?s!9EUtYY#Srh2~vD{R^IpPyP1GgSQs-0BxR zIJJ!GcgrxpFtwz;x(`h)))?H<%Ije2O8dpBg)!zbr60~J-M|GxTYdXxuCr5}nabo# zGbc;+Y%19!GbgihGrRE7nbTNVnQ0!IISp^RSWR4%zx)oQaSvule`RKAs}9PjzdCaY zs|G5?<1?qI-?$OeR_D%8Q*#HF_d7$D3S6tf5Cva*7fNh)bo3uces+-e3UYvaedc7X z+i|OlTeFttbL!;{+LTpz;=iEGR+T5;g&JFxo_ZI_ZMlCVYjSgR$)Uy;X~+GiDEQ{I z!n|~Zj3w05(@Nr&NZoAVe$G~wXQoZm6s&J-Z*9fxW@^ZOD|-qS#OO9r@a?H(TChsz zZGRJ%k)q%`Sp_k1cD6TTc^Onz!7YaG+9ZvYZbK`U@$$Z3t>&M#iO8EZ^EMF6VYQ-u z&L&~p=*l_WoF=|!i?45JY`|qh?!vTg!(F*3c-|I`6>i7b&7BQRs`+sts^7W^GXG+e zF&DDvCEnE6W3AdA+)|HW%0IYe5GSvLgCL*i5p}t`=cYttH)mh(x%jb`55*d-9t*xES8*yW#ZiRkqldNw; zNw#f86R0}@QShQIwymK#xPx`UI&SiU?xpOK^&M?ntZVg8Y%;;Eyp)EFCg0eK2E`p= z)3#2vzwxpXZDVR{HKn@5*vERwCpXa2B^q1V8%Ez5fSebQ%8tXgj z4HZ9430Nx91b&t-fV-py^akfkL&MLf76|SzWL`9{Gg6;9pZBh8Cm!(_7^iQf&EFY~#+lnGfKX?_lub+yc$#9_IgAZtUx7*hWq6 zm0O^*Zv6?kEAS*3PWuB%F}s+Fm}CW?2JD49wwPT)oz$4mCuOIs;12CFZn9!CKHS|M zkL(uu&$SZpO|IOr)nAdk69`jiXz%R6R&NqdiZoxQV~ci+?*yQ@yoSFEiEE*3rPeM^ zTw*Yng82}b0j*uD2xw>VYll`LP7D|VCqv+e*#v3~fwd6$a~6TpMnj+h0-5T?N!_SB zKiY98<6HjCxkNkJix59^KCGSW$1gu~_G>3s;Fq5{mukX?4Qr?1VIZ0QR5SQTiCOTp zP8!}tz3?)Rtm<7g7K`s%1#tHG9{8NV6{$Qj9$AIG>onSMSyKK*RI*BfFW_(zAMBar zp!s_gEz^}H)1xQNw`B@{BIP3FaAr6M*?g5u9~aA8h`tv&hQEm8#R3?Y>Dn}-SJGAp zyHdU?^fra_2cRPG?#QV*CP~wEC8w(#(w6H=PV#LTO-~l-x{|YZkBm26S8}eUK&~_A z?w^70R<0{K_nd1Ha4|Zz!l7pm$Q&MU520jNwluQ->l13lYvUUAkuBD0i_B%NzWAj4h4xt4i* z3QXq}Mb9dbkI#%)Z-I1PQBl4EIIlQsABTcMp-ZnV&q*Mj!$($-xx$S^tZ=Ts2#+~X zEBKVqdBu6USxtJTz}>-l1{qEzA)Qy8bw+8JMmn!J>&ZcRBnQqb&JARsNMuOo6=wrE zC>J@>dBxdCPN5+~=M`s=oF$5*oL8J1$?{`d;s*{}tuM&Z8qO=uHj;S4Yja+4o+Wvj z*K%HQcChNg;WeFCoZHEO^NNSv@e8PsZL(AxXZkM`<~X}coopA?6+I+C(Rsz$%OasO z=)B_WTZI_!@hqORpG^tp72QLfo-+``kD*-m1VPM2yDR4v=U)0u6)5Kw=Y`UNiaiSF z73W1V3n-#h`tF5M-2mBn@{47jSBEF{^ZejL<_<(T88zQ>VR1$rlvrRqw{-S9s1USr zVQ~&R=pNybG+kH>hF3E9G|pfYE|4xP&S9C}4}F#ki!K2$T zEY5`E^GMRPz~;i@9F;{i`#A!Qi;LYfRx-v)-XqHiG}EfHo< ztD>(*YAUcCS)BiI9tvLoM;7Ow43mU4{F%C8@@S{OFo>b999f)id;=r~x^!f5{*~16 zuxZr$&5fuchPUa+;`|#^1`3oTi}UZSa|L=sIkGr~M#HXUAH$Kw>CiT#fUq6q$l`Qr z^d5rgNJkc@TVrd$YLp|3)1$HGFc~DDg=pFc;I2#koKxJ`5vMjx5eX$+&KT>B!<-r1A1|qbejE zS)7Zty&gES$PoaeE!LV)$0G~qoFF|ZoPLcLnFoaLMkJ)H%@oKoJD8o~G8|c)%cPIZ zLc@{88IV3dG-EijI8Tz404Y6JoF~gddN7db$l^Rj5eSU8)VE^SUS5S zi}PcW{}lP@jx5d_Wz2UMSdJ{tn`B{rAmo(9c9Na95UV!jc0Sp8SxT~AQqrwb7Mt_} zv3Njp-s;#4hO$J=0Cz}|wBh37{G{Vt2)r(E)PN8SN@YdDL(|~=YtT!eY`?s|z{yIw zWjb$m(8h{P7Z>N94rZ>3akrVWP!!u7wRI08mhxgEhZW5IO9<;8UQL#A+BS#RE0X;j zzU6@U69Td%4&k@Ex;U$IIBWT{c)>Vpa&AFXj#{_o-hTlGZ%Jf$cNFLc;r7ZAdiwaMyjHjMJt3q{Z?_- z&$YLp$mGgf#aXXNp1f5Qnr!568h2&)LK*+GTkeFm6H%WYL&9;jBzJ?n7g3I@Jtw05 zaD!=(-jz78N@xpMM90;GD|>jn74H*-R>-3(9aj&ai8rF0PO1(lXJ!se-kfN2zG9RB z#xDP~TYkk7ARduQsSu^9R6PTOQ0*~MaOAELL2gLDW5~_fSZ1d|ZWbf;FqrTqB*w-Dxgpo=xye^8 zm*+I3OhIm5gR}*?;R(Gd$PKpvQji-`DaZ|z0dhlKe?@Q(8#x8J`6O6Q@@b65} z{)iOTzC~{Gev339Hw$_3ut9DpK*-Gp!M7kc`4&OQ4Wm?<4k0AVq#!pBg9HM^gxs*@ zNt=+Horq4~x5&MZ8mwIl_d->A3vzQ3>XzEIa4-Kcr0tNK?Ji~@*Pre+BtQ{z!<_Aq z8)*|3VVV+kg7X`UtdV`@LH)Nzk zZpcAt3&bjS@k8IT*Y{K9uX3Ps4xh%BuIxgnVexskjy z$PKHW2Du@FkQ;W#KB$mwk^#ASTIQs>qK5<;ML}*@Bnxu$EMmM1SUh(>n^HnJ0i`_sFOpe^h0Q1@aW!uF#nQT0B6Ig+uxa$`Iz%}c zl?J(a(L?8Gtc(=ohN?hYkedkCW|B4_H)O!m9RgfU0fR$Ep#`~-9gqRJ;hFW*LvEO= z&TyZHpL@b_77E{#0lA@2TRP+>0L^rnw;(qh1YIUWL2j6Az=GUR01ota$W1wvzu4#DM_O@IWs%SaCv@??}gknITbnO;^p$pM$|%9ESM&P)Rkb!8TMQRr1inn zIpgj!X;=U@SyGUj-}AmjLT(H*gdO~ux?$#o+%RZ^-0-~c6y%1K3AyDm|l0^4RXWIvq5e`NT?tXgxruKX+myTNKXoKBZoLF zgXRgm0>0BAH}^_iCgg?`beWJFk}1dyujYW<@Q1GoFsw^LZu&5a(8{)*3P5h;%7Bwg zYNrB_8xB7d&%RUPo^VisHw)y3SFLQ28&(qLklLwmU*Y&LIvyrrKyG*=+{LC(?Nk7A z!{&!^r0rC=uaaz-N!m_@`>*okEj#3fG1(wDY^!__mZAUh9`8`3Pjqyf1heS=AxkeesLQ1&Jv zHzY}?AUEF!2ap?%JO-sQKyGLNoL>!EL2h{cut9EUNp{E$GgrkR%todJ!!kJqufg@vfZQ-D4RXV# zos|x`kuo;OjTFg(sWBio%yve|4Tatj^0p9XT1ik=d3BSo@7Ze#>p36+OQCgdii zSvsI(huoxu=$<*ib-Ywkn#wR;HZcls0Y?QJ%A=KnldL$0jp9dBCsRPw1IHz}E{keh7LlOQ)Kp=lvEDX}b&n^dGSDm&yRGY*!R0lCSP zutRP#otObbk&v6|BMZ1o9V=iTmh1~b=sa#xkBu=X~k@in^dkdKyI=L!Vx$Vax<-%g>1OfR=iZc zmbxt|$W1nVYLpw&(tGyqtokf>OUsG$Q(5IKzfDW-o+;(B;vJ4mEpGYU+nlEFom$+& z2AEFB_f0KpsWxRlJ+-W*S0M;KGqt3pRY`t!YDo&DAUD}MiVYjegxt&^XhLqXiOFl2 z>U|sJW=cuSJSOC3N*TE_A;w-|yuOgNy4F?PtnNcoi)Dk{OqqLD$W1oscL2GWF%bSvQ{K}Zl;+%I&&H;D>KbwGp9*|+{{=ROc5!_&5Y6+=Ks~1OJmhQ4THyLPVr74 zH!~J=k`mjrar7T3gAJeZ^_i3XBaoXJt1zW9TUDNX7iF?l>8W>-+?M+{vL>Gra+9sb zrm&phjJunsXHYu@}hHH6%xBr+l=L2go# z*&sKm*qID zCm;0dH@c2byZLtj9po_V!z_W&@-xM>TmFC)Im#n0pJ5mTC^*Cwyg}+L;WQ8L{ZG&? z4}1ZH(>UDMFb1Bw_?|KRBgRnq&vik|Jhc8VlZ~Mg#*iuY-(n22@r>v_WB5mmq3WM& z40RbZLmxUQV`iv=F=UGUw;03w-!q1Hat^%hGEx1{HHOUBP5f}OF;v4CGR6Lj#_;X? zxn}rW${0>Qd0p*4|Fr;c(>kqxcvNQgF5VFkPbQ-{@*l4dh>Z6{;4+W*04N$KrIz79 z>N1=ciWjLV-aqY)0?vQrjRLf!kZoBAe@wpUpuFdw`j&w%V~R0fO4115q?s_mIXQej zZ$I?j848WULAr7cFu0C&wK6)}s|O$lvFa*{Z3$6Ktx$3pHk7E?)(^_qbm!+BGL;VL z2J7g*lTtRIv7tl7M(M6>`ue7MX)7IgMIH}qq zDe`l`{xgCFvZ}~Am5J-VD-bcugBBvtgH7i8CdFnWOCrqyNP)VL^ckskqE(C~W)2Cb z+26UR(2v|nGm$-k(W*;wxBSSAHyG{5$bf@iv>%ukl*(Od z^qN6?e7CUx@T2SD$^Ut~7_EC`sYWGSJnwFu)mMF#cmHW5%sS>hOYdpj! zf*FQFn3a00>gER)GYhl!`8_(My+6ik+gq^gLl{bVp)k%{-W?GIC$fpfamH)#M8V0@ zBDCWM)tl@9r7k#yERS{^ko`S)H=Zac+Yc49wBvUtM&f*NV!?{gIa}Aj%M5QaS!*zZ zZ9Q$9dpfE@9Tg!#1&^T!Kfq`1VI=lFkMj9$U`T$gK!lj5JP!*_NNHOwS-}gSDk|QB z&~aFIDh)Jbl~~%&d|4qL>s$~>rLQ%)!ET|gN7_wRde%WKV4D<_rV=#N1aYI%2dP0* zQWTm^5##&h3r}rBy+U*2!dHY(W>c^+7mE424HXqB6>AjF)X@gGQVSGt>6T52Pxi?Cu^~}V znNm_UHWZ9TqeA-#lHFn@WvzYImzXa*EhK?W#5EOEr8HF5q(=s!><3WvilywAunbWc zPV!x#IEB2R8i_X>##L*w(Q52JZ4SQX;WPIRd?A%#)HSv=YZTK=Q4hgQR*FR`lGBbT zSZyn2MJfU*??D1>jHzh6m~^XQiVn@u9g7W$9F_#*7cAX#DoUTjUeG-pXNx@?UQ48v z)hda{!3G)!lVX^2Rt{<1!`3Sr#Cw5ui>_HG<-qy0_$HX^$3 z+*EuI!)rJlwH04QnY9d`Rh&b9EyL}_Ut@S3!yU!rlzAV+oyB$JpUUvI;pK(0eOZODwd+Bm~Nn3=IZ5qO8cKt3ySqP)q8#wJ+2&35z?140d(drp+$3!;^_jhi3hgX~Fq+*&Rd&8a7|m{0>@yYHL>SH9OnMm}SmCtP9i8HN zr&qr?w|Wlt=7htme=7HEU<6m(u6gx)b5B9=geKt3BXObMm-}2Xi+e&#q(6*zbLgMW zy#%j5^ZHNNF*H;m^v~qRN#0JfQs|#m2*T?qM|D#U5TPStQd8Qfx>-BG1?RZ z#d}0Cx)cKid{i+;6az(kOfmK;1`7FQ#W<{ql^X|>9bsJT^m}r@$Tk84uS-&_BZ?Iu z{@E)^+bWx4ID=i^m-{s@%%ileO3{}{+EdzAt>_O++FROIqv-vTE-Y{Z7?JsRx zqv*>d9Vl&x;f2QI$&K>$8T#e9m!o4VO1F$RB+!K)kz`G2N2I?YA@l>eqlm2~*$8q% zlJ6rK1o=@(t|z$>vORS+wX6oVp6d(6goY)HmEA>$rVaY6Ie(Mb5Dj69kVX{CKiMgw!@ z+}6^HTmaTV@Ia}Jcw>CriCJ$z7-Sb66p5olb!~5pkMseNq3|M70 zocr^d_rW%dx;(rMA<`d<;wUw;Yux-^l`3-`ImoRhrq z9<<}`XKBnEwaK7NU0&Q}od7*Ke#HflR*f8L>ueXtS4xI#BE|UHjgZK>mtvC3R8L4D z)mHkOY%7=SCcRK&Ra|G&aZc!djq3zgn?WwqT*t8qk3kohcmyl-6$bBR@^Gji4iOgm zm6~e)r4W~jmGWO|ywP(>i%^_jX)MU9P>Vbnn@4qT3bqT6{=c;sk+j02|53XZfy#eJ z^XdPgv9CpC1^e+&8gq0~<}ccpESWd#GJiE>s$z(*9u@kVQd{*|qv75*9Ka^@x3n5W zp^Rzy>wnkI2D?ZdOXrqY54Wa_HQ(^&TYeLyi>yPkd^Lr0QF;Y8^{pWRYM1b>WxoUZWxU}{(ZGKZ@M6Ro za8nf};ikUYVkjttNj!pF@;{2Naxi2?nX81G`quwcW=ZHM;ikURnH6%CSW+C4vB6D!8_2N3O?`4PWrv&k8YyFkoBD#}q`^&n8_DvEnxpvfIDD;D zJ{Hb^oBG;FigNoQS-!I*Pb;?$$?|ou>cUZO9+KtTP6pwo?2ZjkA=_jrW*)WIhSxp% zx+i2#5^n12A%T1eH}&0*LM|SysKF}Uq72t9+E|!`M2SVA455g>;SO_?XC{V z^6h;Av;jBuU3e)53@8aV^<5;h5Nj{OhYzcLQkrpQjqjj?vsA;ElCI5?T?01s!@_zpQvgvPGYG$fesN(VP~ zM##0j_{evaWRI7oBf)%!C3_!AWu95%yV`Ln)E+>kQb;i0HID1RJd9G>&aClWE6aF< zdD)O)zU!pY&q%ht4A)EkL*%EQS>wAw#(agPv!7Yx`51tzDuN~A3(bTa_qayF$+z2 z_+)be@Evh*$iJbPoC+Li=HRdvj+1F!>WDPoXC1#qK83E6Q7QTIHQ$4dpDx0TB{|6E zA;%veAdg7naF-+c2@Fu%h?cuu#)!TPQESh`AoxwX3|Z6p6VV+RplS*J6CeGNmKqfv6n^GsD`PAC$x>EB*G~XhP8{apoLSotG zTdX~e*1TOBJZ!XBJA$js5jkT>oUzZZae8||tlfnl%G!*8EVF~zDdvf2zGWIa?^NSN zG+#hl1bd>@;zTsxNs=NdamK!rWvM+Fw>%NecZ$Y=?uBL0CUwuV_&(J-5zW`A^-5h5 zXY30~3c4iD*tb!VxwsPG)qcKB8W&H%8S{r11Jk;=@4`7((txg#=5#A*Kvzj~0+aLt zk_KhqWDKFS$#H{}|$KyINJcbbejB0q{5@Czm#5+$jV zt`_w3%A0=+mh|6)0Pi{M=+#2sQ{XC|d}CbUJdUuEG?@ib#zMFj7D|z+5Uzy_nPW+o zXxmHW3KvnxhHwq-*s_JMlEbTV@KUkrDnxqq3*?T8+{wV5?%A<;uh4hN{RL5q)0C5= z3B?Q*CNLZW~YvT0G=F~6D zjTBkN#GM3b-I`%cubYg8;&gLAQ2$2mD;N%5R~zq4^grc22Sd)$mI|?cidO*Y-N&DW z$;pVG^a?<|#}=I(kF579kx6)DJ)$Cjv&e!+*86OlC7LY@9$D|V31z_}>jSoU=@FX^ zkE}0UlW&w8>}Sk@cZTag!0D`tT&7$#`TvHd$y& zJhDDAN!X4@);};QItzAGkK3ds;gR)(E%qJZk@e&|N|Av_)<eUD9M8a%ST*CuC`OBzIIG9FpK&?Y?%9$CN0CMV6? z!er_n%#6xneILq{k%Ntp7UGfhi!-CAz$5GXG6mCXDDlYpB{rc9JhJ}bNpY$q77|I{ zZzCPNCgYLy%dmQvI zmw`vt4^EP>@W}cVlj1V*$oe6h$P{>F{YsmRw3&3gv3`{;KFccr^~1LKY4FJU)i$|I zJhFaGdSoUZS-;j6Z^AfIwtrogSPYL$JhFcMv~ngMS-)XgF%yrhe{5PY3y-YdIIWzC zN7iqeR?NgB>o-p;X5o?bk54OS;*s@RrWG^s$oeOy6|?Zj`mNK-nRsOVwrRyoJhFbf zO)P~Ap8Uob{f?}Hz<8zMk@ZhbFJ{6%^*d*fGw{gzU0LPSC^s@E9$CLTtDJ>JF>%KF zr?ScsDxz?y27FS#XG*zjcx3&^)Z!^zV`}QXcWQA9IBAyTzNuv`)u!yHrYtlQP~wsG2eOLEYnbYN6OXKaerid~P!f-< zKRC5aIv!d7!qk%X>OM5J*d#o%{>7<tB8c(iR?B|H{nLRvna4e|6>*Rt;2&$7fD42}*3KFkS(u zf9+i;v32p$e;|1ZysLkG=44Ysh$mIyiT{E!TUDNX7iw%(dg@&yx8?qgtjSG?ar!F& z^>0oq%u9#y3PAnoX(e$>l;stG`ZLoe%7RDMzm+|O9gnPkduo|9JhJ|stb&+0Gx5m! zcWsi{@yPnKHj%7&Wc@jtL>4@<{ykg#WIVF|ye)bPJhJ{THW_mvi(Z)*FYOo2z%e~?8c9gnR4&?X`;VHuEPq5sGxkrA1WN7jFAlbnP{)?c*6PK!s@U&=0N z$0O@MvB^x2N7i3fqEq9M^_P5d11()53m#ejNlGxafV1O~^_No;*3!)mH`afe60lUH z3H&Twzz#Q-?hN|Rrxq~r$oeZOnJMtd`l~4smNW|=s#1jC_G!OU1q(i0t zwn%;}ZRlvUREr|kz<2Uk2R3)3J(0F>&n}s{(6u6ZMESJzI2J(Y4jDI}aih^> zMC~l+NM<3JZSh#|Xiu_p&j|LwokiRwU!>KAxI^ud)M8Dz+B;h&w~(Gn4lOHsKy z&=3rTgmcdGRjcu&Pn`uT<~+{_1K4-BWWZ{GfbP-p?QFuTbsJoT=KP4Mitx@&%=LU7 zaDAsSk#>l}g|i={%HfvCaDQ?@EYxMo=M9c@M0!T!(d3@SNTMem9Z90L3+LQ{3V8Cm zn}-J?h-(TD_YOwHLhn|vy~3F-gN4WKfPQHbzd@j$zPa!>cDC`-SC1EVcGkCdhVbT5 zyy`M27JesZ4a=X0@3kyRAp$<;D&TgOJ;`^eSNE)kitWwqo!jtQTfUE)FTcfOiC}1ZaBE|0duU5@LwjpS>&8y8 zc(%rQS@#@Q3p-$c`VsIMPuEGG8rrtCxuLZY?|+3Y<8Ir#XMZ`j^HS($<3)lp0?m9RJ;4}AC=n;iIBcleYs)&Gw&8GZ1D*}nGMWwYCB!c^_ znEM+m;SisB6|J$St7SU!k?b)PP1}zo6Y0sq7!jhVc2Y9(k?a!Y_85{JO;0u`ZKi0Q zJ)JD3j4%`a5sChqN;rbyqdcdIPESi{MId1wp0I1Dybog!AESO@%aTL=Hd8J-!>*;O zD!Z7eb073wp3*71Fd~ZT?K;*dE|SpOL;C{6A5A5ZFF_3rtBX(327AKFDtjc-%WnE3 z(*8A-KAH#_meOEPTWj)>>>#r}=~UPlK1S_(BYmO%(Qq8E8cH?bCcB2pby;MfjU!zf zho%puv<(e~N8msdi&NJCpOY80r0H5aNdlTa1Y6dgfR<-cnow-{pfoOuw%RqUvm%gC zVtxLGMA~|*Lc@_rZ$eo*h8Zj(G>B6v5>=w8)vl+iW-38bZwGYl%+&jV(MWuc9KP`( zIs1vCwluZXO6?>$Q|rCZ__>tUfp7wjb3h~FBn-I0$jKcj#ePwAR+`$HsRT{E+G)5p z;bU|w#k=FNU6J9CG+Z>ua3Y4wZBhGVz1aj!y*r^Zl&;rM1xLXC7#p}(6m_I2tz_<# zq)d&UhPKbAYeWb2L=zakYIdY^p(yH1(^*ZOS>#Nu+Ucl2KDPQR3|_1+2~eYaSq$dQ zZD~rYsC2TJsdF3jotv(6#Jn70u856tCf=T=u|gHoSP>XProOwO>(lA_jHXA$`Xb4m zf!&z*&rVY)+j5eWsqrt+_V;v+aAgaPM7ooaZa7x;^9ozEW3t9cQl`e{GlXcx$JUNU z?qdV7@K96~?X+vFT+0flNtl|hg_fJrHH{9B;Puea!AO6k7iS4Y;AxxKGc*_-#>M3v zyV`2mj#G=9dHevN9<6~b5jonz&MNQqGhu$w`=#C|#O|cwdS>#NuJ3TQH!by~_catoYMCp2)81_n(uD6-tLW$D# zp2@IZqIA8R84gI4uD6BZ3W?J7Zeh4qqIA7m8LpEkU2iMHO%kQ+ZDY7iqIA7yF}y>f zbiM5icS)44w}asUiPH6UGCU#?xZdpyk4pru_iTpuN%XFF2g3&>de^&?;lmP{>ph3z z8zqw0doIJbtByI3;UjslV~oPlcpM9Wp>Ck$yyvrJ9{{=w%*b%h9xLMgjCdq(46PaJ z#i9XkIth)$kRC7PVboC-mBgFe6WCwiB637{yBPIM-WcaAIsZw_j5kd7^Lb;#K*rkG z-DJNAxHf*+p;phCeHvl!u}`sD$4*9%90>hCXO|M3?TxZp3Y_h|fMEsB_U>ZXtExW4 zaADq9MkR)sw?A(zqXIFq10v@F<82_&XpzV+N$(;3M){6V-w>K~FAG_rm5(d(LXx$(1y$rlBLUo11%%7=PGa1h1(^1i z&NEthBpw#t50iLa5}{rdzn`oZO;%DdFD3I;#WYx#k#$UEZ;tZI$$MQ}E$4*;B;LRs zwrr(|5tJVYAyO>rM@e^qRxNdKAIPI5&9=INoHxKRTI&!ysUoL*%xJDFN!Nll+UqLP zb)by~JA4@Fn?R>p>}rbakRoPlTtikDSh6{;B{iTZvpudOZ^YsmwZER+af55{ZXjt)K5zTKqxe%=OU zqo(EFOf!}9Beu10*O2A^$Qa~pD6zN*VOY$C)bt30slu^zEW*N=W-^X$S z&Bcpim{$?+XNXJ9lL*uMKgTVkJR%LepOcU(buIfMBvkXr@1^R3NC2z4AX3yvSf_a{ zWPRpow`^ ziS}Wq76`$Tg=C35SS&95Xo-?VCt`Wy$s564KG#GAjNvV)D>sLsI8blF-71SMC-|M;S_n`l4Hfqh#5=h{)?1Lzz}EFO-wv6Bu^n z^(Dtd$%za*^ZH^VqGTn*xp~;M7bO86YUIg__aa=%us3gL97r}%auRbaB*g_4HU~>i zCTB@r0yRB_Ir{TZXi-x3D8jdwTeU9#7HLczQIwoMXn)Pm^ZRok!wl% z^G4PvvX*23Nbzxr`Vl4TSdt2};_o9>lZX4Vl2h4IwRt%Er(`{Y@5=))z2r0o*XQ*i zcshfp=k+6a27`5Z*tsvMV{k)W#86*Pg^hW=IB}t51M_Y|xKflfFx-Z4l_+Uscn8AO zq9n+07s6{q$wr0;5MC=vHZeSs7su+hq>172yf}_pC~0PRANmmCGZ{XR7so*hC7T&O zoEJ}^Z(A6?5qyNVFnl}sQBks$;Uh?ka4W+PDw88 z24R%GgW=~9M(H~lei31mejCHDB3vU%wljPT;nkw#Y=&P~R=0!UH_H2Pug#|0Ny8Re z`EEs?!;Tj@<-1wAb18bev%I&vN0gjL;)t`n8yAI=^GQ4aq7TITNj%~#k1!@g;wT8l zbdh+*S&n-pWyWDLo_Ch_u-&^!yomG0_}hnkrEyk^CX93*4df}g^G0wzi6|&;IEa$F zdDmnxcoiu5lzgD%R4H(J%vt2q`(*irLO7s-9x*6dQ@+wr6xWihairZpBKT2th!`@IqGdB(Et- zp+wY_JVL8e48re1>b>xyaUy~LMvr3Nr z6_S`)v1&lIUVB~E17r;Ms<>4ZCI5@)F^_1x3v!}S>Sa#<-hiB#j`QFs%;iuFYC#zT~YEUCaq%0RMBv~h>4OPStV0_^JCIZmYt_$mAuH4 zuRJ7i3Y;i;=|?OjNrmh!`3c3njn^SNpPDvVB5A3>*0G=cCcRX+Qe9J`X|y^Q`#>UD zL(*O&8ew&(g2|(>O|PE7gT9Tt1?)r6eTh3SujQ8x%@7L zxEfn=?enZk<(E*Vl7xgQdd1SGA*48AjBZX1*-Ud~&?H zhl6~{28gY=`A&Qy!y}u)$go(sh%-=d$9gCPPAKD%tEwnosZ9#MIrXg z@q&5Y!W(Buu3VO$c1@-P@|Mrx_Cv{pRe-ic63Fb8%hM9qkQr<$ z@=VBY!$-EGk2MqX!=uRc1OBaWDN{yj`J^&dSSRz}24no1*mJ-VaXHr?#Pu9e; z7IS1!I;-dz`S<*{lC7+9@1T8;_LNx-#%Eq+# zHHuA}ljhwGbwj2~pKQ}Y-av=(wA*hStF$thrlN=S*)1rm-GQX{n8`((m6EsUD>tSk z8y*V|362ZxMI=yuEA6)Fgiq&F^;l=cAS;f2?JR4Aij__2vQ`Z3w9uGjjCI_~X2@<% zDXy$ei#IEB0kRmuXYQXl&lGk(em*ti!C1emWkr|DQNxh(UqOmW--{JXpisBc~Xg2_QVA`T}9xZ@JY39P#BJT5i^ ztGD5|!4p_}I)3voDe?+d%N4Z98&lLeV?DhP5*|EV80E9Wgb18EOsU4>z-CIR_%y2Z zl#eOu^v6KmsBP@U>=lpg5dpekH2#zdf1UT_EG8dDu>9BBI+Rs`ZWIXMQJ zfj7F$i*#u1_SSB%6(*@?dftA2;B{lOUtp0kiF6UeptZ) ztsIVb7>Zo426~w00j)f|I~*O9&*ggY)EW2YfnH7^4{58pHVH(&2t|)*tGPG{^pWs5 zR&zxY=>GPsmdSL||kTwe512qswJEl_?~Wi&0h^H?H_e@^5yQ zn+qz%9s3bSu|ub{=&y2_KuJ+eB7_|UHl=c{pVj@>3r`(j12 z!6p5+qS?ffZdEj!$MpA<3fMMMV6GBi%_O}9i^1n%p;BsAm%%L(Md%*5&xXdr(c}k2 zMd0w|h|A+WRp1)dhI^v&sC^N*mNag;)V*ThI+Aj=7`UFb^ybC!I0;L+zzv+23-jd3 zD}j$uq2F9dMs|z9jg$_cJS>J&WgNIk5;#n45c}0!U}AtAxe|J|bJG)CJZ|#@?mH62 zDY#wkzysR9A+bjdwH_R^F9M(EAz!%R?8OEc*SLWPKMP@ToRmSs-_MyrXgj`!g!??& zPPxble33U{ug=kSCUD4UuW`E=c$jrNHb*;$cVU4qk@_8E%ngvhBfJ-R9UN>7C&Tjo zB=9JCZ-6InIn~W<;IZepHu6HfaT^o(vb?=h9M)ak_65E|wij&chAi+^-rf}2B;`Ta zfya3VSfSX%*ipfuEEu@xudlIPYY{OP#i`j+HypBg0|hY=ILgaO9il_R7c6c#1fF@DH3x;mA5|H@ zCD+&UQJZ0SYlYGJ-~R9g&BYcYAeEe||@0GYIzED`vZD?#r7&9zMwwcg8idVvXd6f3__ za|IvxAudU44O^?MWC9}!iyJH`v3A3MP-wv(EPe5rdn#YbodkyIv7i+U`4hpWu)9}HDq;KEHub9%>+_kMGcR$=_cs#>IjVZ#~uL>Nq>s*&b1RcpitF=Shj{ldvH;<32 zxYCB}wp!9{^|jn>wUA`lARB`>$<|`YlCY7rv@Bt5s3k81($>;iur}0^Hy}9dOW5}% z>=3ghgpg$t5)wjol8^)lOC}+ik9jkbnG9sIkYp0R=bXAr-CksddFQ{EA8Ow^=c&52 zoT^*5?y0A&6zMIFj5$hO{9lwL>TEfg^rgUGZ^e->odrR71g!a2B}zrj$oRqendra> z8Yzllj6A5duOZsEtf=BRIS%|riMEMEg!~Oq?>I>Ki}9H8Zwj_X3JF~_ij58UGkXDH zX`uLb6)lB8vwiIV`gA7-2otSJw1?y0DzPhSlM#5Qr2$*J1fCPS!x>c)gYkn$4LByI|S7H?@QIy(GkkV^TYVs{D8fo87luu&K5;d6$_y^N& z8cR*_^Dspy!k;YJhso3{#hQ>Bt(t|dVVp+tPQ)6tVmc$b9M-W8!aZRIpH8uwMYWD+ zV7{7ch1Dxm46<~el_p-^p4e+n*uDZG&-0?$VlRAlM9G?yHF}~F)gOQ6#3N)4OGrfT zZfiAqEz<`uc#AdbHDY8BXagg&w4k}Bl*5JES(MhA4U{h|SWnT~2`Xg`60X8u9^D~C z99iP5k1(>%LbmWxAE!fqrUlHS5kbJikJ#eZY_pKnETFnR*Fw_5B$X&vr)N+O{m{eI zoapB2RP0>+QHXeh5|}l zbJq=T2{+aidk^h1$(+|M_tNPClJ2gekG_zsJKoEb&dh*UDMcr+NEex|l-8AaHz1+f z=nmdD8Ua^zxFy=s*w-k&kg;y1_k;=Dh4|jqt@1uqMR#ep9$7NklQ<(fv$(B0nen0Z zE#vV?dNr5lDXd$~8T^@N8*#R+TjMQ9qHlWEyHaX`FR)m*)_Wyd`bm6Tr#*CpV~hJ1 zm@!GP4FYbVAEFpZ8D6)}dkxCcM5y5iPUnaX_v0O_g=UNEx-$<$EX3b0DAv!w)fUWo zY55kD`ZX&xYWgkIL!{tD7R0i>G)pTTt}Hhj1_P-4T!we>xVZ2fd~0mpCHbOzc<&j9 z`@47pvXp3q*dFeaE96~`onhfIMG}xfA+VmvkkBJ1e4{-ThsC z(LSP^h=^>`aMf@l>J+5ypY0uC;WJZ;!aiGi+rbLh(;IGW-;HQFriybBZSC*qz*8Dg zL59*74exFa_w-?3XG9oDNpQIrkr;)bltD$0tZk=l+Gc-MvFBqbsne?-a}FD%^z+>BrMmOSq|jJ2KMI zDo&tqWKUN!=eKL8C?P?@xU+&mC|*lKlBMD4K*8O@b1`2OBHLgS{iHU=yIV$b9v$02%kq{S(Xak8_ zd&6NxwvlAWQy9AHfhu``jbD@}P$ zWZ<^pu(j8ahI&;CcHmMSip^$BBpdD7h0U}@Dq+yB^**mG%Y{da)@@eB9)Jh+C0Hb5A z;edJ1;G=D8tZr0M$xhQSc$jNQZ zTD;9mb&Iwd*(zTtRw2LKs*V?{mqO_YuV=Q7!4-012(liaeeWktH2yS$6Ej(jn zM*6e~2#&0UCj=HKkQvZ8m+sQGp|0*-Yi{%|-J^XRprdOQFTv6?wI?8ZbL|+4IFC2H z(hqCx)mRr=J1{eDRq$Ruso`xYk`+9_qTicISBlb@_8Fw}?s~ZsWD?op^_SAKwVy$b zP3$xA*!(bmJe$S`Z}Pztr4wANk_07}c#>6XwDsdKfLL^pKDd=mv9MfQFIR5(^>qYi z%8Al*w3YkOECjb&T$IjhZ->x28cn2d!8?GdLFGit+y7O!r+Ns_uBi4x_O@l~u7uj#+2>S1N!brPR09K8=CXX{McI#-=Uix5m?h^P{+uDo ze(d4Nn>Jvc4v5A7*bHVfqU0m%YLY%(2_CmL$qv z^go9|!@Z@pM<#;dO=do3w)#pWa!CG}58=3nfj zM(Mq}?DgcxDc`P(ad(*oRQj(_i_WYV>#1;prODie05y`gx2HMU-WoMO>1}MHnfZ$L zUE@=<13unF8>#k}M=PR3(eV+Yy~jY&gyd5};x=TRgy2!#-Y=KpMa9+uOu<*+Xpv|m zeXMsBUuIenQnWWu;JZjGmVc&a4~dFN-q^l{HJt;q@i8oZR*oyeu4!A`<8e}H9L36h z_u$#!CJ>d^Dhd-_DJp;DlJamLw9bNb!Rx+><+dMrrgCJEV8X>%5;+B2|SXsDys5HMH$8iBwJx*Ik89)nVTgCi^@k8 zc_ap(IP9bwn1D8hjrEnS*-k7=_KqU!of&Gz>onH1n&da9%4(kzBTpQ6skn!iGG(la%gI9;9wUHJ3_wU#ap@6aOrzyrw<;oGIxVp7lDg~rTUAa>WP?U zWGTP8$Vt;IZyTuj;h&bPC?>{Hc@~?8s2pAF=pwvf%+Un{jt(`@ZGK#-{JbLHJ~2Hw zFk!2DgHDtP_WDd?BMyrD4Mi+tuuagI-$x(xL}i&I=i#1!+8P?0ot`4!txA(?E>Y3O z%Oj$)JWsiy6E93(%tYlSskN}{IXw5VBw6`ZYDDKe9Fs+5gc)sQ|7^w?Ua^VJ7t_?=iqy#Uy9i~W$WT* z^9p1aKE`lYgOiP@d{NOfVoAIY=db#UVyt`rB*j8P+ugFQu)QHN!QdKx99S@Lm zIV62s(IOQhWueEAo#~y$PV813v(`I5HH>efqVh3CVOAp&wT6b@Dq3orLDbf+@wu_C z>E0NuhR$j`)Hkhgw1AXGR6encZnlEC*SqMww`vg&_sxwsCknIXUaX09;3Tc8T>B}| z?hG5EYOza9omx}{92p5L>!}JlawNfngQ!~K2w7sI^Av?OCWxw#BellgPIM`(?Te~> zN7pjaYZBO3h^pgK$ty)wK`MEbs48SRpPdzTo+qNJC{9%+<&C4Lc*E+}o^(<&K2RYnN-VL;7)}&Il^15l&T9>W`3?41$iK1$qOWuUjubSr$imLT4 zF;%Q|g^G)+QbiTP7xnQWjDiE~Tu@b(q-((k?y3z^jGoclG7{f8J%Qvz)kX!}(%jwI zI7EHg>d#f>iW;_&@86Fp-%? z{_ET-6m1fZxTg8JIn2JQ>XWpC(@oQ8wo}}SJ`A`l-{O`xkHv=ev0|%R(J?THPkmLV zx~1}YZr!}Wt?Yo?5hu0HEsqT0VKdP*fIipg)@&zg4UW>3prF1xFyXGG<`kH58U>Y# zY;j{+(PC~u*bQhVN&q*a)s5haa3i+65mp_#L2Yi3*#K@#yBnj{t{Zro8)(+F8?(cW zaT$sm*^z`~qj7^e-5|RW-KZ`%%4$$IsM`(NEr&2Srboq~pITaT&^ldJQ}?j+vj6m| z>g}`Rc66zZsOnvj(;8o)iEcL(gCZPdGqo#w5_9>O(vWvEN=3 z-ds1Walg4rwf)w*iC=83*G+mSjLaMo)!3wj=d~1D&x7jv6C5Eu4XnvS^=T!J0yC~D zn!lS5tLk4T=rA%%m7L{QU$erA+e0*u@i|dFzA{N@K1!>~C?-S(mR_1)Fy0F5D)hYK+qwcU^AgX^NReW@6 zG%}AT*z6&i%3IW0)n`>+LY5{0Eik_nn5c^34|A~*ysKGVoem4G9#Ap(iZ}$mGqOY1 z&4yG^J1sw^x?M~~HO>!@Pp3kSs;HfCl1YggS5cj@;qd{os#NLilSrQD@{$nG=*ab4 zRL3iw3P$`1#nxU{R2YdyF*%KQ@wO9DeMOZMtz+O2XisdT`mLgBLa(QnLrPUt->}Jv zL?3D!r-muLp_nz%ss59K=$@g-cCua7PUMzxP=3wrg2Q-hRwn(jqV1oZK=&2Zoi$Dj zjP5bw+?pE3`|4Dje1WT2-S2p8{GFm|#OmrC?bD8ofo6u@G^?+y zqnNzr*N&G6S5K*V%t;lx=7FKHn5Y?4R`)DvrKnk}EZ13Ls|{*iQj|DFIUa+_&rA#) z>LLe;nk~wz9!0fhuQhiiXq-2WngVC#jxug`{hGg<;_i+xua43Kq}*8{HWiN@>z9T0V>43Hc)c#Hy2(NWxd3G*F z$?0DWte#kFuIdV9w$zO6{9MK({K3ntV5`LXXDykM$r2D4~}ntEApA^ZGZl3MJ|*eC4!ohvk*izX!&2TtQ!Z&aR(8$)ShqEYW6Fg)SeB(1b!X<# ztJoG>Loa}GtvWXBp!P}>&*^Z7wz;{PUiwx=7BZ@)P0GH$9$Wc+cf^)RxAo+&dnqBF zs$1meTv_)sjRGqjbaE;;VaTu41$v8V@S^Ut)QU<`_mo>>TiPnam6Rz*gbUpY#ctnn zYs~fu^0K*Em(&n;rZy~6YB|yrp(W-1-VW=%ul^&lcgj{EJ=HLbcWxT|g`)m~M0KmG zJ(8&1K0O20dMElv69JTZ#L-`vsHdsDqrNCn-MPBAlJ8~pmnVYc7lD}l9nf0*uD>E3@(gTRv{6?| z6kDGB?qz;isK3z_-`##UsXBMt-K?ry?RJZ*No=!QRb@hZ-KOf?ZFRe zwVU&0yuMMH(79BVqW){?bXB7M6lKbXcZ7D3b5g6DD@pawy484v!22f^3H8w5F6zsb ziD5II+hz|E^>-?Y{@HO+U#3h8A#h$<>K|5S`q1#o(8e5cNxx@9Aa~0?25GQY-289*Y8TQU7i-fL~7A#-~VqhB9k46L-{T1@mAm zcsE9=0^6{YRn%82vsOpiph>N7Q#JlUPeiab)%%UqDN?bFwmJwPIUlPD^Q`{@Dc( zqF$ZaCdQ}qcPXF36ZO0nSHD!52B$)xmkjM=w}$#Jr+`MVDnXCu`Ud5bxRs8aRzwbr z(|b&PoAL$RLfHHA>z_)gl}`p)mtFExw|rz;30Mvu_Hh0be`7Tt$rj2r;D1I%n1c~| zI$`9B`N%jK`sXB!2Qw=j`);GN{PtY`J^qj`r|?N2^CN8ixUwXj21IRj*SD!%@}x!QxzNdv9lV(`n)6zDQ$hxNncB zuUhNeV%O{dSgV!CRHLHY9-HH#M7sLaKcuKgZat=YvCvA3kD`9jIwxg%9@2+bYqj!} z&npXWwh~hy^P9jaUgcS6eL;ZVbPs(+IOXAV$}oRrIHko)cjiSF%p0&uBDS!TMPLRy zL-egT_ur4*-7|Ew!q!{06W}@NDIm?(+i6D|9IQ!&9Zm3x{PW#HyobNMGY~~c)E#aV z?RzS@M~LtsZ+E%gkF6Bl8aBbf& zaw)>q0N+LtC{O0iup~vqbXz~JM5&R&@OaO7Pc2FnofyXJFY%jcFCzL|b`ob{lTL^n zutOu91&T+zn6}=nq_)|VVy~&47VqR-b}yK8@F%n5q%cY;+>@9Bq)91!7_r9_QUJjw zI~#7j4=LF7w%HVidk%;{!rNE79nl`7s8o3&5{W`9=KX5S8Y#6S{uq(|F(IOT&j-|) z&OL{~T!?!vx(_$OpS&mg)7$raP>pHd(~Q`PNT<6aj_DrQ-NS0E*f};S&H;cgv?H)t zjh&|MVi(6eAuF+85fv8J*0DK%zAg`(p`w03u7k?|}#SgtOAscYuy6ZlFGR z3>!ELi*_Buw64-9hN?R-Jv%Whl^;t|;#&zQ4>;!4Ny;I4e2a4C%GPU=L9|E;S_FJ* zfKM~0bZuG?pI;(D*Cm1QDQW^+lsSp(leCyCqa@(urBdFIq#mS2RjIr&Nr?u43kUln zNytq}5IAJhcNVF>IY|w=E&H`$I64nB@%AAnw1KE;%>F} z-BL@QKx7DqqF7ZNpQq!-=J4$dehTvb_awsTq^3mBy@?>RvJ%p|Pr{TA5FeNv93U=I zoMnQ>iH;2HGu!fhiH*m=oKM7pTUU7K_`ofeAUZWZ<`QB}A~CFDR)CBKvh`)-Or*|&KA!obj=DEqF5HhEwbm?>S#zGrTQ zKo?(%JrOI$I^o$RC)uJQhj!tv7{hE}sE>|T5)FPwf`w&MXs~ed5ExX6U}=cSSw+Jl z7Gumf06Vbu-8AIVwwo1WQ*+qHBpMcT2pdMj2V+Cnr{55uCm0>{fj3athddui&R=Lp zKtu3lik?nSEKYPTW5bfq;R(veD3*Of$jz_sT_9GBvNtwmk~xS(L%}kr&nBWm+N(qU z3Uae*Lt)8L>`Dzs=;&77!AINuSisx);Hl7yBN(>}jWF1wPCNN{lbVMF=59aU(u&z` z2FdWb3A-hu*!9=h-USB;;dP>lOuBCF=#GSG3tAS12qkZT;A%hAnPFw?Z_F z@i7#qR66PAkf;^+=n#H!HmVATOn`#NEZFLgP{DRZ_H3 zM-9>A8k5KjQwF|guUO&KoM_nCg1THWdx5xEGom5l2*4o< zL7yX-ghOpZzY`vcBgLIgcw}HsH0*N1v4bqx?MNo~!~PofID#n(pP_{3Nbn&?Ff%(r zlCvBMjv#~J!;WBnctkWrl`w{Mg6wrfQwK;epa_OW;xLs#M>0T&At$_FI`=jVJ0db+ zqK<8dIWjpk&C&u*!-yl6#xSY~25^E8qK>&lbgGzW7pbTW(ub3$v}nejA4lcq>C;_$D?+-58I9CV-( zKMZzO(e!_a5m@d|)Skf0#Xmub=N2W&n-+^LVTi6kB0;fp^=t%Apu-pBen{5k>Z>6@ z_ewEbY23*%G%yjI)=Z_rIhr%ugoacRrx!c{?bxo|6AAaXbYp)pZKO8OP|(7}{k9+o zo1}5rg4SvRosFL)Z6oQF-8{+`R;`ORPx>-SN@PZ+Et-p=**SP3;QJ+-Q9FZjyLX9% zyqJLu<3H`L$36)X%Mqw=N0rn;G&7F?ZPk1gfpb90iSU^e-h@J)Gk;(p&X%X0MI+PM zkj?Hl6Q!h%;4iNAYPDjvIVA7(d5CT`#pPn|6Q=k%TO{Uxj%4VsRMYm~iEPqebN~LG z_=olad4<%L zRje&3n;fF{n%EkrP0t9G2mdis^g3CPxR7Qrv2j9z5saI#$- z67tiE&6bpv!BJ{pvLqg#DI4S+cV%SaTQ><~<9vK}V|;dKBfq0stpwzD$6Q1 z(j#ns#*}UZQ{G0}3yy`x*+UzKge9lwGNLQKD^OOk0d*0r*|d?0FuYL)%4UYj%$TlQ ziSpxQBfmw~g#YNZ-lJzuP&LsTW`@~CJ+FQf?d#FASu+nttWkI-GQ{J_j*r0|qr@#W z6R}hB1iXAbEH_Pgw5%bx0tjyq2IBE%(#)E z+&+aPEHX}$Vq}7ZB4Y=I7wH)-yFh9nyjQPB(Bt)vV16(sP+ew~a}{_znX=AhwGCo8 z$i>+`e1;qb)Er_vJp`d&c&G4>fi3lLO^AxjPm(=dSfXlb-UWQQnsGE^zD^WQ*~dRbQ`vX7%s7Kb*8>;j4g=1fXBh|9%P{n@BQ zN;SLii@1fC0L=-UfC7dXRxG_B*rticPaRVLSoNyKe4kGexx}R^z?|Hr&3gCA8 zgl{w5S@+>(@!$cR{WmfERw@YajuR+W`GT1N)!@pV7L zxgD9p1RwR#LqU-r9ga_1$AkDzXPK4{wkhfwKt-tN!jq3T1sp>)AbdMX;03c1HOC7` zg6rf2aa@UEkahpq^@{(#P7|-xb5qqGqs&CXoNg<569JS_z=hJ@Vp2PTb zY6$`?h|Qv*B%-hwg@rjxar_dbhs|?%G!LP*r#*Y{xL;L_1r#C|z;RN1h9_Piaj*;R zy!Xv=tZl{Szy;Q2&zZ=4TQLehJdTW@j(zhC>VXU!TCkCA22|IcIi$S17{!TWL%#4G z_E0C-YYC_?oXgS1ilZ~tsQ>dAFjLHD88Caa?|jc;ByzAgI<$X|D58BwIK~kcP}TcB z>Y-Y^yqFIk^F8R<2>f-+tj6~p^-y!at67qA;d{hGO)5Og&_MDe65)Hoa|H1UGnb)I zqckA+p7Knha!Xi(+dS>L6oA@Hv=lWpw`Lm}M`=wCnypDgyO#u+`a1j;&7<)TxZxy{ zkHSoS4`HZruXkY(`+Nv^RQ?1m*!p1VG)jNo3Ul|56E9NDCY+M=`+8*C2VNH6A51fZ z9sJQW^8>>7C%Q!UmdAYf-t9(PqI2^~gzwK3S^_&piT_fLa-vI5430=c{wu{?0<846#vMzsNZ8Jd^| z<%&<&sN^sf>^t`PHM%tnh0Ms%s2DH`8m$&-ln0o@Jhy#7yA`p{L)&vOs8JXD7qLC39HxxiL3^uMhQfjy-N62YSehkv8)0^EA*|=9)p$) z82(hgbsVDL`1Bw;#d^-9jxNl>QjPk20G2`KnW=vmzssZ8p)kCuR^<9xv_EiKsAV)l zm_tZwk~?542eXQaP+9o4YcvBeL=OFvY1r0v{Hwl8JWnm697#qWPF?se^YCnf2AA2n z>3ujtp2qacx%(k|198mDa4a*o#1))Cz#KCi`IR1eYLyn_40`Ooq5e08E8)A!8a}8X zW<`9=b2SeoHB-Laq@68%b#XjVFi{`X^B(#Zeh(clshP#?A^-p=Sd!Cg&pHI*1S+0 z9kU(hK4Z-aBcDe|7p8zQB$ALqhR|9K zUL^6H+>bduy_Lw*dyFEwt&u{_uLCA%DSAlNmFg6H|y!%74D5j8h2uWJ0h|M zmn_FXVyZz(n4lg~)O~w;+Trn$2pN_TPyH`@9K)u%20QIpUB#$z{9)4&HePAiMyZP-%i}1 zbP)z~pN*eT@H^XE!cJw0tjQ!D*N6LtQ%Ru4uCDGqja@_tY2|7<8Pw7UQc5DR4EHwU z69q^In?Z>g35%?mBydZ6r<2w>N$N&BEixg>p2(V2P@UL}Mn{WE6T)kER$S4xgm<p*1Qr+rrF%z+e^i@@}#2oC!y_yUym^Jpd}U-_&yJgngCe92mC z3b&!#qK2)GCbG^|&|R=VI|gV!`xW~;Prb zAI`daVV-U1m2KS}=w(L|fp&iFn~JQDDxgS5I1JuLb6^o!7bfXsPMlj@q$2vjaoU8> zXIAB2tSI~Ooet!dV4CE6*qBQcOj~;s@p$$reeBYd>ej|cUt|-ko9tR-U8aDVd)xbz zaT64*T@gsAe_XD>OzPssU5$H~>NM*LMJbKS(OsFOgC%lN*&@-Au1Z4m_JIeraR++- z$C7mB%^hpKT7j6#rvAP@SeVlm*C-fnJ`-Usx@BFf=(&y)^w%kRBI5-gDmZw-aGQX; zUcq&=xA2ElYh^F%2Dh@iCu}~$%&vK(qHm%G2j8w!gqu=m(LI{M@Vq^2-XmHrvTj}w zN1F{h2zJYYu-1;o?Gb|Ax*$weU$jDG-L@c3-W9Oh7lg^X0(QrOF!QdJBJ0itaq_N! z-L)W0-W9NqF9^hmY1Pp5~qggd+GIp{oTKbszmK9`98TuL;^o6*Y}dw0-0+i6VaCZ9icG^b^q zXkR#XH2ZE=6aK@oMtKVhFt;~ z<15FG(bx)iBfO18+d#w9jmM{*1fJCph^%KnKq87Aef7T)eOH*?6}W?Z?by+}K>`rP zt64|;86YaeSaPLN4qdKs2hK}!rTC`far+uV(5JiqtL+5Gnv2*0dZuYs^AIivo8f-qln zc}%y4i61KZ#^#o0JT`b0rn?_+#;g52KG-Gn6@KI;PKSVT}oNb4sGB7*mB>KdpUe)XkB@5ku#QVL8$ zGA}C-E^bp}^A1`8!b=tQ%H#3*ih@W`lJ8}ED_)G`tI$ssWMdC<(%*$DkZ%Ga>s3YD z)7&23O=ZD6E_p)tT54otq^Hw(zjha;s`l@Cu-$dH_`{eq@8xq<>vF+KE zY!Y)F>$MOspt%v|2^%ip>kiPFz_}1_I0*Y@5k6(6d%KFjPSnL13;!;jNc45!}+2n`cQP@+`wpa zH$AqRXss*TOKZz{H{TEZDn}me?Cf0woKX#rM7V%WOEjU(iL2zIak|G!|J&U|bP8#OQ$@kAqc-(F4~i z3Nw*P5%`fy%Eah_of%FN*uQ0hc}HAek=M~-Lw+JLdSFJ;TlD9F-#9{9WLwje=_J=q zdnXiP^uUvflJ=lk6%{bDoLIa$P3~0+JgUf(h|vSB*-os8BufvxqsSb7;wDLq9;o&? zF%q??yI&}3E>|K(1O{@_r%)vVC;DCLL}K*7R>P(5QHaq4H@I~QF?!%HiYk#9J@C~< zPMXb<2%d@21I@XL!cB}G7+vh>h&CxUYi$S>fndPVp$07W^T6j7`F0mEdZ0JxM6n6T zMBp2WSjJ$R7_o`b17&jfiO~b)dCCnFiO~a>q}Do{*#mE-Mo41x zKtv90vgaldqX(W-)RG{=+(aALknd!x8IFwB?$N;GiUM`oCW+AlImbEp)Wqn4c?IGk zMi0EGXi^cQ2euSAsi!1H58S69Y-03)QRu|8iO~b+CrC|V^uTWwdGmAv%X#42OO>?X zdk#lSmE}CJv)IwAEa!p86oolr!P(yG=f737RMGE?T&#x%6oCg<`ksy)f zJebR3ZhvPC5W&SRF|(Wp1CC5(IS&RMIg;R>E`m!OAxo@H>cKokVY8eELypuMOf8a( zV7{YMS~_!i4~@OZb}WaSK=;1*jgE`lYF0^5@99ISAOEtd1(N=GbN z&Vwf=NKE?*u41{Y6_w>Yc#=|f7t49@ATRudtj4H!9#{mh)h_qK0jx z9QA`03J606<)1dv1S=IeB1<0gV3i_83%gm)gPRns@&s|l`e3z!P+87{HHt!IIS+1j zD`2y{*`5iNgSBoYh*m6?^I)A@g`!QuA;lyb57sAXCChp66t}`+IS+1e%Pod(5!~ul zNS5>9scxyt!!3dhZl%e+ErQ$Ja+@Gq1RLENixgV~n-UZ$Sk8mZDKH5v=fM^?CW+-d z7Z57?+{AksV3M zWR~+_ryFE9qC2TBH_B>IH>leUO2u*>>`^i3r&bE)pmn;crtV?sW&i0_)k!Sp!HB9( zU^x%=smh4Mavtng6v-^-!JVo)1CU{`lL<&f&vjQ({$B@^#Gx>4C_XXSgsO23dxfxa~OhE zG~uT!i-6RiK!4YcE^-}NL;)-%w_|-l@;_@amcJ;?AJ))R`&GLE~UDNtj3l4kj z!fL>B5_Et7rB@s;FL%-P33M$FofNC+nifSU?UN|bZ-q{#5P8k=GW#|PHDM`EG}0B) z2{(3%CVAc6i}gFv>?p7RB{^e6i-mARVG>bN7N(U1&8=cP|4Z{R(MFf%Nw~C{C2!Y$ zGQ~td=H$J_6y6DH8Z6<900m@Ch!O_w!Kt@!v88KTH|*U>D!~d ziS<4pWUBBK!*V1R0N-0IR`NuzleXzH;eP1L%bh8`H8lyL#LHEiUh*_ z(61A8m?TKvVM(|jx@LtF*W_&yq4AYTLUUFZ`ii2mGjR5a4&EZ%5A8n55%P+JNw^>S ztfH{UbwayOcF<-%z#bG6p~f{y3Omv}imn5jKqTRQ=+kSRD0F9sa6j}_9C8g;KCW*o zQ%txYnpp2>RKop`Ug{_mPW{kl9JySDZWhz`ule@Rg$5$@-2QC5p7 zDq_jwqVn%b&^Uzq`3263utK<>|94aDCe*ii*Yp3LMRT2%=?M4p-!t`i2UQ67^H(XW zyvQOG?&sg(7P<-d^PkmSwUr>&<^RrP7M}jDAB|C|5zo0}}w5I!6tJwwf2@2~QR>6ykLLuBQxcE4y_wntCaKE5LSvj`e5s7fW z;4mwU1z7a$A*Ap(Y)K11ZCfh*H-@T&`-T5S>wI!XC27;ai=-0n7YZ#A!G!yTtCQpw z)wfN!U--AQ7*ROlNtG@w7Kp<6j3k{(xL^2Wk{;iE6vF*NuQxFPhq%1(mL#P`gI>5e zGcg_$?iW6sB&QV%+GSdJQdVLV^FfKZdb>inUwC&C&_%dkSdg8VkX4~%dZO@#Bt3>I z-Zdi%{d!{Duq50sydaInA>1!~HwmH;?iUXDl%yTP{lbT(JU!ul;np0EDc6uy!u`TC zb7)myrL9RxxL>$eqIgc1K)7Exs-~SlxL^2vcSMC$zwo7mc&cuZpL1p1FPU(^FyvS2 zLgBVAJT0}NQWQSr*4UP|%5WuR6YdvY=vF9p`<7e7!-y!9UvSL2R0;PBH!MZo>|+Phg*x!Ua(Rg>6ex2np7_PR~gx!dY?Ri(Dm9jXHBq&V)u z$>W`>(%pb}sVZ0VeB7l;(KL5UfK!#$0!-08ipE@{u$DlIR38&lh>XsNq7}*%i&Ap3 ze?fwVzTXtRnINPOO$y6Vk8RJQ z!!KH*cu|;92q2>!O0Bf%@QdD+0Q!teRnC0&Mb*lr(2+JMQmadgqE2OwXh|uKy#M11 zXsKyVR%V1&Y|Dz6&%Wr{1rXR6ugn}1<1=4<(Nbj=nF;|TGx_R^zMKMT@zobK6ghKL zD;-ItY4X(XJ?i@`+<5VENrx->!?E;;-fA6U{=o#>>x0 z1b1=^U?*b|(HDJ>eI4Y~HVI_a=VMEz33rDMIFKNMzERMix#bOQl^1aWolpgd1b}MRys`WOTEe@xa0BwJ4U3B3v8fxoqvhBY)r>Vi~VJNRJqowi)i*onjd; zHl$F)=Nyiew8wE7zrUt{^fiL;Y8fv+q|oldrpYio%fm7oJou%6?dH-!_N=x7DY_QCT&CNGzT6ur4Z6c;D3A!O>rTCkevk7L88FQ2xU zoq;pTO^QZS+Z!8*6D8te=2Oa8O%A=ZsSO{KUWTqx_nVB_SR z*iqKa*trcMjrI9vA{4b$>&^I2t+!M=9sitOs_n)s}k2 z`)r&AA&tzkC`Y|aOc0@`DJeJk0E_HG{3jJ+z*Ki4kLv~zSlJ`Qr4$%41H_Y8(Qd~6 zdoQ9_QW<(o$rtSONLMuu)w_sMHH(XvQPWjNaPbt(WYbl+xE6I-P0_z-GiAo-hPRGR&GXGZ0Bz>%+}t==Fu|%BJ2(`ZA-)n~#Y7mq>17~OE0c_A zQZ~elrnvsUO|t3zAS9cUF#Zig|EnaMC1$54ZZP`qqamVaNky`mfj(ieGuot=7*UD; zk%=F@g@llFnN|`G#b!z-&P<)-c(TE1I510WiQe~5uz3@1m#N=@->ir5!@P3I1e^a3 zl|rydrBDbqXExn5Z;R@WRqjoZ+;dC7xiWdQhEVGDwEB+`87(%Bu`Dn zx;ckP7SU!_UK7Sarq9IA{Sf8MBHGN#--?h$w3&4rg)E}YtOAM#qD@Mx7nh5v87!jB ztirz{3to~dq?weqLzJjtY){fQwvFetK*5(G?gCSzvygVYohmW-L%k9-SguPn(jK)ECt zxU<8cnf)j|ENli%y+{_tWYF{()Nl@irhej9B;zn>>YJWH*raXLYbb!wKA~@>oHz`c zGHfwu%8<#RDFe))sn-CvSc5`(6Gs#R#B z$HenjZyLXRq1PVBNqg0j5ph;=wG($swX5yK8I|2@arha%o!X|^J ze(oQT6@-|$Pd|@uA&TyYG2H}IHvdp=vm>~9_8(y2XxDq7@{-D7(9~m|CgQ^z)AWly zPlE<**{k}co>6AsQ_1c0%RJnJm%GUA^vgYzzP{W=Zl_=2IT4Iuf#s4A(f+O zS*+&aW|luqa-ymOVVy~Cr{BVwXDD|nxt)G1%bzE?o7_&njWsVUx5@4F+c`5YiR001 z_jqpN)*^Dm5uxAbi6Hl2JhaH_!0S5%$=l)tlY$P9!7suFPOvEG^ar@T5hXS|J2frz zQBECUOsA+vPk4Ta%10w3Of0IV0PPC_;#h*hM7-c&w0go(G-0A0gZbBk38Iwg-Kf*DNuz)BJ^^dZpUygc>9T571o+nX-*Ogc- zs`^n6b@_KSOHvNPWDj*~;VB{OijL4p1Nsx5J8+-E%o2-5Re#EJ6)LxcCAiJgo_hgc z7FFu*+@nX(L6siOL9<8GQ`$>{OuY@iMHgZKxY-RSk(}>j>IVozW5uUj7{tC40)FIv z0~b63VYs75@XJ;h7Jy7!EUNnNcO%=xqN@MF9ExBEe>8_W)X<;k(q>WB-@PAgX|bs4 zf2NRRQPux)8p^4#sOo>Em==qw{x=%0%FzyzMO7CX4QsX3x&s(oGc+2$U^S9ORnOAS zK^R8EEUJ38MzsNZku0jZu2IQhEZDQ7`!%{X3Pt16f!roD2^Lko zSlf@LnVDbYM}v9uWzv*aL~I2Bt=_SXA|u8a3VulSNfu zqkRWjGGMT%>gzZ}L8eXB*K;OybYWsq)k`(%^TeV`=9#IVhhK15Vy_3WsOl|R9?X;r zfJO*&2tj61)mu53g@?j0l-o6$-hoAx{-NiBWnDC#r{R~wAm*enjl3KNF(-v-EaPy2 z$f5S3k&MIO+N9?Z4JuZc@E2KOFlf@Sz}1B8lRQ(WaUl~!HcXw$^P~k%V9?a7GRWvs zF=*BuvUAw`{;1orXNqIFbl-myiidjE^dy1oBMd!X%x{iA|ejT%;lr$TN+L6=fRoOyd#- zlT4mzT$)ntCeJi3Q$Xp-GmXm?SR#3*afPCkMrD&{8doOih}|H3efqtJNZ7&wzW(|9l?PWE#1=EQ?#Jd_egLmu~Yiw??oI3>GCE;<36h88*K9--zxoO&VW2 zcC`0Ro@qSyKS)d|%GW=1(A3qNK0MRGmW1)06Pg6;2+(9B=St-=jj0!d8Y9T2a|?8 z(|FT?P)<{jXBxkBAPbOZ8oy##B6()tDtuh9$uns=6yL#B^2`_jnR+>XPjsA-hOk1M z=%k|EwQ7uZX$dVriE6#8EQhk-G~n9l2xH6qew+rTExCjw@J;(AzL(;d-#mQt_-`mRm?y?q=OyQ4F)@hTh|Jd5*7 z>7X^v%>W!Rg_d2O5J9_3T(y=O`J4Z*k>BrG&ZfiYz#O(4jFH3ThW}M}vnS0aTQ8ef zj26%bja2StKY$rnZb@!;vy`4>Rw9nWS(-DQ>5NMIOlJyY>L;`4{X3qGbF69nW*x>) zHpRz>)P$3rpMz9!Jfrd`j%O4n!SU=2h~RieNq!%HNsecfpz2^|Ii68cs@!xulj0=D zGbwf)&nT>%>|BSS?QFJ?dl~$j;QUur39qWmPD%uVd0Wy=>166RV(fK!psj%TQ3!D; z-97lnc0Ce|d<7AtkDL@d`*RXV?>PN0H3(QYSZukj7})3d*Z0=V5i;onSmb{y4Y*m6{pA=6P!2G~)}U;8a2K#pny z_&28tKR?AE7mx1Bj%xlbm%#hNaa8l4Y8BFSRP#5GKy_5}Z!>daJF58`NuoHa`I|_f zI;#1bNuoNc`CCY$I;#1@Byl;a`CCZ@N42}j_&omZH#oPZqnf{mf^J7O|LH7K9M$|0 zD!SsR=HE#Ia#W+{_zjZaI&nFw`3EcU0o!y`^AAw~A#zmn4^x&*M>YRQEi{1w%AS9e zs*)YmD9xNUXz0&OJX7yNz;RUbA3hgh(^1WT?yE=vA$C;rpU1ZlMNh++ZU-uxe<-)v zWw?3vS7Fm=*9W2UlFD&Z^T#~R@N=?`diIZcC@F-clahbJ^CCXMe)Z-If#$-3moQRn*_8;)v zh?ME5R_UbVKkT7Su-6h$UpSYejme{){pT@YMmg%)f4=8-B!WX*O(!M)5sq=hKI+;3 zQ4iJP<#clC0pWkp(*?Y9)U*GnhnibG>e>H@hnm!N)U*Ey&pn8z9QEvf%JVT)u65M2 z|7p)d0I-u1H8r;;xeO|;$w9LV5|4K0}Cnf*i$X3hkqn`ajBa^N*k9zidG%{USjdW7-d$n1F zVKnTdZqHefH(Ny)EkRB{*#oRs{2jcyG?fs>No(5M(N3OFhG7ip9Sm;*a0`2*VL z5X(C1*&o!XlH^g({tzbuL$REc`~@8OI{T<+e<2H;qn`asHG1IOCNl{qC4aF-?qm0w zM?L$G*G`88ALZkF*-6P?qOE`gPD&3TB4HJKAd%I;)F_sdl7FQ}jb|P8>|djO7g~Ar zuJEtp5Cz#Q$-ka6shdYV`%5+I^W>yN=82=g@e9W=(@DwSqJ?nOE*Ai!TbM%#vXhd( zm4oI{&;IQiJ$ADUN^De~ITu@D)NWPhk_tusrJ7f0>781~j<9iPJpl z*?&2AKV(lm>e+te+v#hn`wVM?L$mvW5@msAvDjJT!%YNsu?J|7y=GDCu6R zdgq*F|1}<}ei(<#8`gg%WN;O*-n?e>2Nd9QEwKg*8b>J^OEEd5WW+{kO43IqKPeJ7)$*Jr|)r zP!YKC;88|l$~}kSQAS}6BNvDHsAvD(o(&L4dm9n{`#4Bp^QdS4{hm_+z){cC^XQTz z!~Kj5fW}udjH90Y7xDAMI_lYfhlec5KI+;3fQN1_vvIi<6OL;1XyC2_6DE14PR|A$ z`;0r}kWGKq0w*}C`KvN$;7R4E=HHY--rkC%+M-cO7a+eb5*xqXT;F1{(B^dUu^+FMN@ zmXIWGH9aO3_zI`Gn3+dC>my3a?CX%iTTLHTKq!qo@)%5WNP*`juZ#DgF z1;g$<3m)~X?^EFK!&^&)c_r2{z18&nNoc!dX!*pWp7jF?Jhiu)eo%qP zkIq&?wzryoNWm=Nt)?GVaCW}fAfn0MYWlefdI4`W{X7N7=52ec>E|b^Qdr+d5;5G_ z=z}MDtLYacs?&I@=|>WQ?h>-Mn*LD*l;EwVUzntmIkCS}>ldkr1aCF{Vnvz8TTQ=2 z!6bXD>6fNdyS>%)%M?(0Z#DgL1(xWoreC2brBT`5YWkH)x&&`E{i-B{?X9MNEJ>H> zt)^eCK+<@t>DMS2wi&mVnSQOJPvNbmU#I97@K)2WS8$2mYWfXsWumv5exstdKJq!X ze^UxAx<{h7ntt9;Qkv%J;xI~Ii5-fH@t z3*szqHT|vyVV1X={_zE2wzryo_kuXfTTQ=bL73&Orr)c;7V=ip?@I}U2Y}04O}~F( znB^3tKX443>8++em=Y&@xp{N)R?{C!iL<{{T3%@S!zpq0Cr=yqiL|&>-fH^M^l-=P z#Tj}ZNe{Q(YD_mD{n7MTJ8291SbD6TE<4}okEci4sY>J%>5&95z18$jriZz_)$~st z3&`GT`jaVP{0x(=Z+WZfpH7d&2*uuN`cvsKZf`aHGwG3Pai2~POY&CJKbsz$?5(DM zE+zU{-fH^ij~&fvS;rK=aO`Nd=~!m=566yU-^z;f#bd{Dyw&tCy$`hQt)@S7Y_wel zY1Cgnb_}}&GR9Yq9pjkZYWlMuAQ8vOO8@GABf8_-rGM?%(cZVWn*QAXATgyVU;hBf zC`Eey14LKu{*9E;Q+uoF-&_z(j}FsYP5;({$kg6y`nMO1l)_t0|4!-{s<)c{-Silj zx0?RFlt2ueiQa1Z3kou|x0?Qa1(MQRP5*&{Na3xf|4`8I3dPFQuf%WG&G^ZtPeu^jiR&V| zew2jfCo~FYSRNCLOV6gD?Lo1){9J@j+>f8Y9pn{o;t{&MlQNP+3#)%XO1w<1VQqKr z@D!-lMd0qYAYBDImWlDvu{jYuo+43{RpdN%czP-(f-5LZN->8%-)%mLmW@}^$}heU z3=9s=#`cRPKi5hjx1>y`u;dpkTMAalDAtAPP!Z9lcHb&K||$X0pr$mH}ery}xN zwJKz*7Ab)LBCicJeDwKl2(Dytk=L%}BiL3vEQ6->tovnQt@g<+3(K`-b7REu0IQG9(s{}vFV31;f?F*v^5!-A z2C_{<*P#pUI@F-tpRE4#3IzO3*@t}ccgSqMq8~&gBh1v_1_(SFRw7jS9N$W$7=oNI ze&~<;QwH!m5Xjn#A0=4|LN$Pnk@Fv@)%{k4ERm~pim1{?nL2?O{h)=;ka?!M&9+Aa zD>sD7Aj-p5VipN4CL28|$wd!Nt?=X#iN18&T?f~qw}WJH2^qp1d;m@!LE!61WnRbA*J`IbAhGTZ6Lpb|=yfB+`YTZ*^cM=O zr-6+ALP3#(+V=_#j+}`;w`G%a^HZ^{qjU=A_)tmNi}*Ew?i$a{T{(=Z^pxy0|p&MKAZALp$nfmb5Nrr~ko zJ;lt8?H}jeLK5VMCE&94ZY2S-M1n)H0Yo~LB*+&@4iNjBw}B*uCWa;3NU}^y#^b~A z*7r7&s6;G&968rL-qR*Hx2AubcLxRGL^2$oj^c=*VLa2k9W2uV(UGY+oTq}?>Y}0x zParxT$51;Uyr+`@E#V{UIuA*3otz+o7LQY5hWD(m^PSjL(feTvpq9u#&KspHp)p3L zkoLfLpb0FY?0E;ND&ZfOt5cf3*YHDsX5zW}FA&H>y~l|@DBztZ-atb>?Y#S$M37qa zFv@U%Z-Io!2t#4yvK-ia{-HeQzmCBfuwQwq0+RRw9Oyu6bf zYg>Wje?zgRJZ*^5R-jOMd1n~Z1KH3-3};@?2=AtMkL&320``*g-sABAe_f$v0^SEa z)adVOmZV&GAM{Ye3Qr+*JW1u{J?fc3yu!>vi^|LUgy&>bZV5|pn@@Sp0{~ufxjGG! zx%v_`6}PDuQw*g|IcT=&=YaH*AXg{$un=v1A<94nPNIBn)?7Uwst{dwx-f`c2LTUd zL%3i|gxQl-#jP+81-7r8_dotqC#ys=ylt8!tl=HDM~pDS`#ZWsS7%l$;r&mdeMUzg zp;JJ;zo*a=*fh%hhc{7I=-v~9Bhskt%IvUz#)Sa4H; z#pdPB*XYS}o6IB}<-EsfLD<2)Z2qv=BJC&8A1xp%Kz5Y#7HjlCc~XQn;UB^(txF=S zb*V+NqI?Fg@GjS=<%&!;FYk%kFd~u-gU!o(5{D?rj&k0UIg>hiF|m1hS8LSm127A+ z&|JL$zeTpAoVP*yB&UU1MiXq~5Yl2tId3BevkI8a%iE+KL|q!fNB?{Uu}sri`l|Pc zXCHi(P|J#=ocBTxJ?S7-9p$_iaSufHR7W}Q#hgIE95!s)Nbe;cdVG}@B+y2BFSSMx z$5GCEnde+&0wzI@a^A~5Gsxmzs(Qy!&U=N2svpMTa+LF4$zqs^%TdmI6^oA`R~Bug z_hTMnmAf2;avbHnS9>0U5Qd^U%6YHhJaXeJj&j~>Inl={3(O8l?@DCv*RlL*lDlam zz1Oqm8OohX8|l4)<aHs2_KC|R8QP^MfSWfc`pScsa%ZA zmNAJ8kHZDT8|uB?^D79XC8GP^#X$<2Z=c?edwvJN+rmeEk}f&&a^WM>puyJ+FGFG< z;fD*c`_TiAZQfzWyWxaxV-y6+B}i?8}3UEWC;A0_f%NSy0iL*6BRp07&W_)#g%rX=*%=PQ3&Hp zhk%xf*g1~)E0oB|82|7>IXx2{m>9)-2;F$`@~hx&xq51v21iyRgttIi{}I~i+1LzL z&v2CU!DvNv@DPRvk1E?FWf`ihR?57qC#G>HGgc;tMAqv0DV&Wv0Uu`4itN?<`E^)^ z^wl_OYmPJL6W*UA$0c}&n~4pXd5eoh9U9rFDcr*!Q#;$!0@b9l3x6}hjHL^mZvI12!S%WEVv40<$ThK#k!+}AshTtG?&N$@j* ztTKkj>BLx(`;VkwV@yu(kE0rXK}Fp{p~DEhNuh1V1Ug>~$;GEc?k_2J3jwf!l@5Ot zxxXS&8^;-(KyzW9l>7gYtizzUTPb*J0JrI30iQi0a(_*dGmVj%C?zIx|COSQQCP29j{IoGq5go!7)0o-Xe=GN zBeA)mG0fO-!o0}+8;QRP)1W3An2Jr$W0lmz;GHn{@1%deU=VW#L?WXQxk4l1w+lwt zC^QbeP%wfNM6QQJFBXiTJwS>Q<=xyY4!&7{ zRnnoELn7Cwor_}sn!<6MTw;dbE{LPM<2-}-+~k~@og9w&uBD-BG&Kfm{;SZAgF|La z)go32tq{FhO)Qt?UMWXin^9%KgRImwD?#Wfx>PPxffS@Q!!T~rCM;?G9 z4j@5U@gsg5K#0Hr0uBVJNE60Z963>^a_c5(B6m8jn<`UH;!ZqOKcD^a_Wd~EjuuVj2j2kqcE9`G@9uuT-~H})_r2YR9yQ?< zM=#_Hj!zm}CBhDkP?*E|O&DpLL`pCCi{Mss5*wQ1X9)Xpk8�I9Qj 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≥Au~XwBTB8)$mh9$W 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 ../include/function_pointers_configured.h +$(HELPER_PATH_DEBUG) : proxychains_helper.o remote_function.o + $(CC) -o$@ $(filter %.c %.o %.a %.lib,$^) -Wl,-Bdynamic -lntdllcrt -lkernel32 -lcygwin + +$(HELPER_PATH_RELEASE) : proxychains_helper.o remote_function.o + $(CC) -o$@ $(filter %.c %.o %.a %.lib,$^) -Wl,-Bdynamic -lntdllcrt -lkernel32 -lcygwin + +$(REMOTE_FUNC_BIN_HEADER_DEBUG) : $(HELPER_PATH_DEBUG) + $(HELPER_PATH_DEBUG) --dump-remote-function > $@ + +$(REMOTE_FUNC_BIN_HEADER_RELEASE) : $(HELPER_PATH_RELEASE) + $(HELPER_PATH_RELEASE) --dump-remote-function > $@ -$(DLL_PATH_DEBUG) : ../minhook/libMinHook.a ../include/function_pointers_configured.h 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 dll/remote_function/remote_function.o common.o common_wsock.o ipc_message.o log.o cygwin_strsafe/strsafe.o +$(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 $(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 ../include/function_pointers_configured.h 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 dll/remote_function/remote_function.o common.o common_wsock.o ipc_message.o log.o cygwin_strsafe/strsafe.o +$(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 $(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 \ # -Wl,--enable-auto-import \ @@ -138,7 +150,7 @@ $(EXEC_PATH_DEBUG) : ../minhook/libMinHook.a exe/main.o exe/args_and_config.o ex $(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) $(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 configure +.PHONY : clean dist pre_debug pre_release clean : $(RM) MAKING_DEBUG MAKING_RELEASE @@ -147,7 +159,8 @@ clean : $(RM) $(ALL_IMPLIBS_DEBUG) $(ALL_IMPLIBS_RELEASE) $(RM) $(OBJS) $(RM) $(DEPS) - $(RM) ../include/function_pointers_configured.h configure.exe proxychains_remote_function_*.bin + $(RM) $(HELPER_PATH_DEBUG) $(HELPER_PATH_RELEASE) + $(RM) $(REMOTE_FUNC_BIN_HEADER_DEBUG) $(REMOTE_FUNC_BIN_HEADER_RELEASE) $(MAKE) -C ../minhook -f ../minhook/build/MinGW/Makefile clean ../minhook/libMinHook.a : @@ -164,13 +177,13 @@ distinstall_legacy: cp $(EXEC_PATH_RELEASE) $(PREFIX)/bin/proxychains.exe cp $(EXEC_PATH_RELEASE) $(PREFIX)/bin/px.exe cp $(DLL_PATH_RELEASE) $(PREFIX)/bin/ - cp proxychains_remote_function_*.bin $(PREFIX)/bin/ + cp $(HELPER_PATH_RELEASE) $(PREFIX)/bin/ make debug cp $(EXEC_PATH_DEBUG) $(PREFIX)/bin/proxychainsd.exe cp $(EXEC_PATH_DEBUG) $(PREFIX)/bin/pxd.exe cp $(DLL_PATH_DEBUG) $(PREFIX)/bin/ - cp proxychains_remote_function_*.bin $(PREFIX)/bin/ + cp $(HELPER_PATH_DEBUG) $(PREFIX)/bin/ rebuild : clean all diff --git a/cygwin_build/dist.sh b/cygwin_build/dist.sh new file mode 100644 index 0000000..65b87f6 --- /dev/null +++ b/cygwin_build/dist.sh @@ -0,0 +1,69 @@ +#!/bin/bash +# dist.sh +# 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 +# . + +set -euo pipefail + +if [ -z "$PXCH_VERSION" ]; then +echo "Please execute \`make dist\`." >&2 +exit 1 +fi + +echo Distributing "$PXCH_VERSION"... + +# Build/Install/Dist/Clean for Win32 +cmd /c win32_build.bat + +if [ "$1" = "--install" ]; then + cmd /c win32_install.bat +fi + +zip -FS -j ../../proxychains_"$PXCH_VERSION"_win32_x64_debug.zip ../COPYING ../README*.md ../proxychains.conf ../win32_output/proxychains_x64d.exe ../win32_output/proxychains_hook_x64d.dll ../win32_output/proxychains_hook_x86d.dll ../win32_output/proxychains_helper_x64d.exe ../win32_output/proxychains_helper_x86d.exe +zip -FS -j ../../proxychains_"$PXCH_VERSION"_win32_x64.zip ../COPYING ../README*.md ../proxychains.conf ../win32_output/proxychains_x64.exe ../win32_output/proxychains_hook_x64.dll ../win32_output/proxychains_hook_x86.dll ../win32_output/proxychains_helper_x64.exe ../win32_output/proxychains_helper_x86.exe +zip -FS -j ../../proxychains_"$PXCH_VERSION"_win32_x86_debug.zip ../COPYING ../README*.md ../proxychains.conf ../win32_output/proxychains_x86d.exe ../win32_output/proxychains_hook_x86d.dll ../win32_output/proxychains_helper_x86d.exe +zip -FS -j ../../proxychains_"$PXCH_VERSION"_win32_x86.zip ../COPYING ../README*.md ../proxychains.conf ../win32_output/proxychains_x86.exe ../win32_output/proxychains_hook_x86.dll ../win32_output/proxychains_helper_x86.exe + +cmd /c win32_clean.bat + +# Some proxychains_helper_x64* is left at this moment +rm -rf ../win32_output/* + +# Build/Install/Dist//Clean for Cygwin +make release + +if [ "$1" = "--install" ]; then + cp proxychains_x64.exe /bin/proxychains.exe + ln -sf /bin/proxychains.exe /bin/px.exe + cp cygproxychains_hook_x64.dll /bin/ + cp proxychains_helper_*.exe /bin/ +fi + +zip -FS -j ../../proxychains_"$PXCH_VERSION"_cygwin_x64.zip ../COPYING ../README*.md ../proxychains.conf proxychains_x64.exe cygproxychains_hook_x64.dll proxychains_helper_x64.exe + +make debug + +if [ "$1" = "--install" ]; then + cp proxychains_x64d.exe /bin/proxychainsd.exe + ln -sf /bin/proxychainsd.exe /bin/pxd.exe + cp cygproxychains_hook_x64d.dll /bin/ + cp proxychains_helper_*.exe /bin/ +fi + +zip -FS -j ../../proxychains_"$PXCH_VERSION"_cygwin_x64_debug.zip ../COPYING ../README*.md ../proxychains.conf proxychains_x64d.exe cygproxychains_hook_x64d.dll proxychains_helper_x64.exe + +make clean +rm -rf ../include/remote_func_bin_*.h diff --git a/cygwin-build/test/a.sh b/cygwin_build/test/a.sh similarity index 100% rename from cygwin-build/test/a.sh rename to cygwin_build/test/a.sh diff --git a/cygwin-build/test/b.sh b/cygwin_build/test/b.sh similarity index 100% rename from cygwin-build/test/b.sh rename to cygwin_build/test/b.sh diff --git a/cygwin-build/test/c.sh b/cygwin_build/test/c.sh similarity index 100% rename from cygwin-build/test/c.sh rename to cygwin_build/test/c.sh diff --git a/cygwin-build/test/d.sh b/cygwin_build/test/d.sh similarity index 100% rename from cygwin-build/test/d.sh rename to cygwin_build/test/d.sh diff --git a/cygwin-build/test/e.sh b/cygwin_build/test/e.sh similarity index 100% rename from cygwin-build/test/e.sh rename to cygwin_build/test/e.sh diff --git a/cygwin-build/test/f.sh b/cygwin_build/test/f.sh similarity index 100% rename from cygwin-build/test/f.sh rename to cygwin_build/test/f.sh diff --git a/cygwin-build/test/fork_exec/Makefile b/cygwin_build/test/fork_exec/Makefile similarity index 100% rename from cygwin-build/test/fork_exec/Makefile rename to cygwin_build/test/fork_exec/Makefile diff --git a/cygwin-build/test/fork_exec/test.c b/cygwin_build/test/fork_exec/test.c similarity index 100% rename from cygwin-build/test/fork_exec/test.c rename to cygwin_build/test/fork_exec/test.c diff --git a/cygwin-build/test/fork_exec/test2.c b/cygwin_build/test/fork_exec/test2.c similarity index 100% rename from cygwin-build/test/fork_exec/test2.c rename to cygwin_build/test/fork_exec/test2.c diff --git a/cygwin-build/test/spawn_ctrlc/Makefile b/cygwin_build/test/spawn_ctrlc/Makefile similarity index 100% rename from cygwin-build/test/spawn_ctrlc/Makefile rename to cygwin_build/test/spawn_ctrlc/Makefile diff --git a/cygwin-build/test/spawn_ctrlc/ctrlc.c b/cygwin_build/test/spawn_ctrlc/ctrlc.c similarity index 100% rename from cygwin-build/test/spawn_ctrlc/ctrlc.c rename to cygwin_build/test/spawn_ctrlc/ctrlc.c diff --git a/cygwin-build/test/spawn_ctrlc/test.c b/cygwin_build/test/spawn_ctrlc/test.c similarity index 100% rename from cygwin-build/test/spawn_ctrlc/test.c rename to cygwin_build/test/spawn_ctrlc/test.c diff --git a/cygwin-build/test/sprintf/Makefile b/cygwin_build/test/sprintf/Makefile similarity index 100% rename from cygwin-build/test/sprintf/Makefile rename to cygwin_build/test/sprintf/Makefile diff --git a/cygwin-build/test/sprintf/sprintf.c b/cygwin_build/test/sprintf/sprintf.c similarity index 100% rename from cygwin-build/test/sprintf/sprintf.c rename to cygwin_build/test/sprintf/sprintf.c diff --git a/cygwin-build/dist.bat b/cygwin_build/win32_build.bat similarity index 98% rename from cygwin-build/dist.bat rename to cygwin_build/win32_build.bat index 06d3343..7bd7ec9 100644 --- a/cygwin-build/dist.bat +++ b/cygwin_build/win32_build.bat @@ -1,4 +1,4 @@ -@rem dist.bat +@rem win32_build.bat @rem Copyright (C) 2020 Feng Shun. @rem @rem This program is free software: you can redistribute it and/or modify diff --git a/cygwin_build/win32_clean.bat b/cygwin_build/win32_clean.bat new file mode 100644 index 0000000..7670c0c --- /dev/null +++ b/cygwin_build/win32_clean.bat @@ -0,0 +1,22 @@ +@rem win32_build.bat +@rem Copyright (C) 2020 Feng Shun. +@rem +@rem This program is free software: you can redistribute it and/or modify +@rem it under the terms of the GNU General Public License version 2 as +@rem published by the Free Software Foundation, either version 3 of the +@rem License, or (at your option) any later version. +@rem +@rem This program is distributed in the hope that it will be useful, +@rem but WITHOUT ANY WARRANTY; without even the implied warranty of +@rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +@rem GNU General Public License version 2 for more details. +@rem +@rem You should have received a copy of the GNU General Public License +@rem version 2 along with this program. If not, see +@rem . + +"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.com" ..\proxychains.exe.sln /clean "Debug^|x64" +"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.com" ..\proxychains.exe.sln /clean "Debug^|x86" +"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.com" ..\proxychains.exe.sln /clean "Release^|x64" +"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.com" ..\proxychains.exe.sln /clean "Release^|x86" + diff --git a/cygwin_build/win32_install.bat b/cygwin_build/win32_install.bat new file mode 100644 index 0000000..268ca58 --- /dev/null +++ b/cygwin_build/win32_install.bat @@ -0,0 +1,34 @@ +@rem win32_install.bat +@rem Copyright (C) 2020 Feng Shun. +@rem +@rem This program is free software: you can redistribute it and/or modify +@rem it under the terms of the GNU General Public License version 2 as +@rem published by the Free Software Foundation, either version 3 of the +@rem License, or (at your option) any later version. +@rem +@rem This program is distributed in the hope that it will be useful, +@rem but WITHOUT ANY WARRANTY; without even the implied warranty of +@rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +@rem GNU General Public License version 2 for more details. +@rem +@rem You should have received a copy of the GNU General Public License +@rem version 2 along with this program. If not, see +@rem . + +copy %cd%\..\win32_output\proxychains_x64.exe %USERPROFILE%\bin\proxychains.exe || pause +copy %cd%\..\win32_output\proxychains_x86.exe %USERPROFILE%\bin\proxychains32.exe || pause +copy %cd%\..\win32_output\proxychains_helper_x64.exe %USERPROFILE%\bin\ || pause +copy %cd%\..\win32_output\proxychains_helper_x86.exe %USERPROFILE%\bin\ || pause +copy %cd%\..\win32_output\proxychains_hook_x64.dll %USERPROFILE%\bin\ || pause +copy %cd%\..\win32_output\proxychains_hook_x86.dll %USERPROFILE%\bin\ || pause +copy %cd%\..\win32_output\proxychains_x64d.exe %USERPROFILE%\bin\proxychainsd.exe || pause +copy %cd%\..\win32_output\proxychains_x86d.exe %USERPROFILE%\bin\proxychains32d.exe || pause +copy %cd%\..\win32_output\proxychains_hook_x64d.dll %USERPROFILE%\bin\ || pause +copy %cd%\..\win32_output\proxychains_hook_x86d.dll %USERPROFILE%\bin\ || pause +copy %cd%\..\win32_output\proxychains_helper_x64d.exe %USERPROFILE%\bin\ || pause +copy %cd%\..\win32_output\proxychains_helper_x86d.exe %USERPROFILE%\bin\ || pause + +copy %cd%\..\win32_output\proxychains_x64.exe %USERPROFILE%\bin\px.exe || pause +copy %cd%\..\win32_output\proxychains_x86.exe %USERPROFILE%\bin\px32.exe || pause +copy %cd%\..\win32_output\proxychains_x64d.exe %USERPROFILE%\bin\pxd.exe || pause +copy %cd%\..\win32_output\proxychains_x86d.exe %USERPROFILE%\bin\px32d.exe || pause diff --git a/include/common_generic.h b/include/common_generic.h index 7feb913..2075740 100644 --- a/include/common_generic.h +++ b/include/common_generic.h @@ -19,6 +19,7 @@ #pragma once #include "defines_generic.h" +#include "tls_generic.h" extern const wchar_t* g_szRuleTargetDesc[3]; @@ -27,10 +28,10 @@ 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; before that they are assigned *_early -extern wchar_t* g_szDumpMemoryBuf; -extern wchar_t* g_szErrorMessageBuf; -extern wchar_t* g_szFormatHostPortBuf; +// 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); diff --git a/include/defines_generic.h b/include/defines_generic.h index bd17c9d..b7a8e07 100644 --- a/include/defines_generic.h +++ b/include/defines_generic.h @@ -78,6 +78,7 @@ typedef unsigned int PXCH_UINT_PTR; #define PXCH_MAX_DLL_PATH_BUFSIZE 512 #define PXCH_MAX_CONFIG_FILE_PATH_BUFSIZE 512 #define PXCH_MAX_BIN_FILE_PATH_BUFSIZE 512 +#define PXCH_MAX_HELPER_PATH_BUFSIZE 512 #define PXCH_MAX_HOSTS_FILE_PATH_BUFSIZE 512 #define PXCH_MAX_DLL_FILE_NAME_BUFSIZE 64 #define PXCH_MAX_DLL_FUNC_NAME_BUFSIZE 64 @@ -318,6 +319,22 @@ typedef struct _PROXYCHAINS_CONFIG { wchar_t szMinHookDllPathX64[PXCH_MAX_DLL_PATH_BUFSIZE]; wchar_t szHostsFilePath[PXCH_MAX_HOSTS_FILE_PATH_BUFSIZE]; wchar_t szCommandLine[PXCH_MAX_COMMAND_LINE_BUFSIZE]; + + struct { + PXCH_UINT64 fpGetModuleHandleWX64; + PXCH_UINT64 fpLoadLibraryWX64; + PXCH_UINT64 fpGetProcAddressX64; + PXCH_UINT64 fpFreeLibraryX64; + PXCH_UINT64 fpGetLastErrorX64; + PXCH_UINT64 fpOutputDebugStringAX64; + + PXCH_UINT64 fpGetModuleHandleWX86; + PXCH_UINT64 fpLoadLibraryWX86; + PXCH_UINT64 fpGetProcAddressX86; + PXCH_UINT64 fpFreeLibraryX86; + PXCH_UINT64 fpGetLastErrorX86; + PXCH_UINT64 fpOutputDebugStringAX86; + } FunctionPointers; PXCH_UINT32 cbProxyListOffset; PXCH_UINT32 dwProxyNum; @@ -368,9 +385,20 @@ static const wchar_t g_szChildDataSavingFileMappingPrefix[] = L"Local\\proxychai #define PXCH_HOOKDLL_DEBUG_SUFFIX_NARROW "" #endif +// Deprecated #define PXCH_DUMP_REMOTE_FUNCTION_X64_PATH "proxychains_remote_function_x64" PXCH_HOOKDLL_DEBUG_SUFFIX_NARROW ".bin" #define PXCH_DUMP_REMOTE_FUNCTION_X86_PATH "proxychains_remote_function_x86" PXCH_HOOKDLL_DEBUG_SUFFIX_NARROW ".bin" +#if __CYGWIN__ +#define PXCH_REDIRECT_NULL_FILE "/dev/null" +#else +#define PXCH_REDIRECT_NULL_FILE "nul" +#endif + +#define PXCH_HELPER_X64_COMMANDLINE_SUFFIX "proxychains_helper_x64" PXCH_HOOKDLL_DEBUG_SUFFIX_NARROW ".exe --get-winapi-func-addr 2> " PXCH_REDIRECT_NULL_FILE +#define PXCH_HELPER_X86_COMMANDLINE_SUFFIX "proxychains_helper_x86" PXCH_HOOKDLL_DEBUG_SUFFIX_NARROW ".exe --get-winapi-func-addr 2> " PXCH_REDIRECT_NULL_FILE + + #if defined(_M_X64) || defined(__x86_64__) #define PXCH_HOOKDLL_ARCHITECT_SUFFIX L"_x64" #define szMinHookDllPath szMinHookDllPathX64 diff --git a/include/defines_win32.h b/include/defines_win32.h index 2ba6815..0e601a8 100644 --- a/include/defines_win32.h +++ b/include/defines_win32.h @@ -65,13 +65,6 @@ typedef struct _PXCH_INJECT_REMOTE_DATA { PXCH_UINT32 dwParentPid; PXCH_UINT32 dwDebugDepth; - PXCH_UINT64 fpGetModuleHandleW; - PXCH_UINT64 fpLoadLibraryW; - PXCH_UINT64 fpGetProcAddress; - PXCH_UINT64 fpFreeLibrary; - PXCH_UINT64 fpGetLastError; - PXCH_UINT64 fpOutputDebugStringA; - CHAR szInitFuncName[PXCH_MAX_DLL_FUNC_NAME_BUFSIZE]; CHAR szCIWCVarName[PXCH_MAX_DLL_FUNC_NAME_BUFSIZE]; @@ -88,5 +81,4 @@ typedef struct _PXCH_INJECT_REMOTE_DATA { extern PXCH_DLL_API BOOL g_bCurrentlyInWinapiCall; extern PXCH_DLL_API DWORD g_dwCurrentProcessIdForVerify; -extern PXCH_DLL_API PXCH_UINT32 g_dwTlsIndex; diff --git a/include/hookdll_win32.h b/include/hookdll_win32.h index b612a7e..ff10e60 100644 --- a/include/hookdll_win32.h +++ b/include/hookdll_win32.h @@ -25,7 +25,6 @@ #define PXCH_INITHOOK_SYMBOL_NAME_X64 "InitHook" #define PXCH_INITHOOK_SYMBOL_NAME_X86 "_InitHook@4" -PXCH_DLL_API BOOL DumpRemoteFunction(void); PXCH_DLL_API DWORD __stdcall InitHook(PXCH_INJECT_REMOTE_DATA * pData); PXCH_DLL_API DWORD __stdcall InitHookForMain(PROXYCHAINS_CONFIG * pConfig); PXCH_DLL_API void UninitHook(void); diff --git a/include/log_generic.h b/include/log_generic.h index 7f00ba6..100a71a 100644 --- a/include/log_generic.h +++ b/include/log_generic.h @@ -23,7 +23,6 @@ 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 -// TODO: make log_* pointers instead of macros, like what we do in common_generic.h #define log_ods_buf (g_dwTlsIndex ? PXCH_TLS_PTR_LOG_ODS_BUF(g_dwTlsIndex) : log_ods_buf_early) #define PXCH_LOG_LEVEL_VERBOSE 600 diff --git a/include/log_win32.h b/include/log_win32.h index 85abdcc..ce7f690 100644 --- a/include/log_win32.h +++ b/include/log_win32.h @@ -62,7 +62,6 @@ static void __attribute__((unused)) suppress_unused_variable(void) #endif // After the load of Hook DLL, they will be per-thread(in TLS), thread safe -// TODO: make log_* pointers instead of macros, like what we do in common_generic.h #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) diff --git a/include/remote_win32.h b/include/remote_win32.h index 314d067..5405ec6 100644 --- a/include/remote_win32.h +++ b/include/remote_win32.h @@ -20,12 +20,23 @@ #include "includes_win32.h" +#if defined(_M_X64) || defined(__x86_64__) +#define FUNCTION_SUFFIX_ARCH X64 +#else +#define FUNCTION_SUFFIX_ARCH X86 +#endif + +#define CAST_FUNC_ADDR_WITH_PTR_ARCH(pRemoteData, funcName, arch) ((Fp##funcName)((pRemoteData)->pxchConfig.FunctionPointers.fp##funcName##arch)) +#define CAST_FUNC_ADDR_WITH_PTR_ARCH_X(pRemoteData, funcName, arch) CAST_FUNC_ADDR_WITH_PTR_ARCH(pRemoteData, funcName, arch) +#define CAST_FUNC_ADDR_WITH_PTR(pRemoteData, funcName) CAST_FUNC_ADDR_WITH_PTR_ARCH_X(pRemoteData, funcName, FUNCTION_SUFFIX_ARCH) +#define CAST_FUNC_ADDR(funcName) CAST_FUNC_ADDR_WITH_PTR_ARCH_X(pRemoteData, funcName, FUNCTION_SUFFIX_ARCH) + #define PXCHDEBUG_ODS #if defined(PXCHDEBUG_ODS) && defined(_DEBUG) -#define DBGCHR(ch) do { ((FpOutputDebugStringA)(pRemoteData->fpOutputDebugStringA))(pRemoteData->chDebugOutput + ((ch) - 'A') * 2); } while(0) -#define DBGCHR_GP(ch) do { if (g_pRemoteData) ((FpOutputDebugStringA)(pRemoteData->fpOutputDebugStringA))(g_pRemoteData->chDebugOutput + ((ch) - 'A') * 2); } while(0) -#define DBGSTR_GP(str) do { if (g_pRemoteData) ((FpOutputDebugStringA)(pRemoteData->fpOutputDebugStringA))(str); } while(0) +#define DBGCHR(ch) do { CAST_FUNC_ADDR(OutputDebugStringA)(pRemoteData->chDebugOutput + ((ch) - 'A') * 2); } while(0) +#define DBGCHR_GP(ch) do { if (g_pRemoteData) CAST_FUNC_ADDR_WITH_PTR(g_pRemoteData, OutputDebugStringA)(g_pRemoteData->chDebugOutput + ((ch) - 'A') * 2); } while(0) +#define DBGSTR_GP(str) do { if (g_pRemoteData) CAST_FUNC_ADDR_WITH_PTR(g_pRemoteData, OutputDebugStringA)(str); } while(0) #else #define DBGCHR(ch) do { } while(0) #define DBGCHR_GP(ch) do { } while(0) diff --git a/include/tls_generic.h b/include/tls_generic.h index 658619e..e236179 100644 --- a/include/tls_generic.h +++ b/include/tls_generic.h @@ -26,9 +26,9 @@ #define PXCH_TLS_W32HOSTENT_ALIAS_NUM 16 #define PXCH_TLS_W32HOSTENT_ALIAS_BUFSIZE 64 -extern PXCH_DLL_API PXCH_UINT32 g_dwTlsIndex; -extern PXCH_DLL_API const PXCH_UINT32 g_dwW32HostentSize; -extern PXCH_DLL_API const PXCH_UINT32 g_dwW32SystemTimeSize; +extern PXCH_UINT32 g_dwTlsIndex; +extern const PXCH_UINT32 g_dwW32HostentSize; +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])) diff --git a/include/version.h b/include/version.h index 5809eeb..b3643df 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 3 +#define PXCH_VERSION_PATCH 4 #endif \ No newline at end of file diff --git a/proxychains.exe.sln b/proxychains.exe.sln index 50c8846..c0e10bb 100644 --- a/proxychains.exe.sln +++ b/proxychains.exe.sln @@ -20,7 +20,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test\test.vcxproj", EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "minhook\build\VC15\libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Configure", "Configure\Configure.vcxproj", "{91EF5C95-F872-47AE-B045-C39C7DBE2FF0}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "proxychains_helper", "proxychains_helper\proxychains_helper.vcxproj", "{91EF5C95-F872-47AE-B045-C39C7DBE2FF0}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -62,10 +62,10 @@ Global {0D8AB1EC-7D1C-4475-AB7E-411F36137C94}.Release|x64.Build.0 = Release|x64 {0D8AB1EC-7D1C-4475-AB7E-411F36137C94}.Release|x86.ActiveCfg = Release|Win32 {0D8AB1EC-7D1C-4475-AB7E-411F36137C94}.Release|x86.Build.0 = Release|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x86.ActiveCfg = Debug|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x86.Build.0 = Debug|Win32 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Release|x64 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Release|x64 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x86.ActiveCfg = Release|Win32 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x86.Build.0 = Release|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x86.ActiveCfg = Release|Win32 diff --git a/proxychains.exe/proxychains.exe.vcxproj b/proxychains.exe/proxychains.exe.vcxproj index 80ad817..542771f 100644 --- a/proxychains.exe/proxychains.exe.vcxproj +++ b/proxychains.exe/proxychains.exe.vcxproj @@ -117,6 +117,7 @@ _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true NotUsing + MultiThreadedDLL Console @@ -132,7 +133,8 @@ cd /d $(SolutionDir)win32_output -.\$(TargetFileName) --dump-remote +.\proxychains_helper_x86d.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x86d.h +.\proxychains_helper_x64d.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x64d.h something_not_exists;%(Outputs) @@ -147,6 +149,7 @@ _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true NotUsing + MultiThreadedDLL Console @@ -162,7 +165,8 @@ cd /d $(SolutionDir)win32_output -.\$(TargetFileName) --dump-remote +.\proxychains_helper_x86d.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x86d.h +.\proxychains_helper_x64d.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x64d.h something_not_exists;%(Outputs) @@ -196,7 +200,8 @@ cd /d $(SolutionDir)win32_output -.\$(TargetFileName) --dump-remote +.\proxychains_helper_x86.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x86.h +.\proxychains_helper_x64.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x64.h something_not_exists;%(Outputs) @@ -230,7 +235,8 @@ cd /d $(SolutionDir)win32_output -.\$(TargetFileName) --dump-remote +.\proxychains_helper_x86.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x86.h +.\proxychains_helper_x64.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x64.h something_not_exists;%(Outputs) diff --git a/proxychains_common/proxychains_common.vcxproj b/proxychains_common/proxychains_common.vcxproj index 218c6f2..ceb66e1 100644 --- a/proxychains_common/proxychains_common.vcxproj +++ b/proxychains_common/proxychains_common.vcxproj @@ -105,6 +105,7 @@ _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true NotUsing + MultiThreadedDLL Console @@ -118,6 +119,7 @@ _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true NotUsing + MultiThreadedDLL Console diff --git a/Configure/Configure.vcxproj b/proxychains_helper/proxychains_helper.vcxproj similarity index 69% rename from Configure/Configure.vcxproj rename to proxychains_helper/proxychains_helper.vcxproj index 24b2d34..991612a 100644 --- a/Configure/Configure.vcxproj +++ b/proxychains_helper/proxychains_helper.vcxproj @@ -18,6 +18,51 @@ x64 + + + + false + + + + + false + + + + + false + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + {d7744e4c-b1f8-495b-bdd4-dcdb0738b2be} + + 16.0 {91EF5C95-F872-47AE-B045-C39C7DBE2FF0} @@ -80,22 +125,26 @@ true $(SolutionDir)win32_output\ - $(ProjectName)_x86 + $(ProjectName)_x86d + $(SolutionDir)uthash\src;$(SolutionDir)minhook\include;$(SolutionDir)include;$(IncludePath) true $(SolutionDir)win32_output\ - $(ProjectName)_x64 + $(ProjectName)_x64d + $(SolutionDir)uthash\src;$(SolutionDir)minhook\include;$(SolutionDir)include;$(IncludePath) false $(SolutionDir)win32_output\ $(ProjectName)_x86 + $(SolutionDir)uthash\src;$(SolutionDir)minhook\include;$(SolutionDir)include;$(IncludePath) false $(SolutionDir)win32_output\ $(ProjectName)_x64 + $(SolutionDir)uthash\src;$(SolutionDir)minhook\include;$(SolutionDir)include;$(IncludePath) @@ -103,6 +152,7 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + MultiThreadedDLL Console @@ -115,6 +165,7 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + MultiThreadedDLL Console @@ -153,10 +204,10 @@ true - - - + + + \ No newline at end of file diff --git a/proxychains_helper/proxychains_helper.vcxproj.filters b/proxychains_helper/proxychains_helper.vcxproj.filters new file mode 100644 index 0000000..e59a467 --- /dev/null +++ b/proxychains_helper/proxychains_helper.vcxproj.filters @@ -0,0 +1,60 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + 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 8eaae2d..7bf7ca8 100644 --- a/proxychains_hook.dll/proxychains_hook.dll.vcxproj +++ b/proxychains_hook.dll/proxychains_hook.dll.vcxproj @@ -108,6 +108,7 @@ PXCH_DLL_EXPORTS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true NotUsing + MultiThreadedDLL Console @@ -120,7 +121,8 @@ cd /d $(SolutionDir)win32_output -.\configure_x86.exe > $(SolutionDir)include\function_pointers_configured.h +.\proxychains_helper_x86d.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x86d.h +.\proxychains_helper_x64d.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x64d.h @@ -130,6 +132,7 @@ PXCH_DLL_EXPORTS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true NotUsing + MultiThreadedDLL Console @@ -142,7 +145,8 @@ cd /d $(SolutionDir)win32_output -.\configure_x86.exe > $(SolutionDir)include\function_pointers_configured.h +.\proxychains_helper_x86d.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x86d.h +.\proxychains_helper_x64d.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x64d.h @@ -168,7 +172,8 @@ cd /d $(SolutionDir)win32_output -.\configure_x86.exe > $(SolutionDir)include\function_pointers_configured.h +.\proxychains_helper_x86.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x86.h +.\proxychains_helper_x64.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x64.h @@ -194,7 +199,8 @@ cd /d $(SolutionDir)win32_output -.\configure_x86.exe > $(SolutionDir)include\function_pointers_configured.h +.\proxychains_helper_x86.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x86.h +.\proxychains_helper_x64.exe --dump-remote-function > $(SolutionDir)include\remote_func_bin_x64.h @@ -205,30 +211,6 @@ - - false - false - false - false - false - false - - - - - - - - - - - - - - - - - diff --git a/proxychains_hook.dll/proxychains_hook.dll.vcxproj.filters b/proxychains_hook.dll/proxychains_hook.dll.vcxproj.filters index 5c615c0..56413e0 100644 --- a/proxychains_hook.dll/proxychains_hook.dll.vcxproj.filters +++ b/proxychains_hook.dll/proxychains_hook.dll.vcxproj.filters @@ -18,9 +18,6 @@ Sources - - Sources - Sources diff --git a/src/common.c b/src/common.c index f538792..8a005bb 100644 --- a/src/common.c +++ b/src/common.c @@ -19,12 +19,12 @@ #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]; -wchar_t* g_szDumpMemoryBuf = g_szDumpMemoryBuf_early; -wchar_t* g_szErrorMessageBuf = g_szErrorMessageBuf_early; - static WCHAR szFwprintfWbuf[PXCH_MAX_FWPRINTF_BUFSIZE]; static CHAR szFwprintfBuf[PXCH_MAX_FWPRINTF_BUFSIZE]; diff --git a/src/common_wsock.c b/src/common_wsock.c index a7b1e31..c258d5b 100644 --- a/src/common_wsock.c +++ b/src/common_wsock.c @@ -29,8 +29,9 @@ #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]; -wchar_t* g_szFormatHostPortBuf = g_szFormatHostPortBuf_early; const wchar_t* FormatHostPortToStr(const void* pHostPort, int iAddrLen) { diff --git a/src/configure.c b/src/configure.c deleted file mode 100644 index 55cea60..0000000 --- a/src/configure.c +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* configure.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 -#include -#include - -#ifdef __CYGWIN__ -#define PREFIX_ZERO_X "" -#else -#define PREFIX_ZERO_X L"0x" -#endif - -#if defined(_M_X64) || defined(__x86_64__) -// #error "Only compile it to x86 program" -int main() -{ - wprintf(L"#define PXCH_ADDRESS_FreeLibrary " PREFIX_ZERO_X L"%p\n", NULL); - wprintf(L"#define PXCH_ADDRESS_GetModuleHandleW " PREFIX_ZERO_X L"%p\n", NULL); - wprintf(L"#define PXCH_ADDRESS_GetProcAddress " PREFIX_ZERO_X L"%p\n", NULL); - wprintf(L"#define PXCH_ADDRESS_LoadLibraryW " PREFIX_ZERO_X L"%p\n", NULL); - wprintf(L"#define PXCH_ADDRESS_GetLastError " PREFIX_ZERO_X L"%p\n", NULL); - wprintf(L"#define PXCH_ADDRESS_OutputDebugStringA " PREFIX_ZERO_X L"%p\n", NULL); - return 0; -} -#else -int main() -{ - wprintf(L"#define PXCH_ADDRESS_FreeLibrary " PREFIX_ZERO_X L"%p\n", &FreeLibrary); - wprintf(L"#define PXCH_ADDRESS_GetModuleHandleW " PREFIX_ZERO_X L"%p\n", &GetModuleHandleW); - wprintf(L"#define PXCH_ADDRESS_GetProcAddress " PREFIX_ZERO_X L"%p\n", &GetProcAddress); - wprintf(L"#define PXCH_ADDRESS_LoadLibraryW " PREFIX_ZERO_X L"%p\n", &LoadLibraryW); - wprintf(L"#define PXCH_ADDRESS_GetLastError " PREFIX_ZERO_X L"%p\n", &GetLastError); - wprintf(L"#define PXCH_ADDRESS_OutputDebugStringA " PREFIX_ZERO_X L"%p\n", &OutputDebugStringA); - return 0; -} -#endif \ No newline at end of file diff --git a/src/dll/dllmain.c b/src/dll/dllmain.c index 721b2ea..cce8200 100644 --- a/src/dll/dllmain.c +++ b/src/dll/dllmain.c @@ -19,17 +19,21 @@ #define _CRT_SECURE_NO_WARNINGS #include "defines_win32.h" #include "log_win32.h" -#include "remote_win32.h" #include "hookdll_interior_win32.h" #include #include "hookdll_win32.h" -#include "function_pointers_configured.h" +#ifdef _DEBUG +#include "remote_func_bin_x86d.h" +#include "remote_func_bin_x64d.h" +#else +#include "remote_func_bin_x86.h" +#include "remote_func_bin_x64.h" +#endif PXCH_INJECT_REMOTE_DATA* g_pRemoteData; PXCH_DLL_API PROXYCHAINS_CONFIG* g_pPxchConfig; PXCH_DLL_API BOOL g_bCurrentlyInWinapiCall = FALSE; -PXCH_DLL_API PXCH_UINT32 g_dwTlsIndex; UT_array* g_arrHeapAllocatedPointers; // To verify that this process has its original data (not overwritten with those of parent by fork()) @@ -39,7 +43,7 @@ static SYSTEM_INFO SystemInfo; DWORD RemoteCopyExecute(HANDLE hProcess, BOOL bIsX86, PXCH_INJECT_REMOTE_DATA* pRemoteData) { - void* pCode; + const void* pCode; void* pTargetBuf; LPTHREAD_START_ROUTINE pTargetCode; void* pTargetData; @@ -52,16 +56,24 @@ DWORD RemoteCopyExecute(HANDLE hProcess, BOOL bIsX86, PXCH_INJECT_REMOTE_DATA* p DWORD dwRemoteTid; DWORD dwRemoteDataSize = pRemoteData->dwSize; + // if (bIsX86) { + // pCode = PXCH_CONFIG_REMOTE_FUNC_X86(g_pPxchConfig); + // cbCodeSize = g_pPxchConfig->cbRemoteFuncX86Size; + // } else { + // pCode = PXCH_CONFIG_REMOTE_FUNC_X64(g_pPxchConfig); + // cbCodeSize = g_pPxchConfig->cbRemoteFuncX64Size; + // } if (bIsX86) { - pCode = PXCH_CONFIG_REMOTE_FUNC_X86(g_pPxchConfig); - cbCodeSize = g_pPxchConfig->cbRemoteFuncX86Size; + pCode = g_RemoteFuncX86; + cbCodeSize = sizeof(g_RemoteFuncX86) - 1; } else { - pCode = PXCH_CONFIG_REMOTE_FUNC_X64(g_pPxchConfig); - cbCodeSize = g_pPxchConfig->cbRemoteFuncX64Size; + pCode = g_RemoteFuncX64; + cbCodeSize = sizeof(g_RemoteFuncX64) - 1; } if (!cbCodeSize) return ERROR_NOT_SUPPORTED; + IPCLOGD(L"Before DumpMemory"); IPCLOGD(L"%ls", DumpMemory(pCode, 16)); IPCLOGV(L"CreateProcessW: Before VirtualAllocEx. %lld", (long long)cbCodeSize); @@ -176,7 +188,6 @@ DWORD InjectTargetProcess(const PROCESS_INFORMATION* pPi) DWORD dwExtraSize = PXCH_CONFIG_EXTRA_SIZE_G; BOOL bIsX86; BOOL bIsWow64; - BOOL bSelfIsX86; hProcess = pPi->hProcess; if (!IsWow64Process(hProcess, &bIsWow64)) goto err_wow64; @@ -184,22 +195,25 @@ DWORD InjectTargetProcess(const PROCESS_INFORMATION* pPi) bIsX86 = (SystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL || bIsWow64); // Another method to inject X64 -> X86: https://github.com/OpenWireSec/metasploit/blob/master/external/source/meterpreter/source/common/arch/win/i386/base_inject.c - if (bIsX86) { - IPCLOGD(L"X86 process."); + if (g_pPxchConfig->FunctionPointers.fpGetModuleHandleWX86 == 0) { + IPCLOGD(L"Child is an X86(Win32) process; function address missing: won't inject"); + return NO_ERROR; + } else { + IPCLOGD(L"Child is an X86(Win32) process."); + } } else { - IPCLOGD(L"X64 process."); + if (g_pPxchConfig->FunctionPointers.fpGetModuleHandleWX64 == 0) { + IPCLOGD(L"Child is an X64 process; function address missing: won't inject"); + return NO_ERROR; + } else { + IPCLOGD(L"Child is an X64 process."); + } } -#if defined(_M_X64) || defined(__x86_64__) - bSelfIsX86 = FALSE; -#else - bSelfIsX86 = TRUE; -#endif - pRemoteData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PXCH_INJECT_REMOTE_DATA) + dwExtraSize); - IPCLOGD(L"CreateProcessW: Entering InjectTargetProcess. %llu", (unsigned long long)(sizeof(*pRemoteData) + dwExtraSize)); + IPCLOGV(L"CreateProcessW: Entering InjectTargetProcess. %llu", (unsigned long long)(sizeof(*pRemoteData) + dwExtraSize)); IPCLOGV(L"CreateProcessW: Before CopyMemory. " WPRDW, 0); @@ -210,28 +224,12 @@ DWORD InjectTargetProcess(const PROCESS_INFORMATION* pPi) pRemoteData->dwErrorCode = -1; pRemoteData->dwParentPid = GetCurrentProcessId(); - if (bIsX86 && !bSelfIsX86) { - pRemoteData->fpFreeLibrary = (PXCH_UINT64)PXCH_ADDRESS_FreeLibrary; - pRemoteData->fpGetModuleHandleW = (PXCH_UINT64)PXCH_ADDRESS_GetModuleHandleW; - pRemoteData->fpGetProcAddress = (PXCH_UINT64)PXCH_ADDRESS_GetProcAddress; - pRemoteData->fpLoadLibraryW = (PXCH_UINT64)PXCH_ADDRESS_LoadLibraryW; - pRemoteData->fpGetLastError = (PXCH_UINT64)PXCH_ADDRESS_GetLastError; - pRemoteData->fpOutputDebugStringA = (PXCH_UINT64)PXCH_ADDRESS_OutputDebugStringA; - } else { - pRemoteData->fpFreeLibrary = (PXCH_UINT64)FreeLibrary; - pRemoteData->fpGetModuleHandleW = (PXCH_UINT64)GetModuleHandleW; - pRemoteData->fpGetProcAddress = (PXCH_UINT64)GetProcAddress; - pRemoteData->fpLoadLibraryW = (PXCH_UINT64)LoadLibraryW; - pRemoteData->fpGetLastError = (PXCH_UINT64)GetLastError; - pRemoteData->fpOutputDebugStringA = (PXCH_UINT64)OutputDebugStringA; - } - pRemoteData->dwDebugDepth = g_pRemoteData ? g_pRemoteData->dwDebugDepth + 1 : 1; IPCLOGV(L"CreateProcessW: After remoteData assignment. " WPRDW, 0); - StringCchCopyA(pRemoteData->szInitFuncName, _countof(pRemoteData->szInitFuncName), g_pRemoteData ? g_pRemoteData->szInitFuncName : bIsX86 ? PXCH_INITHOOK_SYMBOL_NAME_X86 : PXCH_INITHOOK_SYMBOL_NAME_X64); - StringCchCopyA(pRemoteData->szCIWCVarName, _countof(pRemoteData->szCIWCVarName), g_pRemoteData ? g_pRemoteData->szCIWCVarName : "g_bCurrentlyInWinapiCall"); + StringCchCopyA(pRemoteData->szInitFuncName, _countof(pRemoteData->szInitFuncName), bIsX86 ? PXCH_INITHOOK_SYMBOL_NAME_X86 : PXCH_INITHOOK_SYMBOL_NAME_X64); + StringCchCopyA(pRemoteData->szCIWCVarName, _countof(pRemoteData->szCIWCVarName), "g_bCurrentlyInWinapiCall"); CopyMemory(pRemoteData->chDebugOutput, g_pRemoteData ? g_pRemoteData->chDebugOutput : "A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P\0Q\0R\0S\0T\0", sizeof(pRemoteData->chDebugOutput)); StringCchCopyW(pRemoteData->szCygwin1ModuleName, _countof(pRemoteData->szCygwin1ModuleName), g_pRemoteData ? g_pRemoteData->szCygwin1ModuleName : L"cygwin1.dll"); StringCchCopyW(pRemoteData->szHookDllModuleName, _countof(pRemoteData->szHookDllModuleName), g_pRemoteData ? g_pRemoteData->szHookDllModuleName : g_szHookDllFileName); @@ -270,39 +268,6 @@ DWORD InjectTargetProcess(const PROCESS_INFORMATION* pPi) return dwReturn; } -PXCH_DLL_API BOOL DumpRemoteFunction(void) -{ - FILE* f; - void* pCode = LoadHookDll; - void* pAfterCode = LoadHookDll_End; - SSIZE_T cbCodeSize; - SSIZE_T cbCodeSizeAligned; - - f = fopen(PXCH_DUMP_REMOTE_FUNCTION_PATH, "wb"); - if (f == NULL) return FALSE; - - if (*(BYTE*)pCode == 0xE9) { - LOGV(L"Function body is a JMP instruction! This is usually caused by \"incremental linking\". Although I will handle that in a right way, but there might be problems in the future. Try to disable that."); - pCode = (void*)((char*)pCode + *(DWORD*)((char*)pCode + 1) + 5); - } - - if (*(BYTE*)pAfterCode == 0xE9) { - pAfterCode = (void*)((char*)pAfterCode + *(DWORD*)((char*)pAfterCode + 1) + 5); - } - - cbCodeSize = ((char*)pAfterCode - (char*)pCode); - cbCodeSizeAligned = (cbCodeSize + (sizeof(LONG_PTR) - 1)) & ~(sizeof(LONG_PTR) - 1); - - if (fwrite(pCode, cbCodeSizeAligned, 1, f) != 1) goto err_ret_close; - - fclose(f); - return TRUE; - -err_ret_close: - fclose(f); - return FALSE; -} - PXCH_DLL_API DWORD __stdcall InitHookForMain(PROXYCHAINS_CONFIG* pPxchConfig) { MH_Initialize(); @@ -393,12 +358,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) pvData = HeapAlloc(GetProcessHeap(), 0, PXCH_TLS_TOTAL_SIZE); TlsSetValue(g_dwTlsIndex, pvData); ODBGSTRLOG(L"Initialized TLS: g_dwTlsIndex = " WPRDW, g_dwTlsIndex); - - g_szDumpMemoryBuf = PXCH_TLS_PTR_DUMP_MEMORY_BUF_BY_BASE(pvData); - g_szErrorMessageBuf = PXCH_TLS_PTR_ERROR_MESSAGE_BUF_BY_BASE(pvData); - g_szFormatHostPortBuf = PXCH_TLS_PTR_FORMAT_HOST_PORT_BUF_BY_BASE(pvData); - - // TODO: initialize log_* here after they are made as pointers rather than macros break; case DLL_THREAD_DETACH: diff --git a/src/dll/dllutil_log_func.c b/src/dll/dllutil_log_func.c index af0cdfc..6557740 100644 --- a/src/dll/dllutil_log_func.c +++ b/src/dll/dllutil_log_func.c @@ -20,8 +20,6 @@ #include "tls_generic.h" #include "hookdll_generic.h" -const PXCH_UINT32 g_dwW32SystemTimeSize = sizeof(SYSTEMTIME); - 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, ...) diff --git a/src/dll/dllutil_wsock.c b/src/dll/dllutil_wsock.c index 4f8d28a..74af3ff 100644 --- a/src/dll/dllutil_wsock.c +++ b/src/dll/dllutil_wsock.c @@ -31,9 +31,6 @@ #include "hookdll_win32.h" #include "ut_helpers.h" - -PXCH_DLL_API const PXCH_UINT32 g_dwW32HostentSize = sizeof(struct hostent); - void HostentToHostnameAndIps(PXCH_HOSTNAME* pHostname, PXCH_UINT32* pdwIpNum, PXCH_IP_ADDRESS* Ips, const struct hostent* pHostent) { PXCH_UINT32 i; diff --git a/src/dll/hook_createprocess_win32.c b/src/dll/hook_createprocess_win32.c index 32ef083..9a4b6c8 100644 --- a/src/dll/hook_createprocess_win32.c +++ b/src/dll/hook_createprocess_win32.c @@ -55,6 +55,7 @@ PROXY_FUNC(CreateProcessA) err_inject: // PrintErrorToFile(stderr, dwReturn); + // TODO: remove this line SetLastError(dwReturn); return 1; } @@ -78,7 +79,7 @@ PROXY_FUNC(CreateProcessW) bRet = orig_fpCreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags | CREATE_SUSPENDED, lpEnvironment, lpCurrentDirectory, lpStartupInfo, &processInformation); dwErrorCode = GetLastError(); - IPCLOGV(L"CreateProcessW: Created.(%u) Child process id: " WPRDW, bRet, processInformation.dwProcessId); + IPCLOGD(L"CreateProcessW: Created.(%u) Child process id: " WPRDW, bRet, processInformation.dwProcessId); if (lpProcessInformation) { CopyMemory(lpProcessInformation, &processInformation, sizeof(PROCESS_INFORMATION)); @@ -111,6 +112,7 @@ PROXY_FUNC(CreateProcessW) err_inject: IPCLOGE(L"Injecting WINPID " WPRDW L" Error: %ls", processInformation.dwProcessId, FormatErrorToStr(dwReturn)); + // TODO: remove this line SetLastError(dwReturn); g_bCurrentlyInWinapiCall = FALSE; return 1; diff --git a/src/exe/args_and_config.c b/src/exe/args_and_config.c index 9e484ac..830d11a 100644 --- a/src/exe/args_and_config.c +++ b/src/exe/args_and_config.c @@ -35,6 +35,7 @@ #ifndef __CYGWIN__ #pragma comment(lib, "Shlwapi.lib") #pragma comment(lib, "Ws2_32.lib") +#define popen _popen #endif #define PXCH_CONFIG_PARSE_WHITE L" \n\t\r\v" @@ -42,6 +43,19 @@ #define PXCH_CONFIG_PARSE_HEX PXCH_CONFIG_PARSE_DIGIT L"abcdefABCDEF" #define PXCH_CONFIG_PARSE_IP_PORT PXCH_CONFIG_PARSE_HEX L"[.:]" +#if defined(_M_X64) || defined(__x86_64__) +#define FUNCTION_SUFFIX_ARCH X64 +#else +#define FUNCTION_SUFFIX_ARCH X86 +#endif + +#define ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, funcName, funcPtr, arch) (pPxchConfig)->FunctionPointers.fp##funcName##arch = (PXCH_UINT64)(funcPtr) +#define ASSIGN_FUNC_ADDR_WITH_ARCH_X(pPxchConfig, funcName, funcPtr, arch) ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, funcName, funcPtr, arch) +#define ASSIGN_NATIVE_FUNC_ADDR(pPxchConfig, funcName) ASSIGN_FUNC_ADDR_WITH_ARCH_X(pPxchConfig, funcName, &funcName, FUNCTION_SUFFIX_ARCH) +#define ASSIGN_FUNC_ADDR(pPxchConfig, funcName, funcPtr) ASSIGN_FUNC_ADDR_WITH_ARCH_X(pPxchConfig, funcName, funcPtr, FUNCTION_SUFFIX_ARCH) + +#define PRINT_FUNC_ADDR_OF_BOTH_ARCH(pPxchConfig, funcName) LOGD(L"fp" PREFIX_L(#funcName) L"X64 = %p", (pPxchConfig)->FunctionPointers.fp##funcName##X64);LOGD(L"fp" PREFIX_L(#funcName) L"X86 = %p", (pPxchConfig)->FunctionPointers.fp##funcName##X86) + #ifndef __CYGWIN__ #define wcsncasecmp _wcsnicmp #endif @@ -517,8 +531,8 @@ void PrintConfiguration(PROXYCHAINS_CONFIG* pPxchConfig) } LOGD(L""); - LOGD(L"RemoteFuncX64 Offset: " WPRDW L", Size: " WPRDW, pPxchConfig->cbRemoteFuncX64Offset, pPxchConfig->cbRemoteFuncX64Size); - LOGD(L"RemoteFuncX86 Offset: " WPRDW L", Size: " WPRDW, pPxchConfig->cbRemoteFuncX86Offset, pPxchConfig->cbRemoteFuncX86Size); + LOGD(L"(Deprecated)RemoteFuncX64 Offset: " WPRDW L", Size: " WPRDW, pPxchConfig->cbRemoteFuncX64Offset, pPxchConfig->cbRemoteFuncX64Size); + LOGD(L"(Deprecated)RemoteFuncX86 Offset: " WPRDW L", Size: " WPRDW, pPxchConfig->cbRemoteFuncX86Offset, pPxchConfig->cbRemoteFuncX86Size); LOGD(L"PXCH_CONFIG_EXTRA_SIZE_G: " WPRDW, PXCH_CONFIG_EXTRA_SIZE_G); } @@ -531,8 +545,8 @@ DWORD LoadConfiguration(PROXYCHAINS_CONFIG** ppPxchConfig, PROXYCHAINS_CONFIG* p ULARGE_INTEGER uli; PROXYCHAINS_CONFIG* pPxchConfig; int iDummy; - CHAR szBinFileX64Path[PXCH_MAX_BIN_FILE_PATH_BUFSIZE]; - CHAR szBinFileX86Path[PXCH_MAX_BIN_FILE_PATH_BUFSIZE]; + CHAR szHelperX64CommandLine[PXCH_MAX_HELPER_PATH_BUFSIZE]; + CHAR szHelperX86CommandLine[PXCH_MAX_HELPER_PATH_BUFSIZE]; WCHAR szConfigurationLine[PXCH_MAX_CONFIGURATION_LINE_BUFSIZE]; WCHAR szHostsLine[PXCH_MAX_HOSTS_LINE_BUFSIZE]; unsigned long long ullLineNum; @@ -543,13 +557,10 @@ DWORD LoadConfiguration(PROXYCHAINS_CONFIG** ppPxchConfig, PROXYCHAINS_CONFIG* p DWORD dwProxyCounter = 0; DWORD dwRuleCounter = 0; DWORD dwHostsEntryCounter = 0; - FILE* fRemoteFuncX64 = NULL; - FILE* fRemoteFuncX86 = NULL; WSAStartup(MAKEWORD(2, 2), &wsaData); - // Default - + // Defaults pPxchConfig = pTempPxchConfig; pPxchConfig->dwMasterProcessId = GetCurrentProcessId(); @@ -569,15 +580,23 @@ DWORD LoadConfiguration(PROXYCHAINS_CONFIG** ppPxchConfig, PROXYCHAINS_CONFIG* p if (FAILED(StringCchCopyW(pPxchConfig->szHookDllPathX86, PXCH_MAX_DLL_PATH_BUFSIZE, pPxchConfig->szHookDllPathX64))) goto err_insuf_buf; if (FAILED(StringCchCopyW(pPxchConfig->szMinHookDllPathX64, PXCH_MAX_DLL_PATH_BUFSIZE, pPxchConfig->szHookDllPathX64))) goto err_insuf_buf; if (FAILED(StringCchCopyW(pPxchConfig->szMinHookDllPathX86, PXCH_MAX_DLL_PATH_BUFSIZE, pPxchConfig->szHookDllPathX64))) goto err_insuf_buf; - if (FAILED(StringCchPrintfA(szBinFileX64Path, PXCH_MAX_BIN_FILE_PATH_BUFSIZE, "%ls", pPxchConfig->szHookDllPathX64))) goto err_insuf_buf; - if (FAILED(StringCchPrintfA(szBinFileX86Path, PXCH_MAX_BIN_FILE_PATH_BUFSIZE, "%ls", pPxchConfig->szHookDllPathX64))) goto err_insuf_buf; + if (FAILED(StringCchPrintfA(szHelperX64CommandLine, PXCH_MAX_HELPER_PATH_BUFSIZE, "%ls", pPxchConfig->szHookDllPathX64))) goto err_insuf_buf; + if (FAILED(StringCchPrintfA(szHelperX86CommandLine, PXCH_MAX_HELPER_PATH_BUFSIZE, "%ls", pPxchConfig->szHookDllPathX64))) goto err_insuf_buf; + +#ifdef __CYGWIN__ + { + CHAR* pChar; + for (pChar = szHelperX64CommandLine; *pChar; pChar++) if (*pChar == '\\') *pChar = '/'; + for (pChar = szHelperX86CommandLine; *pChar; pChar++) if (*pChar == '\\') *pChar = '/'; + } +#endif if (FAILED(StringCchCatW(pPxchConfig->szHookDllPathX64, PXCH_MAX_DLL_PATH_BUFSIZE, g_szHookDllFileNameX64))) goto err_insuf_buf; if (FAILED(StringCchCatW(pPxchConfig->szHookDllPathX86, PXCH_MAX_DLL_PATH_BUFSIZE, g_szHookDllFileNameX86))) goto err_insuf_buf; if (FAILED(StringCchCatW(pPxchConfig->szMinHookDllPathX64, PXCH_MAX_DLL_PATH_BUFSIZE, g_szMinHookDllFileNameX64))) goto err_insuf_buf; if (FAILED(StringCchCatW(pPxchConfig->szMinHookDllPathX86, PXCH_MAX_DLL_PATH_BUFSIZE, g_szMinHookDllFileNameX86))) goto err_insuf_buf; - if (FAILED(StringCchCatA(szBinFileX64Path, PXCH_MAX_BIN_FILE_PATH_BUFSIZE, PXCH_DUMP_REMOTE_FUNCTION_X64_PATH))) goto err_insuf_buf; - if (FAILED(StringCchCatA(szBinFileX86Path, PXCH_MAX_BIN_FILE_PATH_BUFSIZE, PXCH_DUMP_REMOTE_FUNCTION_X86_PATH))) goto err_insuf_buf; + if (FAILED(StringCchCatA(szHelperX64CommandLine, PXCH_MAX_HELPER_PATH_BUFSIZE, PXCH_HELPER_X64_COMMANDLINE_SUFFIX))) goto err_insuf_buf; + if (FAILED(StringCchCatA(szHelperX86CommandLine, PXCH_MAX_HELPER_PATH_BUFSIZE, PXCH_HELPER_X86_COMMANDLINE_SUFFIX))) goto err_insuf_buf; #if defined(_M_X64) || defined(__x86_64__) if (!PathFileExistsW(pPxchConfig->szHookDllPathX64)) goto err_dll_not_exist; @@ -642,7 +661,6 @@ DWORD LoadConfiguration(PROXYCHAINS_CONFIG** ppPxchConfig, PROXYCHAINS_CONFIG* p LOGE(L"Config line %llu: Unknown proxy: %.*ls", ullLineNum, sOptionNameEnd - sOption, sOption); goto err_invalid_config; } else if (WSTR_EQUAL(sOption, sOptionNameEnd, L"strict_chain")) { - LOGD(L"Use strict chain"); } else if (WSTR_EQUAL(sOption, sOptionNameEnd, L"random_chain")) { pszParseErrorMessage = L"random_chain is not supported!"; goto err_invalid_config_with_msg; @@ -660,7 +678,6 @@ DWORD LoadConfiguration(PROXYCHAINS_CONFIG** ppPxchConfig, PROXYCHAINS_CONFIG* p pPxchConfig->dwLogLevel = (DWORD)lValue; } } else if (WSTR_EQUAL(sOption, sOptionNameEnd, L"proxy_dns")) { - LOGD(L"Proxy dns using fake IP"); pTempPxchConfig->dwWillUseFakeIpAsRemoteDns = TRUE; } else if (WSTR_EQUAL(sOption, sOptionNameEnd, L"proxy_dns_udp_associate")) { pszParseErrorMessage = L"proxy_dns_udp_associate is not supported!"; @@ -810,35 +827,11 @@ DWORD LoadConfiguration(PROXYCHAINS_CONFIG** ppPxchConfig, PROXYCHAINS_CONFIG* p if (dwLastError != ERROR_END_OF_MEDIA) goto err_read_hosts; - // Open remote function .bin files - fRemoteFuncX64 = fopen(szBinFileX64Path, "rb"); - if (fRemoteFuncX64 == NULL) { -#if defined(_M_X64) || defined(__x86_64__) - goto err_remote_func; -#else - (void)fRemoteFuncX64; - pPxchConfig->cbRemoteFuncX64Size = 0; -#endif - } else { - fseek(fRemoteFuncX64, 0, SEEK_END); - pPxchConfig->cbRemoteFuncX64Size = (PXCH_UINT32)ftell(fRemoteFuncX64); - } - - fRemoteFuncX86 = fopen(szBinFileX86Path, "rb"); - if (fRemoteFuncX86 == NULL) { -#if !(defined(_M_X64) || defined(__x86_64__)) - goto err_remote_func; -#else - (void)fRemoteFuncX86; - pPxchConfig->cbRemoteFuncX86Size = 0; -#endif - } else { - fseek(fRemoteFuncX86, 0, SEEK_END); - pPxchConfig->cbRemoteFuncX86Size = (PXCH_UINT32)ftell(fRemoteFuncX86); - } + // Deprecated + pPxchConfig->cbRemoteFuncX64Size = 0; + pPxchConfig->cbRemoteFuncX86Size = 0; // Allocate space - pPxchConfig = *ppPxchConfig = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PROXYCHAINS_CONFIG) + PXCH_CONFIG_EXTRA_SIZE_BY_N(dwProxyNum, dwRuleNum, dwHostsEntryNum, pPxchConfig->cbRemoteFuncX64Size, pPxchConfig->cbRemoteFuncX86Size)); CopyMemory(pPxchConfig, pTempPxchConfig, sizeof(PROXYCHAINS_CONFIG)); @@ -849,23 +842,10 @@ DWORD LoadConfiguration(PROXYCHAINS_CONFIG** ppPxchConfig, PROXYCHAINS_CONFIG* p pPxchConfig->cbRuleListOffset = sizeof(PROXYCHAINS_CONFIG) + (sizeof(PXCH_PROXY_DATA) * pPxchConfig->dwProxyNum); pPxchConfig->dwHostsEntryNum = dwHostsEntryNum; pPxchConfig->cbHostsEntryListOffset = sizeof(PROXYCHAINS_CONFIG) + (sizeof(PXCH_PROXY_DATA) * pPxchConfig->dwProxyNum) + (sizeof(PXCH_RULE) * pPxchConfig->dwRuleNum); - + // Deprecated pPxchConfig->cbRemoteFuncX64Offset = pPxchConfig->cbHostsEntryListOffset + (sizeof(PXCH_HOSTS_ENTRY) * pPxchConfig->dwHostsEntryNum); pPxchConfig->cbRemoteFuncX86Offset = pPxchConfig->cbRemoteFuncX64Offset + pPxchConfig->cbRemoteFuncX64Size; - // Write remote function - if (fRemoteFuncX64) { - fseek(fRemoteFuncX64, 0, SEEK_SET); - if (fread(PXCH_CONFIG_REMOTE_FUNC_X64(pPxchConfig), pPxchConfig->cbRemoteFuncX64Size, 1, fRemoteFuncX64) != 1) goto err_remote_func; - fclose(fRemoteFuncX64); - } - - if (fRemoteFuncX86) { - fseek(fRemoteFuncX86, 0, SEEK_SET); - if (fread(PXCH_CONFIG_REMOTE_FUNC_X86(pPxchConfig), pPxchConfig->cbRemoteFuncX86Size, 1, fRemoteFuncX86) != 1) goto err_remote_func; - fclose(fRemoteFuncX86); - } - ConfigurationRewind(); // Parse configuration file again @@ -1123,15 +1103,70 @@ DWORD LoadConfiguration(PROXYCHAINS_CONFIG** ppPxchConfig, PROXYCHAINS_CONFIG* p if (dwLastError != ERROR_END_OF_MEDIA) goto err_read_hosts; + // Get winapi function addresses, calling helper if needed + ZeroMemory(&pPxchConfig->FunctionPointers, sizeof(pPxchConfig->FunctionPointers)); + + ASSIGN_NATIVE_FUNC_ADDR(pPxchConfig, GetModuleHandleW ); + ASSIGN_NATIVE_FUNC_ADDR(pPxchConfig, LoadLibraryW ); + ASSIGN_NATIVE_FUNC_ADDR(pPxchConfig, GetProcAddress ); + ASSIGN_NATIVE_FUNC_ADDR(pPxchConfig, FreeLibrary ); + ASSIGN_NATIVE_FUNC_ADDR(pPxchConfig, GetLastError ); + ASSIGN_NATIVE_FUNC_ADDR(pPxchConfig, OutputDebugStringA ); + +#if defined(_M_X64) || defined(__x86_64__) + { + FILE* fHelperProcOut; + fHelperProcOut = popen(szHelperX86CommandLine, "rt"); + + if (fHelperProcOut == NULL) { +#ifndef __CYGWIN__ + LOGW(L"Warning: X86 Helper executable " WPRS L" not found. In this case proxychains.exe will not inject X86 descendant processes.", szHelperX86CommandLine); +#else + LOGD(L"Warning: X86 Helper executable " WPRS L" not found. In this case proxychains.exe will not inject X86 descendant processes.", szHelperX86CommandLine); +#endif + } else { + unsigned long long tmp; + int i; + + for (i = 0; i < 6; i++) { + if (fscanf(fHelperProcOut, "%llX", &tmp) != 1) { +#ifndef __CYGWIN__ + LOGW(L"Warning: Output from X86 Helper executable is in a wrong format. In this case proxychains.exe will not inject X86 descendant processes."); +#else + LOGD(L"Warning: Output from X86 Helper executable is in a wrong format. In this case proxychains.exe will not inject X86 descendant processes."); +#endif + ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, GetModuleHandleW , NULL, X86); + ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, LoadLibraryW , NULL, X86); + ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, GetProcAddress , NULL, X86); + ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, FreeLibrary , NULL, X86); + ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, GetLastError , NULL, X86); + ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, OutputDebugStringA , NULL, X86); + break; + } + switch (i) { + case 0: ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, GetModuleHandleW , tmp, X86); break; + case 1: ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, LoadLibraryW , tmp, X86); break; + case 2: ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, GetProcAddress , tmp, X86); break; + case 3: ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, FreeLibrary , tmp, X86); break; + case 4: ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, GetLastError , tmp, X86); break; + case 5: ASSIGN_FUNC_ADDR_WITH_ARCH(pPxchConfig, OutputDebugStringA , tmp, X86); break; + } + } + } + } +#endif + + PRINT_FUNC_ADDR_OF_BOTH_ARCH(pPxchConfig, GetModuleHandleW ); + PRINT_FUNC_ADDR_OF_BOTH_ARCH(pPxchConfig, LoadLibraryW ); + PRINT_FUNC_ADDR_OF_BOTH_ARCH(pPxchConfig, GetProcAddress ); + PRINT_FUNC_ADDR_OF_BOTH_ARCH(pPxchConfig, FreeLibrary ); + PRINT_FUNC_ADDR_OF_BOTH_ARCH(pPxchConfig, GetLastError ); + PRINT_FUNC_ADDR_OF_BOTH_ARCH(pPxchConfig, OutputDebugStringA ); + return NO_ERROR; err_general: return dwLastError; -err_remote_func: - LOGE(L"Read remote function .bin files failure"); - if (fRemoteFuncX86) fclose(fRemoteFuncX86); - if (fRemoteFuncX64) fclose(fRemoteFuncX64); - return ERROR_BAD_CONFIGURATION; err_insuf_buf: return ERROR_INSUFFICIENT_BUFFER; err_dll_not_exist: @@ -1216,10 +1251,6 @@ DWORD ParseArgs(PROXYCHAINS_CONFIG* pConfig, int argc, WCHAR* argv[], int* piCom iOptionPrefixLen = 2; bOptionHasValue = TRUE; } - else if (wcsncmp(pWchar, L"--dump-remote", 13) == 0) { - if (!DumpRemoteFunction()) LOGE(L"DumpRemoteFunction() Failed!"); - exit(0); - } else if (wcsncmp(pWchar, L"-l", 2) == 0) { bOptionLogLevel = TRUE; iOptionPrefixLen = 2; diff --git a/src/exe/main.c b/src/exe/main.c index 9c6a410..66a9c12 100644 --- a/src/exe/main.c +++ b/src/exe/main.c @@ -158,13 +158,13 @@ DWORD WINAPI ServerLoop(LPVOID lpVoid) #else dwWait = WaitForMultipleObjects(PXCH_IPC_INSTANCE_NUM, hEvents, FALSE, 100); if (dwWait == WAIT_TIMEOUT) { - BOOL bChild = FALSE; - int iChildPid = 0; - while ((iChildPid = waitpid((pid_t)(-1), 0, WNOHANG)) > 0) { bChild = TRUE; } - if (bChild) { - LOGI(L"Cygwin child process exited (between WaitForMultipleObjects()). Master exiting"); - IF_CYGWIN_EXIT(0); - } + // BOOL bChild = FALSE; + // int iChildPid = 0; + // while ((iChildPid = waitpid((pid_t)(-1), 0, WNOHANG)) > 0) { bChild = TRUE; } + // if (bChild) { + // LOGI(L"Cygwin child process %d exited (between WaitForMultipleObjects()). Master exiting", iChildPid); + // IF_CYGWIN_EXIT(0); + // } continue; } #endif @@ -464,7 +464,7 @@ int wmain(int argc, WCHAR* argv[]) if ((dwError = InitProcessBookkeeping()) != NOERROR) goto err; if ((dwError = ParseArgs(&TempProxychainsConfig, argc, argv, &iCommandStart)) != NOERROR) goto err_args; if ((dwError = LoadConfiguration(&g_pPxchConfig, &TempProxychainsConfig)) != NOERROR) goto err; - if (g_pPxchConfig->dwLogLevel >= PXCH_LOG_LEVEL_INFO) PrintConfiguration(g_pPxchConfig); + if (g_pPxchConfig->dwLogLevel >= PXCH_LOG_LEVEL_DEBUG) PrintConfiguration(g_pPxchConfig); InitHookForMain(g_pPxchConfig); @@ -506,6 +506,11 @@ int wmain(int argc, WCHAR* argv[]) if (!ProxyCreateProcessW(NULL, g_pPxchConfig->szCommandLine, 0, 0, 0, 0, 0, 0, &startupInfo, &processInformation)) goto err_get; + if (g_tabPerProcess == NULL) { + LOGI(L"No child process registered. Injection might not have succeeded."); + IF_WIN32_EXIT(1); + } + SetConsoleCtrlHandler(CtrlHandler, TRUE); Sleep(INFINITE); return 0; @@ -577,7 +582,7 @@ int main(int argc, char* const argv[], char* const envp[]) if ((dwError = InitProcessBookkeeping()) != NOERROR) goto err; if ((dwError = ParseArgs(&TempProxychainsConfig, argc, wargv, &iCommandStart)) != NOERROR) goto err_args; if ((dwError = LoadConfiguration(&g_pPxchConfig, &TempProxychainsConfig)) != NOERROR) goto err; - if (g_pPxchConfig->dwLogLevel >= PXCH_LOG_LEVEL_INFO) PrintConfiguration(g_pPxchConfig); + if (g_pPxchConfig->dwLogLevel >= PXCH_LOG_LEVEL_DEBUG) PrintConfiguration(g_pPxchConfig); InitHookForMain(g_pPxchConfig); if (CreateThread(0, 0, &ServerLoop, g_pPxchConfig, 0, &dwTid) == NULL) goto err_get; @@ -618,13 +623,13 @@ int main(int argc, char* const argv[], char* const envp[]) LOGD(L"iCommandStart: %d", iCommandStart); ctx[0] = &argv[iCommandStart]; ctx[1] = envp; - - // if (CreateThread(0, 0, &CygwinSpawn, ctx, 0, &dwTid) == NULL) goto err_get; - LOGD(L"Cygwin spawn Tid: " WPRDW, dwTid); CygwinSpawn(ctx); - // i = posix_spawnp(&child_pid, &argv[iCommandStart], NULL, NULL, p_argv_command_start, p_envp); - // LOGD(L"Spawn ret: %d; CYGPID: " WPRDW L"", i, child_pid); + + if (g_tabPerProcess == NULL) { + LOGI(L"No child process registered. Injection might not have succeeded."); + IF_CYGWIN_EXIT(1); + } signal(SIGINT, handle_sigint); signal(SIGCHLD, handle_sigchld); diff --git a/src/proxychains_helper.c b/src/proxychains_helper.c new file mode 100644 index 0000000..5ffc1f0 --- /dev/null +++ b/src/proxychains_helper.c @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* proxychains_helper.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 "defines_win32.h" +#include "remote_win32.h" + +#ifdef __CYGWIN__ +#define PREFIX_ZERO_X "" +#else +#define PREFIX_ZERO_X L"0x" +#endif + +#if defined(_M_X64) || defined(__x86_64__) +#define SUFFIX_ARCH L"X64" +#else +#define SUFFIX_ARCH L"X86" +#endif + +int main(int argc, const char* const* argv) +{ + if (argc != 2) return 1; + + if (strcmp(argv[1], "--get-winapi-func-addr") == 0) { +#if defined(_M_X64) || defined(__x86_64__) + wprintf(L"%llX\n", 0ULL); + wprintf(L"%llX\n", 0ULL); + wprintf(L"%llX\n", 0ULL); + wprintf(L"%llX\n", 0ULL); + wprintf(L"%llX\n", 0ULL); + wprintf(L"%llX\n", 0ULL); +#else + wprintf(L"%llX\n", (unsigned long long)&GetModuleHandleW); + wprintf(L"%llX\n", (unsigned long long)&LoadLibraryW); + wprintf(L"%llX\n", (unsigned long long)&GetProcAddress); + wprintf(L"%llX\n", (unsigned long long)&FreeLibrary); + wprintf(L"%llX\n", (unsigned long long)&GetLastError); + wprintf(L"%llX\n", (unsigned long long)&OutputDebugStringA); +#endif + return 0; + } + + if (strcmp(argv[1], "--dump-remote-function") == 0) { + void* pCode = LoadHookDll; + void* pAfterCode = LoadHookDll_End; + SSIZE_T cbCodeSize; + SSIZE_T cbCodeSizeAligned; + SSIZE_T cb; + + if (*(BYTE*)pCode == 0xE9) { + fwprintf(stderr, L"Warning: Remote function body is a JMP instruction! This is usually caused by \"incremental linking\". Although this is correctly handled now, there might be problems in the future. Try to disable that.\n"); + pCode = (void*)((char*)pCode + *(DWORD*)((char*)pCode + 1) + 5); + } + + if (*(BYTE*)pAfterCode == 0xE9) { + pAfterCode = (void*)((char*)pAfterCode + *(DWORD*)((char*)pAfterCode + 1) + 5); + } + + cbCodeSize = ((char*)pAfterCode - (char*)pCode); + cbCodeSizeAligned = (cbCodeSize + (sizeof(LONG_PTR) - 1)) & ~(sizeof(LONG_PTR) - 1); + + wprintf(L"static const char g_RemoteFunc" SUFFIX_ARCH L"[] = \""); + + for (cb = 0; cb < cbCodeSizeAligned; cb++) { + wprintf(L"\\x%02hhX", ((char*)pCode)[cb]); + } + + wprintf(L"\";\n"); + fflush(stdout); + return 0; + } + + return 1; +} \ No newline at end of file diff --git a/src/dll/remote_function/remote_function.c b/src/remote_function.c similarity index 77% rename from src/dll/remote_function/remote_function.c rename to src/remote_function.c index f4634fd..22c7fc0 100644 --- a/src/dll/remote_function/remote_function.c +++ b/src/remote_function.c @@ -41,7 +41,7 @@ DWORD __stdcall LoadHookDll(LPVOID* pArg) DBGCHR('C'); if (pRemoteData->pxchConfig.szMinHookDllPath[0] != L'\0') { - hMinHookDllModule = ((FpLoadLibraryW)(pRemoteData->fpLoadLibraryW))(pRemoteData->pxchConfig.szMinHookDllPath); + hMinHookDllModule = CAST_FUNC_ADDR(LoadLibraryW)(pRemoteData->pxchConfig.szMinHookDllPath); if (!hMinHookDllModule) { // pRemoteData->dwErrorCode = pRemoteData->fpGetLastError(); // return pRemoteData->dwErrorCode; @@ -51,7 +51,7 @@ DWORD __stdcall LoadHookDll(LPVOID* pArg) DBGCHR('D'); // ??? - // hHookDllModule = ((FpGetModuleHandleW)(pRemoteData->fpGetModuleHandleW))(pRemoteData->szHookDllModuleName); + // hHookDllModule = CAST_FUNC_ADDR(GetModuleHandleW)(pRemoteData->szHookDllModuleName); // if (hHookDllModule) { // pRemoteData->dwErrorCode = ERROR_ALREADY_REGISTERED; // return ERROR_ALREADY_REGISTERED; @@ -61,23 +61,23 @@ DWORD __stdcall LoadHookDll(LPVOID* pArg) pRemoteData->dwErrorCode = ERROR_DLL_INIT_FAILED; - hHookDllModule = ((FpLoadLibraryW)(pRemoteData->fpLoadLibraryW))(pRemoteData->pxchConfig.szHookDllPath); + hHookDllModule = CAST_FUNC_ADDR(LoadLibraryW)(pRemoteData->pxchConfig.szHookDllPath); if (!hHookDllModule) { - pRemoteData->dwErrorCode = ((FpGetLastError)(pRemoteData->fpGetLastError))(); + pRemoteData->dwErrorCode = CAST_FUNC_ADDR(GetLastError)(); return pRemoteData->dwErrorCode; } DBGCHR('F'); pRemoteData->dwErrorCode = ERROR_PROC_NOT_FOUND; - pbCurrentlyInWinapiCall = ((FpGetProcAddress)(pRemoteData->fpGetProcAddress))(hHookDllModule, pRemoteData->szCIWCVarName); + pbCurrentlyInWinapiCall = CAST_FUNC_ADDR(GetProcAddress)(hHookDllModule, pRemoteData->szCIWCVarName); if (!pbCurrentlyInWinapiCall) goto err_getprocaddress; *(BOOL*)pbCurrentlyInWinapiCall = TRUE; DBGCHR('G'); pRemoteData->dwErrorCode = ERROR_PROC_NOT_FOUND; - fpInitFunc = ((FpGetProcAddress)(pRemoteData->fpGetProcAddress))(hHookDllModule, pRemoteData->szInitFuncName); + fpInitFunc = CAST_FUNC_ADDR(GetProcAddress)(hHookDllModule, pRemoteData->szInitFuncName); if (!fpInitFunc) goto err_getprocaddress; DBGCHR('H'); @@ -102,11 +102,11 @@ DWORD __stdcall LoadHookDll(LPVOID* pArg) goto err_after_load_dll; err_getprocaddress: - pRemoteData->dwErrorCode = ((FpGetLastError)(pRemoteData->fpGetLastError))(); + pRemoteData->dwErrorCode = CAST_FUNC_ADDR(GetLastError)(); goto err_after_load_dll; err_after_load_dll: - ((FpFreeLibrary)(pRemoteData->fpFreeLibrary))(hHookDllModule); + CAST_FUNC_ADDR(FreeLibrary)(hHookDllModule); return pRemoteData->dwErrorCode; } diff --git a/test/test.cpp b/test/test.cpp index 1ccbb52..f0f12da 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -209,7 +209,6 @@ int main() closesocket(ConnectSocket); WSACleanup(); - Sleep(INFINITE); return 0; }