Cybersecurity-Projects/PROJECTS/intermediate/binary-analysis-tool/test-specimens/many_imports.c

138 lines
3.1 KiB
C

// ©AngelaMos | 2026
// many_imports.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <dlfcn.h>
#include <pthread.h>
#include <errno.h>
#include <dirent.h>
#include <time.h>
static volatile int running = 1;
static void handle_signal(int sig) {
(void)sig;
running = 0;
}
static void *worker_thread(void *arg) {
int id = *(int *)arg;
struct timespec ts = {0, 100000000};
while (running) {
double val = sin((double)id * 0.1) * cos((double)id * 0.2);
printf("Worker %d: computed %.6f\n", id, val);
nanosleep(&ts, NULL);
}
return NULL;
}
static void scan_directory(const char *path) {
DIR *dir = opendir(path);
if (!dir) return;
struct dirent *ent;
struct stat st;
char fullpath[4096];
while ((ent = readdir(dir)) != NULL) {
if (ent->d_name[0] == '.') continue;
snprintf(fullpath, sizeof(fullpath), "%s/%s", path, ent->d_name);
if (stat(fullpath, &st) == 0) {
printf(" %c %8ld %s\n",
S_ISDIR(st.st_mode) ? 'd' : '-',
(long)st.st_size,
ent->d_name);
}
}
closedir(dir);
}
static void mmap_self(void) {
int fd = open("/proc/self/exe", O_RDONLY);
if (fd < 0) return;
struct stat st;
fstat(fd, &st);
void *map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (map != MAP_FAILED) {
unsigned char *bytes = (unsigned char *)map;
printf("Self ELF magic: %02x %02x %02x %02x\n",
bytes[0], bytes[1], bytes[2], bytes[3]);
munmap(map, st.st_size);
}
close(fd);
}
static void try_dlopen(void) {
void *handle = dlopen("libm.so.6", RTLD_LAZY);
if (handle) {
typedef double (*pow_fn)(double, double);
pow_fn p = (pow_fn)dlsym(handle, "pow");
if (p) {
printf("dlsym(pow): 2^10 = %.0f\n", p(2.0, 10.0));
}
dlclose(handle);
}
}
static void network_check(void) {
int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) return;
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
struct timeval tv = {1, 0};
setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
connect(fd, (struct sockaddr *)&addr, sizeof(addr));
close(fd);
}
int main(void) {
signal(SIGINT, handle_signal);
signal(SIGTERM, handle_signal);
printf("=== System Probe ===\n");
mmap_self();
try_dlopen();
scan_directory("/tmp");
network_check();
int ids[] = {1, 2, 3};
pthread_t threads[3];
for (int i = 0; i < 3; i++) {
pthread_create(&threads[i], NULL, worker_thread, &ids[i]);
}
sleep(1);
running = 0;
for (int i = 0; i < 3; i++) {
pthread_join(threads[i], NULL);
}
printf("Done.\n");
return 0;
}