Skip to content

Commit 7173432

Browse files
committed
feat: Build ioctl via musl toolchain
1 parent b65d7b6 commit 7173432

File tree

3 files changed

+100
-5
lines changed

3 files changed

+100
-5
lines changed

scripts/build-ioctl-hook.sh

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#!/bin/bash
2+
mkdir build-ioctl
3+
cd build-ioctl
4+
5+
echo "Building ioctl hook with musl cross platform toolchain"
6+
7+
MUSL_AARCH64="aarch64-linux-musl"
8+
MUSL_ARMV7="arm-linux-musleabihf"
9+
MUSL_I686="i686-linux-musl"
10+
MUSL_X86_64="x86_64-linux-musl"
11+
12+
cross_compile() {
13+
curl -O "https://musl.cc/$1-cross.tgz"
14+
tar xzf "$1-cross.tgz"
15+
GCC_PATH=./$1-cross/bin/$1-gcc
16+
$GCC_PATH -fPIC -c -o ioctlHook.o ioctlHook.c
17+
$GCC_PATH -shared -o ioctlHook-$1.so ioctlHook.o -ldl
18+
}
19+
20+
cp ../ioctlHook.c ioctlHook.c
21+
22+
cross_compile $MUSL_AARCH64
23+
cross_compile $MUSL_I686
24+
cross_compile $MUSL_ARMV7
25+
cross_compile $MUSL_X86_64

scripts/generate-bootstraps.sh

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ cd ../minitar
1111
./build.sh
1212

1313
cd $SCRIPTS_PATH
14-
mkdir -p build
14+
mkdir -p build
1515
cd build
1616
rm -rf *
17+
cp ../ioctlHook.c .
18+
../build-ioctl-hook.sh
19+
1720
cp -r ../../external/proot/build/* .
1821

1922
build_bootstrap () {
@@ -23,18 +26,22 @@ build_bootstrap () {
2326
arm64)
2427
PROOT_ARCH="aarch64"
2528
ANDROID_ARCH="arm64-v8a"
29+
MUSL_ARCH="aarch64-linux-musl"
2630
;;
2731
armhf)
2832
PROOT_ARCH="armv7a"
2933
ANDROID_ARCH="armeabi-v7a"
34+
MUSL_ARCH="arm-linux-musleabihf"
3035
;;
3136
amd64)
3237
PROOT_ARCH="x86_64"
33-
ANDROID_ARCH="x86"
38+
ANDROID_ARCH="x86_64"
39+
MUSL_ARCH="x86_64-linux-musl"
3440
;;
3541
i386)
3642
PROOT_ARCH="i686"
37-
ANDROID_ARCH="x86_64"
43+
ANDROID_ARCH="x86"
44+
MUSL_ARCH="i686-linux-musl"
3845
;;
3946
*)
4047
echo "Invalid arch"
@@ -49,11 +56,12 @@ build_bootstrap () {
4956
cp root/bin/minitar root-pre5/bin/minitar
5057
fi
5158

52-
curl -o rootfs.tar.xz -L "https://us.images.linuxcontainers.org/images/alpine/3.13/$1/default/20210330_13:00/rootfs.tar.xz"
59+
curl -o rootfs.tar.xz -L "https://dl-cdn.alpinelinux.org/alpine/v3.13/releases/$1/alpine-minirootfs-3.13.5-$1.tar.gz"
5360
cp ../../run-bootstrap.sh .
5461
cp ../../install-bootstrap.sh .
5562
cp ../../add-user.sh .
56-
zip -r bootstrap-$PROOT_ARCH.zip root root-pre5 rootfs.tar.xz run-bootstrap.sh install-bootstrap.sh add-user.sh
63+
cp ../build-ioctl/ioctlHook-${MUSL_ARCH}.so ioctlHook.so
64+
zip -r bootstrap-$PROOT_ARCH.zip root ioctlHook.so root-pre5 rootfs.tar.xz run-bootstrap.sh install-bootstrap.sh add-user.sh
5765
mv bootstrap-$PROOT_ARCH.zip ../
5866
echo "Packed bootstrap $1"
5967
cd ..

scripts/ioctlHook.c

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include <stdarg.h>
2+
#include <stdlib.h>
3+
#include <string.h>
4+
#include <fcntl.h>
5+
#include <stdio.h>
6+
#include <dlfcn.h>
7+
#include <termios.h>
8+
#include <sys/types.h>
9+
#include <sys/stat.h>
10+
#include <stdlib.h>
11+
#include <signal.h>
12+
13+
int g_obvio=0;
14+
#define DPRINTF(format, args...) if (!g_obvio) { g_obvio=1; fprintf(stderr, format, ## args); g_obvio=0; }
15+
16+
#ifndef RTLD_NEXT
17+
#define RTLD_NEXT ((void *)-1l)
18+
#endif
19+
20+
#define REAL_LIBC RTLD_NEXT
21+
#define request_t int
22+
#define TIOCMBIS 0x5416
23+
24+
static char fifoPath[] = "/dev/eventPipe";
25+
static char eventJsonStart[] = "{\"eventType\": \"";
26+
static char eventJsonEnd[] = "\"}\n";
27+
28+
29+
int writeEventToPipe(char* event, int len) {
30+
int eventFifoFd = open(fifoPath, O_WRONLY);
31+
write(eventFifoFd, eventJsonStart, sizeof(eventJsonStart)-1);
32+
write(eventFifoFd, event, len);
33+
write(eventFifoFd, eventJsonEnd, sizeof(eventJsonEnd)-1);
34+
close(eventFifoFd);
35+
}
36+
37+
int ioctl(int fd, int request, ...)
38+
{
39+
static int (*funcIoctl)(int, request_t, void *) = NULL;
40+
va_list args;
41+
void *argp;
42+
43+
if (!funcIoctl)
44+
funcIoctl = (int (*)(int, request_t, void *))dlsym(REAL_LIBC, "ioctl");
45+
va_start(args, request);
46+
argp = va_arg(args, void *);
47+
va_end(args);
48+
49+
if (request == TIOCMBIS)
50+
{
51+
writeEventToPipe("rtsDts", 6);
52+
return 0;
53+
}
54+
55+
if (request == 0x802c542a || request == 0x402C542B)
56+
{
57+
writeEventToPipe("customBaud", 10);
58+
return 0;
59+
}
60+
//DPRINTF ("HOOK: ioctl (fd=%d, request=%p, argp=%p [%02X])\n", fd, request, argp);
61+
return funcIoctl(fd, request, argp);
62+
}

0 commit comments

Comments
 (0)