mirror of
https://github.com/EnderIce2/rpc-bridge.git
synced 2025-05-28 23:44:36 +00:00
Compare commits
2 Commits
d065019137
...
77a2a748ad
Author | SHA1 | Date | |
---|---|---|---|
77a2a748ad | |||
0d4f46e536 |
6
Makefile
6
Makefile
@ -4,7 +4,9 @@ C_OBJECTS = $(C_SOURCES:.c=.o)
|
|||||||
GIT_COMMIT = $(shell git rev-parse --short HEAD)
|
GIT_COMMIT = $(shell git rev-parse --short HEAD)
|
||||||
GIT_BRANCH = $(shell git rev-parse --abbrev-ref HEAD)
|
GIT_BRANCH = $(shell git rev-parse --abbrev-ref HEAD)
|
||||||
|
|
||||||
CFLAGS = -std=c17 -Wno-int-conversion -DGIT_COMMIT='"$(GIT_COMMIT)"' -DGIT_BRANCH='"$(GIT_BRANCH)"'
|
CWARNFLAGS = -Wno-int-conversion -Wno-incompatible-pointer-types
|
||||||
|
|
||||||
|
CFLAGS = -std=c17 -DGIT_COMMIT='"$(GIT_COMMIT)"' -DGIT_BRANCH='"$(GIT_BRANCH)"'
|
||||||
LFLAGS = -lgdi32 -lws2_32
|
LFLAGS = -lgdi32 -lws2_32
|
||||||
|
|
||||||
# DBGFLAGS = -Wl,--export-all-symbols -g -O0 -ggdb3 -Wall
|
# DBGFLAGS = -Wl,--export-all-symbols -g -O0 -ggdb3 -Wall
|
||||||
@ -18,7 +20,7 @@ build: $(C_OBJECTS)
|
|||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(info Compiling $<)
|
$(info Compiling $<)
|
||||||
x86_64-w64-mingw32-gcc $(CFLAGS) $(DBGFLAGS) -c $< -o $@
|
x86_64-w64-mingw32-gcc $(CFLAGS) $(CWARNFLAGS) $(DBGFLAGS) -c $< -o $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(C_OBJECTS) build/bridge.exe bridge.res
|
rm -f $(C_OBJECTS) build/bridge.exe bridge.res
|
||||||
|
49
bridge.c
49
bridge.c
@ -20,11 +20,13 @@
|
|||||||
#define __darwin_close 0x2000006
|
#define __darwin_close 0x2000006
|
||||||
#define __darwin_socket 0x2000061
|
#define __darwin_socket 0x2000061
|
||||||
#define __darwin_connect 0x2000062
|
#define __darwin_connect 0x2000062
|
||||||
|
#define __darwin_mmap 0x20000C5
|
||||||
#define __darwin_fcntl 0x200005C
|
#define __darwin_fcntl 0x200005C
|
||||||
#define __darwin_sysctl 0x20000CA
|
#define __darwin_sysctl 0x20000CA
|
||||||
|
|
||||||
#define O_RDONLY 00
|
#define O_RDONLY 00
|
||||||
|
|
||||||
|
/* macos & linux are the same for PROT_READ, PROT_WRITE, MAP_FIXED & MAP_PRIVATE */
|
||||||
#define PROT_READ 1
|
#define PROT_READ 1
|
||||||
#define PROT_WRITE 2
|
#define PROT_WRITE 2
|
||||||
#define MAP_PRIVATE 0x02
|
#define MAP_PRIVATE 0x02
|
||||||
@ -32,6 +34,8 @@
|
|||||||
#define MAP_ANON 0x20
|
#define MAP_ANON 0x20
|
||||||
#define MAP_FAILED ((void *)-1)
|
#define MAP_FAILED ((void *)-1)
|
||||||
|
|
||||||
|
#define __darwin_MAP_ANON 0x1000
|
||||||
|
|
||||||
#define SYS_SOCKET 1
|
#define SYS_SOCKET 1
|
||||||
#define SYS_CONNECT 3
|
#define SYS_CONNECT 3
|
||||||
|
|
||||||
@ -134,8 +138,17 @@ static inline int sys_close(int fd)
|
|||||||
|
|
||||||
static inline unsigned int *sys_mmap(unsigned int *addr, size_t length, int prot, int flags, int fd, off_t offset)
|
static inline unsigned int *sys_mmap(unsigned int *addr, size_t length, int prot, int flags, int fd, off_t offset)
|
||||||
{
|
{
|
||||||
assert(IsLinux);
|
if (IsLinux)
|
||||||
return linux_syscall(__linux_mmap2, addr, length, prot, flags, fd, offset);
|
return linux_syscall(__linux_mmap2, addr, length, prot, flags, fd, offset);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (flags & MAP_ANON)
|
||||||
|
{
|
||||||
|
flags &= ~MAP_ANON;
|
||||||
|
flags |= __darwin_MAP_ANON;
|
||||||
|
}
|
||||||
|
return darwin_syscall(__darwin_mmap, addr, length, prot, flags, fd, offset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int sys_munmap(unsigned int *addr, size_t length)
|
static inline int sys_munmap(unsigned int *addr, size_t length)
|
||||||
@ -285,9 +298,6 @@ void ConnectToSocket(int fd)
|
|||||||
"%s/snap.discord-canary/discord-ipc-%d",
|
"%s/snap.discord-canary/discord-ipc-%d",
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sockaddr_un *socketAddr = sys_mmap(0x23000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
|
|
||||||
socketAddr->sun_family = AF_UNIX;
|
|
||||||
|
|
||||||
int sockRet = 0;
|
int sockRet = 0;
|
||||||
for (int i = 0; i < sizeof(discordUnixSockets) / sizeof(discordUnixSockets[0]); i++)
|
for (int i = 0; i < sizeof(discordUnixSockets) / sizeof(discordUnixSockets[0]); i++)
|
||||||
{
|
{
|
||||||
@ -296,12 +306,16 @@ void ConnectToSocket(int fd)
|
|||||||
|
|
||||||
for (int j = 0; j < 16; j++)
|
for (int j = 0; j < 16; j++)
|
||||||
{
|
{
|
||||||
|
if (IsLinux)
|
||||||
|
{
|
||||||
|
struct sockaddr_un *socketAddr = sys_mmap(0x23000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
|
||||||
|
print("Socket address allocated at %#lx\n", socketAddr);
|
||||||
|
socketAddr->sun_family = AF_UNIX;
|
||||||
|
|
||||||
snprintf(pipePath, pipePathLen, discordUnixSockets[i], runtime, j);
|
snprintf(pipePath, pipePathLen, discordUnixSockets[i], runtime, j);
|
||||||
strcpy_s(socketAddr->sun_path, sizeof(socketAddr->sun_path), pipePath);
|
strcpy_s(socketAddr->sun_path, sizeof(socketAddr->sun_path), pipePath);
|
||||||
print("Probing %s\n", pipePath);
|
print("Probing %s\n", pipePath);
|
||||||
|
|
||||||
if (IsLinux)
|
|
||||||
{
|
|
||||||
// unsigned long socketArgs[] = {
|
// unsigned long socketArgs[] = {
|
||||||
// (unsigned long)fd,
|
// (unsigned long)fd,
|
||||||
// (unsigned long)(intptr_t)&socketAddr,
|
// (unsigned long)(intptr_t)&socketAddr,
|
||||||
@ -315,7 +329,16 @@ void ConnectToSocket(int fd)
|
|||||||
sockRet = sys_socketcall(SYS_CONNECT, socketArgs);
|
sockRet = sys_socketcall(SYS_CONNECT, socketArgs);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
struct sockaddr_un socketAddr;
|
||||||
|
socketAddr.sun_family = AF_UNIX;
|
||||||
|
|
||||||
|
snprintf(pipePath, pipePathLen, discordUnixSockets[i], runtime, j);
|
||||||
|
strcpy_s(socketAddr.sun_path, sizeof(socketAddr.sun_path), pipePath);
|
||||||
|
print("Probing %s\n", pipePath);
|
||||||
|
|
||||||
sockRet = sys_connect(fd, (caddr_t)&socketAddr, sizeof(socketAddr));
|
sockRet = sys_connect(fd, (caddr_t)&socketAddr, sizeof(socketAddr));
|
||||||
|
}
|
||||||
|
|
||||||
print(" error: %d\n", sockRet);
|
print(" error: %d\n", sockRet);
|
||||||
if (sockRet >= 0)
|
if (sockRet >= 0)
|
||||||
@ -347,7 +370,12 @@ void PipeBufferInThread(LPVOID lpParam)
|
|||||||
bridge_thread *bt = (bridge_thread *)lpParam;
|
bridge_thread *bt = (bridge_thread *)lpParam;
|
||||||
print("In thread started using fd %d and pipe %#x\n", bt->fd, bt->hPipe);
|
print("In thread started using fd %d and pipe %#x\n", bt->fd, bt->hPipe);
|
||||||
int EOFCount = 0;
|
int EOFCount = 0;
|
||||||
char *l_buffer = sys_mmap(0x25000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
|
char *l_buffer;
|
||||||
|
if (IsLinux)
|
||||||
|
l_buffer = sys_mmap(0x25000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
|
||||||
|
else
|
||||||
|
l_buffer = malloc(BUFFER_LENGTH);
|
||||||
|
print("Buffer in thread allocated at %#lx\n", l_buffer);
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
{
|
{
|
||||||
char buffer[BUFFER_LENGTH];
|
char buffer[BUFFER_LENGTH];
|
||||||
@ -439,7 +467,12 @@ void PipeBufferOutThread(LPVOID lpParam)
|
|||||||
{
|
{
|
||||||
bridge_thread *bt = (bridge_thread *)lpParam;
|
bridge_thread *bt = (bridge_thread *)lpParam;
|
||||||
print("Out thread started using fd %d and pipe %#x\n", bt->fd, bt->hPipe);
|
print("Out thread started using fd %d and pipe %#x\n", bt->fd, bt->hPipe);
|
||||||
char *l_buffer = sys_mmap(0x25000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
|
char *l_buffer;
|
||||||
|
if (IsLinux)
|
||||||
|
l_buffer = sys_mmap(0x26000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
|
||||||
|
else
|
||||||
|
l_buffer = malloc(BUFFER_LENGTH);
|
||||||
|
print("Buffer out thread allocated at %#lx\n", l_buffer);
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
{
|
{
|
||||||
char buffer[BUFFER_LENGTH];
|
char buffer[BUFFER_LENGTH];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user