aboutsummaryrefslogtreecommitdiff
path: root/CheatEngineServer
diff options
context:
space:
mode:
Diffstat (limited to 'CheatEngineServer')
-rw-r--r--CheatEngineServer/CheatEngine.h13
-rw-r--r--CheatEngineServer/CheatEngineServer.cpp17
-rw-r--r--CheatEngineServer/CheatEngineServer.vcxproj2
-rw-r--r--CheatEngineServer/CommandDispatcher.cpp110
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(), &params, 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;