diff options
author | segfault <toni@impl.cc> | 2020-11-27 09:16:47 -0800 |
---|---|---|
committer | segfault <toni@impl.cc> | 2020-11-27 09:16:47 -0800 |
commit | eaba393b123fe2c282d883b05c9fea28d9c6179a (patch) | |
tree | b42110c82abbff8baa20f5de44403eb1ed6b637c | |
parent | 11ab26cd9642d6be7496df5e4e14486a51fc5419 (diff) |
CEPacket template class, CMD_CREATETOOLHELP32SNAPSHOT and preps for CMD_PROCESS32FIRST / CMD_PROCESS32NEXT
-rw-r--r-- | CheatEngineServer/CheatEngine.h | 20 | ||||
-rw-r--r-- | CheatEngineServer/CheatEngineServer.cpp | 2 | ||||
-rw-r--r-- | CheatEngineServer/CommandDispatcher.cpp | 83 |
3 files changed, 104 insertions, 1 deletions
diff --git a/CheatEngineServer/CheatEngine.h b/CheatEngineServer/CheatEngine.h index 3cfbc32..9d13183 100644 --- a/CheatEngineServer/CheatEngine.h +++ b/CheatEngineServer/CheatEngine.h @@ -3,6 +3,7 @@ #include <winsock.h> #define CE_PORT "52736" +#define MSG_WAITALL 0x8 typedef enum ce_command { CMD_GETVERSION = 0, @@ -64,6 +65,25 @@ static inline char const * ce_command_to_string(enum ce_command cmd) return cmd_map[cmd]; } +#pragma pack(1) +typedef struct { + DWORD dwFlags; + DWORD th32ProcessID; +} CeCreateToolhelp32Snapshot, *PCeCreateToolhelp32Snapshot; + +typedef struct { + int result; + int pid; + int processnamesize; + //processname +} CeProcessEntry, *PCeProcessEntry; +#pragma pack() + +template <class T> +class CEPacket { + +}; + class CEConnection { public: explicit CEConnection(SOCKET s) : sock(s) {} diff --git a/CheatEngineServer/CheatEngineServer.cpp b/CheatEngineServer/CheatEngineServer.cpp index 3dc6361..436975b 100644 --- a/CheatEngineServer/CheatEngineServer.cpp +++ b/CheatEngineServer/CheatEngineServer.cpp @@ -35,9 +35,11 @@ static SOCKET make_accept_sock(const char *servspec) { setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&one, sizeof(one)); if (bind(sock, ai->ai_addr, (int)ai->ai_addrlen) != 0) { + std::cout << "bind() failed" << std::endl; } if (listen(sock, 256) != 0) { + std::cout << "listen() failed" << std::endl; } freeaddrinfo(res); diff --git a/CheatEngineServer/CommandDispatcher.cpp b/CheatEngineServer/CommandDispatcher.cpp index 1f9a7d1..386e2c0 100644 --- a/CheatEngineServer/CommandDispatcher.cpp +++ b/CheatEngineServer/CommandDispatcher.cpp @@ -4,6 +4,74 @@ #include <iostream> + +static int recvall(SOCKET s, void *buf, int size, int flags) +{ + int totalreceived = 0; + int sizeleft = size; + char *buffer = (char*)buf; + + flags = flags | MSG_WAITALL; + while (sizeleft > 0) + { + int i = recv(s, &buffer[totalreceived], sizeleft, flags); + if (i == 0) + { + std::cout << "recv returned 0" << std::endl; + return i; + } + if (i <= -1) + { + std::cout << "recv returned -1" << std::endl; + if (errno == EINTR) + { + std::cout << "errno = EINTR\n" << std::endl; + i = 0; + } + else + { + std::cout << "Error during recvall: " << (int)i << ". errno=" << errno << "\n" << std::endl; + return i; //read error, or disconnected + } + } + totalreceived += i; + sizeleft -= i; + } + return totalreceived; +} + +static int sendall(SOCKET s, void *buf, int size, int flags) +{ + int totalsent = 0; + int sizeleft = size; + char *buffer = (char*)buf; + + while (sizeleft > 0) + { + int i = send(s, &buffer[totalsent], sizeleft, flags); + + if (i == 0) + { + return i; + } + if (i == -1) + { + if (errno == EINTR) + i = 0; + else + { + std::cout << "Error during sendall: " << (int)i << ". errno=" << errno << "\n" << std::endl; + return i; + } + } + + totalsent += i; + sizeleft -= i; + } + + return totalsent; +} + int DispatchCommand(CEConnection & con, char command) { enum ce_command cmd = (enum ce_command)command; @@ -20,8 +88,21 @@ int DispatchCommand(CEConnection & con, char command) break; case CMD_OPENPROCESS: break; - case CMD_CREATETOOLHELP32SNAPSHOT: + case CMD_CREATETOOLHELP32SNAPSHOT: { + HANDLE result = (HANDLE)((ULONG_PTR)0x1); + CeCreateToolhelp32Snapshot params; + + if (recvall(con.getSocket(), ¶ms, sizeof(CeCreateToolhelp32Snapshot), MSG_WAITALL) > 0) + { + std::cout << "Calling CreateToolhelp32Snapshot with flags 0x" << std::hex << params.dwFlags + << " for PID 0x" << std::hex << params.th32ProcessID << std::endl; + } + if (sendall(con.getSocket(), &result, sizeof(result), 0) == sizeof(result)) + { + return 0; + } break; + } case CMD_PROCESS32FIRST: break; case CMD_PROCESS32NEXT: |