mirror of
https://github.com/EnderIce2/rpc-bridge.git
synced 2025-05-25 22:14:38 +00:00
This commit is contained in:
parent
0d4f46e536
commit
77a2a748ad
55
bridge.c
55
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++)
|
||||||
{
|
{
|
||||||
snprintf(pipePath, pipePathLen, discordUnixSockets[i], runtime, j);
|
|
||||||
strcpy_s(socketAddr->sun_path, sizeof(socketAddr->sun_path), pipePath);
|
|
||||||
print("Probing %s\n", pipePath);
|
|
||||||
|
|
||||||
if (IsLinux)
|
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);
|
||||||
|
strcpy_s(socketAddr->sun_path, sizeof(socketAddr->sun_path), pipePath);
|
||||||
|
print("Probing %s\n", pipePath);
|
||||||
|
|
||||||
// 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