diff options
Diffstat (limited to 'CheatEngineServer')
-rw-r--r-- | CheatEngineServer/CheatEngine.h | 13 | ||||
-rw-r--r-- | CheatEngineServer/CheatEngineServer.cpp | 17 | ||||
-rw-r--r-- | CheatEngineServer/CheatEngineServer.vcxproj | 2 | ||||
-rw-r--r-- | CheatEngineServer/CommandDispatcher.cpp | 110 |
4 files changed, 115 insertions, 27 deletions
diff --git a/CheatEngineServer/CheatEngine.h b/CheatEngineServer/CheatEngine.h index d2f4d41..ad75b59 100644 --- a/CheatEngineServer/CheatEngine.h +++ b/CheatEngineServer/CheatEngine.h @@ -1,7 +1,10 @@ #pragma once +#include "KInterface.h" #include <winsock.h> +#include <vector> + #define CE_PORT "52736" #define MSG_WAITALL 0x8 @@ -84,9 +87,11 @@ typedef struct { class CEConnection { public: - explicit CEConnection(SOCKET s) : sock(s) {} - SOCKET getSocket(void) { return sock; } - void closeSocket(void) { closesocket(sock); } + explicit CEConnection(SOCKET s) : m_sock(s) {} + SOCKET getSocket(void) { return m_sock; } + void closeSocket(void) { closesocket(m_sock); } + + std::vector<PROCESS_DATA> m_cachedProcesses; private: - SOCKET sock; + SOCKET m_sock; };
\ No newline at end of file diff --git a/CheatEngineServer/CheatEngineServer.cpp b/CheatEngineServer/CheatEngineServer.cpp index 2a9f54d..b06b637 100644 --- a/CheatEngineServer/CheatEngineServer.cpp +++ b/CheatEngineServer/CheatEngineServer.cpp @@ -7,7 +7,6 @@ #include "CheatEngine.h" #include "CommandDispatcher.h" -#include "KInterface.h" static SOCKET make_accept_sock(const char* servspec) { const int one = 1; @@ -74,9 +73,8 @@ static void accept_loop(const char* servspec) { for (;;) { SOCKET new_sock = accept(sock, 0, 0); - new_connection(new_sock); - //std::thread t(new_connection, new_sock); - //t.detach(); + std::thread t(new_connection, new_sock); + t.detach(); } } @@ -86,8 +84,15 @@ int main() DWORD iResult; KInterface& ki = KInterface::getInstance(); - ki.Init(); - ki.Handshake(); + std::cout << "KMemDriver Init/Handshake."; + if (ki.Init() == false || ki.Handshake() == false) { + std::cout << " Failed. [PRESS RETURN TO EXIT]" << std::endl; + getchar(); + return 1; + } + std::cout << " Ok." << std::endl; + + ki.StartPingThread(); iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { diff --git a/CheatEngineServer/CheatEngineServer.vcxproj b/CheatEngineServer/CheatEngineServer.vcxproj index 26dc9fd..3beba75 100644 --- a/CheatEngineServer/CheatEngineServer.vcxproj +++ b/CheatEngineServer/CheatEngineServer.vcxproj @@ -74,12 +74,14 @@ <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <LinkIncremental>false</LinkIncremental> + <TargetName>$(ProjectName)-kmem</TargetName> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <LinkIncremental>true</LinkIncremental> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <LinkIncremental>true</LinkIncremental> + <TargetName>$(ProjectName)-kmem</TargetName> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <LinkIncremental>false</LinkIncremental> diff --git a/CheatEngineServer/CommandDispatcher.cpp b/CheatEngineServer/CommandDispatcher.cpp index 386e2c0..8c04129 100644 --- a/CheatEngineServer/CommandDispatcher.cpp +++ b/CheatEngineServer/CommandDispatcher.cpp @@ -5,11 +5,11 @@ #include <iostream> -static int recvall(SOCKET s, void *buf, int size, int flags) +static int recvall(SOCKET s, void* buf, int size, int flags) { int totalreceived = 0; int sizeleft = size; - char *buffer = (char*)buf; + char* buffer = (char*)buf; flags = flags | MSG_WAITALL; while (sizeleft > 0) @@ -40,11 +40,11 @@ static int recvall(SOCKET s, void *buf, int size, int flags) return totalreceived; } -static int sendall(SOCKET s, void *buf, int size, int flags) +static int sendall(SOCKET s, void* buf, int size, int flags) { int totalsent = 0; int sizeleft = size; - char *buffer = (char*)buf; + char* buffer = (char*)buf; while (sizeleft > 0) { @@ -72,7 +72,7 @@ static int sendall(SOCKET s, void *buf, int size, int flags) return totalsent; } -int DispatchCommand(CEConnection & con, char command) +int DispatchCommand(CEConnection& con, char command) { enum ce_command cmd = (enum ce_command)command; @@ -86,29 +86,89 @@ int DispatchCommand(CEConnection & con, char command) break; case CMD_TERMINATESERVER: break; - case CMD_OPENPROCESS: + case CMD_OPENPROCESS: { + int pid = 0; + + if (recvall(con.getSocket(), &pid, sizeof(pid), MSG_WAITALL) > 0) + { + if (sendall(con.getSocket(), &pid, sizeof(pid), 0) > 0) { + return 0; + } + } break; + } + case CMD_CREATETOOLHELP32SNAPSHOT: { - HANDLE result = (HANDLE)((ULONG_PTR)0x1); + UINT32 result = 0x1; CeCreateToolhelp32Snapshot params; if (recvall(con.getSocket(), ¶ms, sizeof(CeCreateToolhelp32Snapshot), MSG_WAITALL) > 0) { +#if 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; +#endif + if (sendall(con.getSocket(), &result, sizeof(result), 0) > 0) + { + return 0; + } } break; } + case CMD_PROCESS32FIRST: + con.m_cachedProcesses.clear(); + KInterface::getInstance().MtProcesses(con.m_cachedProcesses); + case CMD_PROCESS32NEXT: { + UINT32 toolhelpsnapshot; + + if (recvall(con.getSocket(), &toolhelpsnapshot, sizeof(toolhelpsnapshot), MSG_WAITALL) > 0) + { + if (con.m_cachedProcesses.size() > 0) { + PROCESS_DATA pd = con.m_cachedProcesses[0]; + int imageNameLen = (int)strnlen(pd.ImageName, sizeof(pd.ImageName)); + CeProcessEntry* pcpe = (CeProcessEntry*)malloc(sizeof(*pcpe) + imageNameLen); + + con.m_cachedProcesses.erase(con.m_cachedProcesses.begin()); + if (pcpe == NULL) { + return 1; + } + pcpe->pid = (int)((ULONG_PTR)pd.UniqueProcessId); + pcpe->processnamesize = imageNameLen; + memcpy(((BYTE*)pcpe) + sizeof(*pcpe), pd.ImageName, imageNameLen); + pcpe->result = 1; + if (sendall(con.getSocket(), pcpe, sizeof(*pcpe) + imageNameLen, 0) > 0) + { + free(pcpe); + return 0; + } + free(pcpe); + } + else { + CeProcessEntry cpe; + cpe.pid = 0; + cpe.processnamesize = 0; + cpe.result = 0; + if (sendall(con.getSocket(), &cpe, sizeof(cpe), 0) > 0) + { + return 0; + } + } + } break; - case CMD_PROCESS32NEXT: - break; - case CMD_CLOSEHANDLE: + } + + case CMD_CLOSEHANDLE: { + UINT32 handle; + if (recvall(con.getSocket(), &handle, sizeof(handle), MSG_WAITALL) > 0) + { + UINT32 r = 1; + sendall(con.getSocket(), &r, sizeof(r), 0); + return 0; + } break; + } + case CMD_VIRTUALQUERYEX: break; case CMD_READPROCESSMEMORY: @@ -135,8 +195,24 @@ int DispatchCommand(CEConnection & con, char command) break; case CMD_SETTHREADCONTEXT: break; - case CMD_GETARCHITECTURE: - break; + case CMD_GETARCHITECTURE: { + unsigned char arch; +#ifdef __i386__ + arch = 0; +#endif +#ifdef __x86_64__ + arch = 1; +#endif +#ifdef __arm__ + arch = 2; +#endif +#ifdef __aarch64__ + arch = 3; +#endif + sendall(con.getSocket(), &arch, sizeof(arch), 0); + return 0; + } + case CMD_MODULE32FIRST: break; case CMD_MODULE32NEXT: @@ -168,7 +244,7 @@ int DispatchCommand(CEConnection & con, char command) return 1; } -int CheckForAndDispatchCommand(CEConnection & con) +int CheckForAndDispatchCommand(CEConnection& con) { int r; char command; |