From 69c6bb53990276b7e0ee0cd67e7e6326735ae310 Mon Sep 17 00:00:00 2001 From: Nemirtingas Date: Fri, 14 Jun 2019 20:46:51 +0200 Subject: [PATCH] Removed dependency to rtlgenrandom for windows because we use std::random_device, so we remove the random function for linux by the way. Updated the get_env_variable for Windows so in the future we don't get suprises when having env variables with length > 1024 (even if its extremely rare). --- build_win_debug_experimental.bat | 6 +- build_win_lobby_connect.bat | 3 +- build_win_release.bat | 6 +- build_win_release_experimental.bat | 6 +- dll/base.cpp | 94 +++++++++++++++--------------- dll/rtlgenrandom.c | 4 -- dll/rtlgenrandom.def | 3 - 7 files changed, 55 insertions(+), 67 deletions(-) delete mode 100644 dll/rtlgenrandom.c delete mode 100644 dll/rtlgenrandom.def diff --git a/build_win_debug_experimental.bat b/build_win_debug_experimental.bat index 0a49f7b..4f39796 100644 --- a/build_win_debug_experimental.bat +++ b/build_win_debug_experimental.bat @@ -1,12 +1,10 @@ call build_set_protobuf_directories.bat %PROTOBUF_X86_DIRECTORY%%PROTOC_DIRECTORY% -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x86.bat -cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /I%PROTOBUF_X86_DIRECTORY%\include\ /DEMU_EXPERIMENTAL_BUILD dll/*.cpp dll/*.cc detours/*.cpp %PROTOBUF_X86_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib /EHsc /MP12 /link /OUT:steam_api.dll +cl /LD /I%PROTOBUF_X86_DIRECTORY%\include\ /DEMU_EXPERIMENTAL_BUILD dll/*.cpp dll/*.cc detours/*.cpp %PROTOBUF_X86_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib Shell32.lib /EHsc /MP12 /link /OUT:steam_api.dll cl /LD steamclient.cpp /EHsc /MP12 /link /OUT:steamclient.dll cl /LD steamnetworkingsockets.cpp /EHsc /MP12 /link /OUT:steamnetworkingsockets.dll call build_env_x64.bat -cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /I%PROTOBUF_X64_DIRECTORY%\include\ /DEMU_EXPERIMENTAL_BUILD dll/*.cpp dll/*.cc detours/*.cpp %PROTOBUF_X64_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib /EHsc /MP12 /link /OUT:steam_api64.dll +cl /LD /I%PROTOBUF_X64_DIRECTORY%\include\ /DEMU_EXPERIMENTAL_BUILD dll/*.cpp dll/*.cc detours/*.cpp %PROTOBUF_X64_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib Shell32.lib /EHsc /MP12 /link /OUT:steam_api64.dll cl /LD steamclient.cpp /EHsc /MP12 /link /OUT:steamclient64.dll cl /LD steamnetworkingsockets.cpp /EHsc /MP12 /link /OUT:steamnetworkingsockets64.dll diff --git a/build_win_lobby_connect.bat b/build_win_lobby_connect.bat index a2fbd18..bd2b29e 100644 --- a/build_win_lobby_connect.bat +++ b/build_win_lobby_connect.bat @@ -3,8 +3,7 @@ del /Q release\lobby_connect\* call build_set_protobuf_directories.bat %PROTOBUF_X86_DIRECTORY%%PROTOC_DIRECTORY% -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x86.bat -cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /DNO_DISK_WRITES /DLOBBY_CONNECT /DEMU_RELEASE_BUILD /DNDEBUG /I%PROTOBUF_X86_DIRECTORY%\include\ lobby_connect.cpp dll/*.cpp dll/*.cc %PROTOBUF_X86_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib Comdlg32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\lobby_connect\lobby_connect.exe +cl /DNO_DISK_WRITES /DLOBBY_CONNECT /DEMU_RELEASE_BUILD /DNDEBUG /I%PROTOBUF_X86_DIRECTORY%\include\ lobby_connect.cpp dll/*.cpp dll/*.cc %PROTOBUF_X86_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib Shell32.lib Comdlg32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\lobby_connect\lobby_connect.exe del /Q /S release\lobby_connect\*.lib del /Q /S release\lobby_connect\*.exp copy Readme_lobby_connect.txt release\lobby_connect\Readme.txt diff --git a/build_win_release.bat b/build_win_release.bat index 329012d..2a531ea 100644 --- a/build_win_release.bat +++ b/build_win_release.bat @@ -6,12 +6,10 @@ mkdir release call build_set_protobuf_directories.bat %PROTOBUF_X86_DIRECTORY%%PROTOC_DIRECTORY% -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x86.bat -cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /DEMU_RELEASE_BUILD /DNDEBUG /I%PROTOBUF_X86_DIRECTORY%\include\ dll/*.cpp dll/*.cc %PROTOBUF_X86_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\steam_api.dll +cl /LD /DEMU_RELEASE_BUILD /DNDEBUG /I%PROTOBUF_X86_DIRECTORY%\include\ dll/*.cpp dll/*.cc %PROTOBUF_X86_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\steam_api.dll %PROTOBUF_X64_DIRECTORY%%PROTOC_DIRECTORY% -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x64.bat -cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /DEMU_RELEASE_BUILD /DNDEBUG /I%PROTOBUF_X64_DIRECTORY%\include\ dll/*.cpp dll/*.cc %PROTOBUF_X64_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\steam_api64.dll +cl /LD /DEMU_RELEASE_BUILD /DNDEBUG /I%PROTOBUF_X64_DIRECTORY%\include\ dll/*.cpp dll/*.cc %PROTOBUF_X64_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\steam_api64.dll copy Readme_release.txt release\Readme.txt xcopy /s files_example\* release\ call build_win_release_experimental.bat diff --git a/build_win_release_experimental.bat b/build_win_release_experimental.bat index d4acf0c..59e2785 100644 --- a/build_win_release_experimental.bat +++ b/build_win_release_experimental.bat @@ -3,12 +3,10 @@ del /Q release\experimental\* call build_set_protobuf_directories.bat %PROTOBUF_X86_DIRECTORY%%PROTOC_DIRECTORY% -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x86.bat -cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DNDEBUG /I%PROTOBUF_X86_DIRECTORY%\include\ dll/*.cpp dll/*.cc detours/*.cpp %PROTOBUF_X86_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\experimental\steam_api.dll +cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DNDEBUG /I%PROTOBUF_X86_DIRECTORY%\include\ dll/*.cpp dll/*.cc detours/*.cpp %PROTOBUF_X86_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\experimental\steam_api.dll cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DNDEBUG steamclient.cpp /EHsc /MP12 /Ox /link /OUT:release\experimental\steamclient.dll %PROTOBUF_X64_DIRECTORY%%PROTOC_DIRECTORY% -I.\dll\ --cpp_out=.\dll\ .\dll\net.proto call build_env_x64.bat -cl dll/rtlgenrandom.c dll/rtlgenrandom.def -cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DNDEBUG /I%PROTOBUF_X64_DIRECTORY%\include\ dll/*.cpp dll/*.cc detours/*.cpp %PROTOBUF_X64_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib rtlgenrandom.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\experimental\steam_api64.dll +cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DNDEBUG /I%PROTOBUF_X64_DIRECTORY%\include\ dll/*.cpp dll/*.cc detours/*.cpp %PROTOBUF_X64_DIRECTORY%%PROTOBUF_LIBRARY% Iphlpapi.lib Ws2_32.lib Shell32.lib /EHsc /MP12 /Ox /link /debug:none /OUT:release\experimental\steam_api64.dll cl /LD /DEMU_RELEASE_BUILD /DEMU_EXPERIMENTAL_BUILD /DNDEBUG steamclient.cpp /EHsc /MP12 /Ox /link /OUT:release\experimental\steamclient64.dll copy Readme_experimental.txt release\experimental\Readme.txt diff --git a/dll/base.cpp b/dll/base.cpp index 7a69f0a..7a2dcf8 100644 --- a/dll/base.cpp +++ b/dll/base.cpp @@ -16,32 +16,62 @@ . */ #include "base.h" +#include + +// Random device generator +static std::random_device rd; +static std::mt19937 gen(rd()); + +static void randombytes(char* buf, size_t len) +{ + // uniform integer distribution + std::uniform_int_distribution<> dis(std::numeric_limits::min(), std::numeric_limits::max()); + + // Make sure we can hold our buffer size as int32_t + size_t rand_buf_len = len / 4 + 1; + int32_t* rand_buf = new int32_t[rand_buf_len]; + // Generator some (pseudo) random numbers + for (int i = 0; i < rand_buf_len; ++i) + rand_buf[i] = dis(gen); + + // Copy the random bytes to buffer + memcpy(buf, rand_buf, len); + + // Don't forget to free it + delete[]rand_buf; +} #ifdef STEAM_WIN32 #include #include -#define SystemFunction036 NTAPI SystemFunction036 -#include -#undef SystemFunction036 - -static void -randombytes(char * const buf, const size_t size) -{ - - RtlGenRandom((PVOID) buf, (ULONG) size); -} - std::string get_env_variable(std::string name) { - char env_variable[1024]; - DWORD ret = GetEnvironmentVariableA(name.c_str(), env_variable, sizeof(env_variable)); - if (ret <= 0) { - return std::string(); - } + // base env buffer size + constexpr size_t base_size = 1024; + DWORD size = base_size; + std::string res(base_size, '\0'); + size = GetEnvironmentVariableA(name.c_str(), const_cast(res.c_str()), size); + if (size <= 0) { + return std::string(); + } + // If GetEnvironmentVariable return is greater than the buffer size, + // then the return parameter is the env var size + if (size > base_size) + { + // So allocate that much buffer to hold it all + res.resize(size); + size = GetEnvironmentVariableA(name.c_str(), const_cast(res.c_str()), size); + if (size <= 0) + { + return std::string(); + } + } + // Then resize to what we need (without the null char, + // cause c_str() assures that it has a null char) + res.resize(size); - env_variable[ret] = 0; - return std::string(env_variable); + return res; } #else @@ -51,34 +81,6 @@ std::string get_env_variable(std::string name) #include #include -static int fd = -1; - -static void randombytes(char *buf, size_t size) -{ - int i; - - if (fd == -1) { - for (;;) { - fd = open("/dev/urandom",O_RDONLY); - if (fd != -1) break; - sleep(1); - } - } - - while (size > 0) { - if (size < 1048576) i = size; else i = 1048576; - - i = read(fd,buf,i); - if (i < 1) { - sleep(1); - continue; - } - - buf += i; - size -= i; - } -} - std::string get_env_variable(std::string name) { char *env = getenv(name.c_str()); diff --git a/dll/rtlgenrandom.c b/dll/rtlgenrandom.c deleted file mode 100644 index e160da4..0000000 --- a/dll/rtlgenrandom.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#define RtlGenRandom SystemFunction036 -#define DLLEXPORT __declspec(dllexport) -DLLEXPORT BOOLEAN WINAPI RtlGenRandom(PVOID in, ULONG len) {} \ No newline at end of file diff --git a/dll/rtlgenrandom.def b/dll/rtlgenrandom.def deleted file mode 100644 index 3f23d20..0000000 --- a/dll/rtlgenrandom.def +++ /dev/null @@ -1,3 +0,0 @@ -LIBRARY advapi32.dll -EXPORTS -SystemFunction036 \ No newline at end of file