ruby-lorcon 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (6) hide show
  1. checksums.yaml +7 -0
  2. data/Lorcon2.c +655 -0
  3. data/Lorcon2.h +31 -0
  4. data/README +41 -0
  5. data/extconf.rb +16 -0
  6. metadata +52 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f3f8c3a4d5a177cff318f1499a9ee6e7593448cb
4
+ data.tar.gz: ed69f9133024bf1a40ce2e4eef0aa9cf53694a15
5
+ SHA512:
6
+ metadata.gz: 0ea7023ed642d65809fc297cbed55d34d97e1e1cf2d79bf7ee14d93a6a4fdcf502596ae625e13c0665a886e3e3a73622c13755f8494887891bf890fa02009186
7
+ data.tar.gz: 58372d941bb628b9f76ffcb4cdcf99b21008227d07b4452e651ece90680368cb286eb29ef4897ce1f6bc90cf980d712b17d36b181e56c75461330eac7a58581a
@@ -0,0 +1,655 @@
1
+ #include "Lorcon2.h"
2
+ #include "ruby.h"
3
+
4
+ #ifndef RUBY_19
5
+ #include "rubysig.h"
6
+ #endif
7
+
8
+ /*
9
+ self.license = GPLv2;
10
+ */
11
+
12
+ /*
13
+ This is a derivative of the tx.c sample included with lorcon:
14
+ http://802.11ninja.net/lorcon/
15
+
16
+ lorcon is free software; you can redistribute it and/or modify
17
+ it under the terms of the GNU General Public License as published by
18
+ the Free Software Foundation; either version 2 of the License, or
19
+ (at your option) any later version.
20
+
21
+ lorcon is distributed in the hope that it will be useful,
22
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
23
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24
+ GNU General Public License for more details.
25
+
26
+ You should have received a copy of the GNU General Public License
27
+ along with lorcon; if not, write to the Free Software
28
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29
+
30
+ Copyright (c) 2005 dragorn and Joshua Wright
31
+
32
+ */
33
+
34
+ /*
35
+ Lots of code borrowed from Tom Wambold's pylorcon:
36
+ http://pylorcon.googlecode.com/ - tom5760[at]gmail.com
37
+ */
38
+
39
+ /*
40
+ All ruby-lorcon/rubyisms are by Metasploit LLC (C) 2006-2007
41
+ http://metasploit.com/ - msfdev[at]metasploit.com
42
+ */
43
+
44
+ VALUE mLorcon;
45
+ VALUE cDevice;
46
+ VALUE cPacket;
47
+
48
+ VALUE Lorcon_get_version(VALUE self) {
49
+ return INT2NUM(lorcon_get_version());
50
+ }
51
+
52
+ static VALUE Lorcon_list_drivers(VALUE self) {
53
+ VALUE list;
54
+ VALUE hash;
55
+
56
+ lorcon_driver_t *drvlist, *dri;
57
+
58
+ list = rb_hash_new();
59
+
60
+ dri = drvlist = lorcon_list_drivers();
61
+
62
+ if (dri == NULL)
63
+ return Qnil;
64
+
65
+ while (dri) {
66
+ hash = rb_hash_new();
67
+ rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(dri->name));
68
+ rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(dri->details));
69
+ rb_hash_aset(list, rb_str_new2(dri->name),hash);
70
+ dri = dri->next;
71
+ }
72
+
73
+ lorcon_free_driver_list(drvlist);
74
+
75
+ return(list);
76
+ }
77
+
78
+ static VALUE Lorcon_find_driver(VALUE self, VALUE driver) {
79
+ VALUE hash;
80
+ lorcon_driver_t *dri;
81
+ char *drivert = RSTRING_PTR(driver);
82
+
83
+ dri = lorcon_find_driver(drivert);
84
+
85
+ if (dri == NULL)
86
+ return Qnil;
87
+
88
+ hash = rb_hash_new();
89
+
90
+ rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(dri->name));
91
+ rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(dri->details));
92
+
93
+ lorcon_free_driver_list(dri);
94
+
95
+ return(hash);
96
+ }
97
+
98
+ static VALUE Lorcon_auto_driver(VALUE self, VALUE interface) {
99
+ VALUE hash;
100
+ lorcon_driver_t *dri;
101
+ char *intf = RSTRING_PTR(interface);
102
+
103
+ dri = lorcon_auto_driver(intf);
104
+
105
+ if (dri == NULL)
106
+ return Qnil;
107
+
108
+ hash = rb_hash_new();
109
+ rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(dri->name));
110
+ rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(dri->details));
111
+
112
+ lorcon_free_driver_list(dri);
113
+
114
+ return hash;
115
+ }
116
+
117
+ void Lorcon_free(struct rldev *rld) {
118
+ if (rld->context != NULL)
119
+ lorcon_free(rld->context);
120
+ }
121
+
122
+ static VALUE Lorcon_create(int argc, VALUE *argv, VALUE self) {
123
+ struct rldev *rld;
124
+ char *intf = NULL, *driver = NULL;
125
+ VALUE rbdriver, rbintf, obj;
126
+ lorcon_driver_t *dri;
127
+
128
+ if (argc == 2) {
129
+ rb_scan_args(argc, argv, "2", &rbintf, &rbdriver);
130
+ intf = StringValuePtr(rbintf);
131
+ driver = StringValuePtr(rbdriver);
132
+ } else {
133
+ rb_scan_args(argc, argv, "1", &rbintf);
134
+ intf = StringValuePtr(rbintf);
135
+ }
136
+
137
+ if (driver == NULL) {
138
+ if ((dri = lorcon_auto_driver(intf)) == NULL) {
139
+ rb_raise(rb_eRuntimeError,
140
+ "LORCON could not detect a driver and none specified");
141
+ return (Qnil);
142
+ }
143
+ } else {
144
+ if ((dri = lorcon_find_driver(driver)) == NULL) {
145
+ rb_raise(rb_eArgError,
146
+ "LORCON could not recognize the specified driver");
147
+ return (Qnil);
148
+ }
149
+ }
150
+
151
+ obj = Data_Make_Struct(cDevice, struct rldev, 0, Lorcon_free, rld);
152
+
153
+ rld->context = lorcon_create(intf, dri);
154
+
155
+ // Obsolete: XXX
156
+ // lorcon_set_timeout(rld->context, 100);
157
+
158
+ if (rld->context == NULL) {
159
+ rb_raise(rb_eRuntimeError,
160
+ "LORCON could not create context");
161
+ return (Qnil);
162
+ }
163
+
164
+ lorcon_free_driver_list(dri);
165
+
166
+ rb_obj_call_init(obj, 0, 0);
167
+ return(obj);
168
+ }
169
+
170
+
171
+ static VALUE Lorcon_open_inject(VALUE self) {
172
+ struct rldev *rld;
173
+
174
+ Data_Get_Struct(self, struct rldev, rld);
175
+
176
+ if (lorcon_open_inject(rld->context) < 0)
177
+ return Qfalse;
178
+
179
+ return Qtrue;
180
+ }
181
+
182
+ static VALUE Lorcon_open_monitor(VALUE self) {
183
+ struct rldev *rld;
184
+
185
+ Data_Get_Struct(self, struct rldev, rld);
186
+
187
+ if (lorcon_open_monitor(rld->context) < 0)
188
+ return Qfalse;
189
+
190
+ return Qtrue;
191
+ }
192
+
193
+ static VALUE Lorcon_open_injmon(VALUE self) {
194
+ struct rldev *rld;
195
+
196
+ Data_Get_Struct(self, struct rldev, rld);
197
+
198
+ if (lorcon_open_injmon(rld->context) < 0)
199
+ return Qfalse;
200
+
201
+ return Qtrue;
202
+ }
203
+
204
+ static VALUE Lorcon_get_error(VALUE self) {
205
+ struct rldev *rld;
206
+
207
+ Data_Get_Struct(self, struct rldev, rld);
208
+
209
+ return rb_str_new2(lorcon_get_error(rld->context));
210
+ }
211
+
212
+ static VALUE Lorcon_get_capiface(VALUE self) {
213
+ struct rldev *rld;
214
+ Data_Get_Struct(self, struct rldev, rld);
215
+
216
+ return rb_str_new2(lorcon_get_capiface(rld->context));
217
+ }
218
+
219
+ void Lorcon_packet_free(struct rlpack *rlp) {
220
+ if (rlp->packet != NULL) {
221
+ lorcon_packet_free(rlp->packet);
222
+ rlp->packet = NULL;
223
+ free(rlp);
224
+ }
225
+ }
226
+
227
+ static VALUE Lorcon_packet_create(int argc, VALUE *argv, VALUE self) {
228
+ struct rlpack *rlp;
229
+ VALUE obj;
230
+
231
+ obj = Data_Make_Struct(cPacket, struct rlpack, 0, Lorcon_packet_free, rlp);
232
+
233
+ rlp->packet = (struct lorcon_packet *) malloc(sizeof(struct lorcon_packet));
234
+ memset(rlp->packet, 0, sizeof(struct lorcon_packet));
235
+
236
+ rlp->bssid = NULL;
237
+ rlp->dot3 = NULL;
238
+ rlp->len = 0;
239
+ rlp->dir = 0;
240
+
241
+ rb_obj_call_init(obj, 0, 0);
242
+ return(obj);
243
+ }
244
+
245
+ static VALUE Lorcon_packet_get_channel(VALUE self) {
246
+ struct rlpack *rlp;
247
+ Data_Get_Struct(self, struct rlpack, rlp);
248
+
249
+ return INT2FIX(rlp->packet->channel);
250
+ }
251
+
252
+ static VALUE Lorcon_packet_set_channel(VALUE self, VALUE channel) {
253
+ struct rlpack *rlp;
254
+
255
+ Data_Get_Struct(self, struct rlpack, rlp);
256
+
257
+ lorcon_packet_set_channel(rlp->packet, NUM2INT(channel));
258
+
259
+ return channel;
260
+ }
261
+
262
+ static VALUE Lorcon_packet_get_dlt(VALUE self) {
263
+ struct rlpack *rlp;
264
+ Data_Get_Struct(self, struct rlpack, rlp);
265
+
266
+ return INT2FIX(rlp->packet->dlt);
267
+ }
268
+
269
+ static VALUE Lorcon_packet_get_bssid(VALUE self) {
270
+ struct rlpack *rlp;
271
+ struct lorcon_dot11_extra *extra;
272
+ Data_Get_Struct(self, struct rlpack, rlp);
273
+
274
+ if (rlp->packet->extra_info == NULL ||
275
+ rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211)
276
+ return Qnil;
277
+
278
+ extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info;
279
+
280
+ if (extra->bssid_mac == NULL)
281
+ return Qnil;
282
+
283
+ return rb_str_new((char *)extra->bssid_mac, 6);
284
+ }
285
+
286
+ static VALUE Lorcon_packet_get_source(VALUE self) {
287
+ struct rlpack *rlp;
288
+ struct lorcon_dot11_extra *extra;
289
+ Data_Get_Struct(self, struct rlpack, rlp);
290
+
291
+ if (rlp->packet->extra_info == NULL ||
292
+ rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211)
293
+ return Qnil;
294
+
295
+ extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info;
296
+
297
+ if (extra->source_mac == NULL)
298
+ return Qnil;
299
+
300
+ return rb_str_new((char *)extra->source_mac, 6);
301
+ }
302
+
303
+ static VALUE Lorcon_packet_get_dest(VALUE self) {
304
+ struct rlpack *rlp;
305
+ struct lorcon_dot11_extra *extra;
306
+ Data_Get_Struct(self, struct rlpack, rlp);
307
+
308
+ if (rlp->packet->extra_info == NULL ||
309
+ rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211)
310
+ return Qnil;
311
+
312
+ extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info;
313
+
314
+ if (extra->dest_mac == NULL)
315
+ return Qnil;
316
+
317
+ return rb_str_new((char *)extra->dest_mac, 6);
318
+ }
319
+
320
+ static VALUE Lorcon_packet_get_rawdata(VALUE self) {
321
+ struct rlpack *rlp;
322
+ Data_Get_Struct(self, struct rlpack, rlp);
323
+
324
+ if (rlp->packet->packet_raw == NULL)
325
+ return Qnil;
326
+
327
+ return rb_str_new((char *)rlp->packet->packet_raw, rlp->packet->length);
328
+ }
329
+
330
+ static VALUE Lorcon_packet_get_headerdata(VALUE self) {
331
+ struct rlpack *rlp;
332
+ Data_Get_Struct(self, struct rlpack, rlp);
333
+
334
+ if (rlp->packet->packet_header == NULL)
335
+ return Qnil;
336
+
337
+ return rb_str_new((char *)rlp->packet->packet_header, rlp->packet->length_header);
338
+ }
339
+
340
+ static VALUE Lorcon_packet_get_data(VALUE self) {
341
+ struct rlpack *rlp;
342
+ Data_Get_Struct(self, struct rlpack, rlp);
343
+
344
+ if (rlp->packet->packet_data == NULL)
345
+ return Qnil;
346
+
347
+ return rb_str_new((char *)rlp->packet->packet_data, rlp->packet->length_data);
348
+ }
349
+
350
+
351
+ static VALUE Lorcon_packet_getdot3(VALUE self) {
352
+ struct rlpack *rlp;
353
+ u_char *pdata;
354
+ int len;
355
+ VALUE ret;
356
+
357
+ Data_Get_Struct(self, struct rlpack, rlp);
358
+
359
+ if (rlp->packet->packet_data == NULL)
360
+ return Qnil;
361
+
362
+ len = lorcon_packet_to_dot3(rlp->packet, &pdata);
363
+
364
+ ret = rb_str_new((char *)pdata, len);
365
+
366
+ free(pdata);
367
+
368
+ return ret;
369
+ }
370
+
371
+ static VALUE Lorcon_packet_prepdot3(VALUE self, VALUE dot3) {
372
+ struct rlpack *rlp;
373
+ Data_Get_Struct(self, struct rlpack, rlp);
374
+
375
+ rlp->dot3 = (unsigned char *) RSTRING_PTR(dot3);
376
+ rlp->len = RSTRING_LEN(dot3);
377
+
378
+ return dot3;
379
+ }
380
+
381
+ static VALUE Lorcon_packet_prepbssid(VALUE self, VALUE bssid) {
382
+ struct rlpack *rlp;
383
+ Data_Get_Struct(self, struct rlpack, rlp);
384
+
385
+ rlp->bssid = (unsigned char *)RSTRING_PTR(bssid);
386
+
387
+ return bssid;
388
+ }
389
+
390
+ static VALUE Lorcon_packet_prepdir(VALUE self, VALUE dir) {
391
+ struct rlpack *rlp;
392
+ Data_Get_Struct(self, struct rlpack, rlp);
393
+
394
+ rlp->dir = NUM2INT(dir);
395
+
396
+ return dir;
397
+ }
398
+
399
+ static VALUE Lorcon_packet_getdir(VALUE self) {
400
+ struct rlpack *rlp;
401
+ struct lorcon_dot11_extra *extra;
402
+ Data_Get_Struct(self, struct rlpack, rlp);
403
+
404
+ if (rlp->dir != 0)
405
+ return INT2FIX(rlp->dir);
406
+
407
+ if (rlp->packet == NULL)
408
+ return Qnil;
409
+
410
+ if (rlp->packet->extra_info == NULL ||
411
+ rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211)
412
+ return Qnil;
413
+
414
+ extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info;
415
+
416
+ if (extra->from_ds && !extra->to_ds)
417
+ return INT2FIX(LORCON_DOT11_DIR_FROMDS);
418
+ else if (!extra->from_ds && extra->to_ds)
419
+ return INT2FIX(LORCON_DOT11_DIR_TODS);
420
+ else if (!extra->from_ds && !extra->to_ds)
421
+ return INT2FIX(LORCON_DOT11_DIR_ADHOCDS);
422
+ else if (extra->from_ds && extra->to_ds)
423
+ return INT2FIX(LORCON_DOT11_DIR_INTRADS);
424
+
425
+ return Qnil;
426
+ }
427
+
428
+ static VALUE Lorcon_packet_get_rawlength(VALUE self) {
429
+ struct rlpack *rlp;
430
+ Data_Get_Struct(self, struct rlpack, rlp);
431
+
432
+ return INT2FIX(rlp->packet->length);
433
+ }
434
+
435
+ static VALUE Lorcon_packet_get_headerlength(VALUE self) {
436
+ struct rlpack *rlp;
437
+ Data_Get_Struct(self, struct rlpack, rlp);
438
+
439
+ return INT2FIX(rlp->packet->length_header);
440
+ }
441
+
442
+ static VALUE Lorcon_packet_get_datalength(VALUE self) {
443
+ struct rlpack *rlp;
444
+ Data_Get_Struct(self, struct rlpack, rlp);
445
+
446
+ return INT2FIX(rlp->packet->length_data);
447
+ }
448
+
449
+ VALUE new_lorcon_packet(struct lorcon_packet **packet) {
450
+ struct rlpack *rlp;
451
+ VALUE obj;
452
+
453
+ obj = Data_Make_Struct(cPacket, struct rlpack, 0, Lorcon_packet_free, rlp);
454
+
455
+ rlp->packet = *packet;
456
+ rb_obj_call_init(obj, 0, 0);
457
+ return(obj);
458
+ }
459
+
460
+ static VALUE Lorcon_inject_packet(VALUE self, VALUE packet) {
461
+ struct rldev *rld;
462
+ struct rlpack *rlp;
463
+ lorcon_packet_t *pack = NULL;
464
+ int ret;
465
+
466
+ if (rb_obj_is_kind_of(packet, cPacket) == 0) {
467
+ rb_raise(rb_eTypeError, "wrong type expected %s", rb_class2name(cPacket));
468
+ return Qnil;
469
+ }
470
+
471
+ Data_Get_Struct(self, struct rldev, rld);
472
+ Data_Get_Struct(packet, struct rlpack, rlp);
473
+
474
+ if (rlp->bssid != NULL && rlp->dot3 != NULL) {
475
+ pack = lorcon_packet_from_dot3(rlp->bssid, rlp->dir, rlp->dot3, rlp->len);
476
+ ret = lorcon_inject(rld->context, pack);
477
+ lorcon_packet_free(pack);
478
+ } else {
479
+ ret = lorcon_inject(rld->context, rlp->packet);
480
+ }
481
+
482
+ return INT2FIX(ret);
483
+ }
484
+
485
+ static VALUE Lorcon_write_raw(VALUE self, VALUE rpacket) {
486
+ struct rldev *rld;
487
+ int ret;
488
+
489
+ Data_Get_Struct(self, struct rldev, rld);
490
+
491
+ if(TYPE(rpacket) != T_STRING) {
492
+ rb_raise(rb_eArgError, "packet data must be a string");
493
+ return Qnil;
494
+ }
495
+
496
+ ret = lorcon_send_bytes(rld->context, RSTRING_LEN(rpacket), (unsigned char *)RSTRING_PTR(rpacket));
497
+ return INT2FIX(ret);
498
+ }
499
+
500
+ static VALUE Lorcon_set_filter(VALUE self, VALUE filter) {
501
+ struct rldev *rld;
502
+ Data_Get_Struct(self, struct rldev, rld);
503
+ return INT2FIX(lorcon_set_filter(rld->context, RSTRING_PTR(filter)));
504
+ }
505
+
506
+ static VALUE Lorcon_set_channel(VALUE self, VALUE channel) {
507
+ struct rldev *rld;
508
+ Data_Get_Struct(self, struct rldev, rld);
509
+ return INT2FIX(lorcon_set_channel(rld->context, NUM2INT(channel)));
510
+ }
511
+
512
+ static VALUE Lorcon_get_channel(VALUE self) {
513
+ struct rldev *rld;
514
+ Data_Get_Struct(self, struct rldev, rld);
515
+ return INT2FIX(lorcon_get_channel(rld->context));
516
+ }
517
+
518
+ static void rblorcon_pcap_handler(rblorconjob_t *job, struct pcap_pkthdr *hdr, u_char *pkt){
519
+ job->pkt = (unsigned char *)pkt;
520
+ job->hdr = *hdr;
521
+ }
522
+
523
+ static VALUE Lorcon_capture_next(VALUE self) {
524
+ struct rldev *rld;
525
+ int ret = 0;
526
+ struct lorcon_packet *packet;
527
+ unsigned char *raw;
528
+ pcap_t *pd;
529
+ rblorconjob_t job;
530
+ Data_Get_Struct(self, struct rldev, rld);
531
+
532
+ pd = lorcon_get_pcap(rld->context);
533
+
534
+ #ifdef RUBY_18
535
+ TRAP_BEG;
536
+ #endif
537
+ ret = pcap_dispatch(pd, 1, (pcap_handler) rblorcon_pcap_handler, (u_char *)&job);
538
+ #ifdef RUBY_18
539
+ TRAP_END;
540
+ #endif
541
+
542
+ if (ret == 0)
543
+ return(Qnil);
544
+
545
+ if (ret < 0 || job.hdr.caplen <= 0)
546
+ return INT2FIX(ret);
547
+
548
+ raw = malloc(job.hdr.caplen);
549
+ if(! raw) return Qnil;
550
+
551
+ memcpy(raw, job.pkt, job.hdr.caplen);
552
+ packet = lorcon_packet_from_pcap(rld->context, &job.hdr, raw);
553
+ lorcon_packet_set_freedata(packet, 1);
554
+
555
+ return new_lorcon_packet(&packet);
556
+ }
557
+
558
+
559
+ static VALUE Lorcon_capture_loop(int argc, VALUE *argv, VALUE self) {
560
+ struct rldev *rld;
561
+ int count = 0;
562
+ int p = 0;
563
+ VALUE v_cnt;
564
+ VALUE ret;
565
+ int fd;
566
+
567
+ Data_Get_Struct(self, struct rldev, rld);
568
+
569
+ if (rb_scan_args(argc, argv, "01", &v_cnt) >= 1) {
570
+ count = FIX2INT(v_cnt);
571
+ } else {
572
+ count = -1;
573
+ }
574
+
575
+ fd = lorcon_get_selectable_fd(rld->context);
576
+ if(fd < 0 ) {
577
+ rb_raise(rb_eRuntimeError,
578
+ "LORCON context could not provide a pollable descriptor "
579
+ "and we need one for the threaded dispatch loop");
580
+ }
581
+
582
+ while (p < count || count <= 0) {
583
+ ret = Lorcon_capture_next(self);
584
+ if(TYPE(ret) == T_FIXNUM) return(ret);
585
+ if(ret == Qnil) {
586
+ rb_thread_wait_fd(fd);
587
+ } else {
588
+ rb_yield(ret);
589
+ p++;
590
+ }
591
+ }
592
+
593
+ return INT2FIX(p);
594
+ }
595
+
596
+
597
+ void Init_Lorcon2() {
598
+ mLorcon = rb_define_module("Lorcon");
599
+
600
+ cPacket = rb_define_class_under(mLorcon, "Packet", rb_cObject);
601
+
602
+ rb_define_const(cPacket, "LORCON_FROM_DS", INT2NUM(LORCON_DOT11_DIR_FROMDS));
603
+ rb_define_const(cPacket, "LORCON_TO_DS", INT2NUM(LORCON_DOT11_DIR_TODS));
604
+ rb_define_const(cPacket, "LORCON_INTRA_DS", INT2NUM(LORCON_DOT11_DIR_INTRADS));
605
+ rb_define_const(cPacket, "LORCON_ADHOC_DS", INT2NUM(LORCON_DOT11_DIR_ADHOCDS));
606
+
607
+ rb_define_singleton_method(cPacket, "new", Lorcon_packet_create, -1);
608
+ rb_define_method(cPacket, "bssid", Lorcon_packet_get_bssid, 0);
609
+ rb_define_method(cPacket, "source", Lorcon_packet_get_source, 0);
610
+ rb_define_method(cPacket, "dest", Lorcon_packet_get_dest, 0);
611
+
612
+ rb_define_method(cPacket, "channel", Lorcon_packet_get_channel, 0);
613
+ rb_define_method(cPacket, "channel=", Lorcon_packet_set_channel, 1);
614
+ rb_define_method(cPacket, "dlt", Lorcon_packet_get_dlt, 0);
615
+
616
+ rb_define_method(cPacket, "rawdata", Lorcon_packet_get_rawdata, 0);
617
+ rb_define_method(cPacket, "headerdata", Lorcon_packet_get_headerdata, 0);
618
+ rb_define_method(cPacket, "data", Lorcon_packet_get_data, 0);
619
+
620
+ rb_define_method(cPacket, "dot3", Lorcon_packet_getdot3, 0);
621
+
622
+ rb_define_method(cPacket, "dot3=", Lorcon_packet_prepdot3, 1);
623
+ rb_define_method(cPacket, "bssid=", Lorcon_packet_prepbssid, 1);
624
+ rb_define_method(cPacket, "direction=", Lorcon_packet_prepdir, 1);
625
+ rb_define_method(cPacket, "direction", Lorcon_packet_getdir, 0);
626
+
627
+ rb_define_method(cPacket, "size", Lorcon_packet_get_rawlength, 0);
628
+ rb_define_method(cPacket, "linesize", Lorcon_packet_get_rawlength, 0);
629
+ rb_define_method(cPacket, "headersize", Lorcon_packet_get_headerlength, 0);
630
+ rb_define_method(cPacket, "datasize", Lorcon_packet_get_datalength, 0);
631
+
632
+ cDevice = rb_define_class_under(mLorcon, "Device", rb_cObject);
633
+ rb_define_singleton_method(cDevice, "new", Lorcon_create, -1);
634
+ rb_define_method(cDevice, "openinject", Lorcon_open_inject, 0);
635
+ rb_define_method(cDevice, "openmonitor", Lorcon_open_monitor, 0);
636
+ rb_define_method(cDevice, "openinjmon", Lorcon_open_injmon, 0);
637
+ rb_define_method(cDevice, "error", Lorcon_get_error, 0);
638
+ rb_define_method(cDevice, "capiface", Lorcon_get_capiface, 0);
639
+
640
+ rb_define_method(cDevice, "filter=", Lorcon_set_filter, 1);
641
+ rb_define_method(cDevice, "channel=", Lorcon_set_channel, 1);
642
+ rb_define_method(cDevice, "channel", Lorcon_get_channel, 0);
643
+
644
+ rb_define_method(cDevice, "loop", Lorcon_capture_loop, -1);
645
+ rb_define_method(cDevice, "each", Lorcon_capture_loop, -1);
646
+ rb_define_method(cDevice, "each_packet", Lorcon_capture_loop, -1);
647
+ rb_define_method(cDevice, "write", Lorcon_write_raw, 1);
648
+ rb_define_method(cDevice, "inject", Lorcon_inject_packet, 1);
649
+ rb_define_module_function(mLorcon, "drivers", Lorcon_list_drivers, 0);
650
+ rb_define_module_function(mLorcon, "version", Lorcon_get_version, 0);
651
+ rb_define_module_function(mLorcon, "find_driver", Lorcon_find_driver, 1);
652
+ rb_define_module_function(mLorcon, "auto_driver", Lorcon_auto_driver, 1);
653
+ }
654
+
655
+
@@ -0,0 +1,31 @@
1
+ #ifndef _MSFLORCON_H
2
+ #define _MSFLORCON_H
3
+
4
+ #include <stdlib.h>
5
+ #include <errno.h>
6
+ #include <string.h>
7
+ #include <stdio.h>
8
+ #include <sys/socket.h>
9
+
10
+ #include <lorcon2/lorcon.h>
11
+ #include <pcap.h>
12
+
13
+ struct rldev {
14
+ struct lorcon *context;
15
+ };
16
+
17
+ struct rlpack {
18
+ struct lorcon_packet *packet;
19
+
20
+ /* dot3 construction via multiple elements */
21
+ u_char *bssid, *dot3;
22
+ int dir, len;
23
+ };
24
+
25
+
26
+ typedef struct rblorconjob {
27
+ struct pcap_pkthdr hdr;
28
+ unsigned char *pkt;
29
+ } rblorconjob_t;
30
+
31
+ #endif
data/README ADDED
@@ -0,0 +1,41 @@
1
+ This is an experimental interface for lorcon, a 802.11 library
2
+ developed by Joshua Wright and dragorn. This interface is only
3
+ available on Linux and with lorcon-supported wireless drivers.
4
+
5
+ For more information, please see the lorcon documentation and code:
6
+ https://github.com/kismetwireless/lorcon/
7
+
8
+ To build this extension:
9
+
10
+ 1) Download, compile, and install lorcon
11
+ The latest version of lorcon can pulled from SVN:
12
+ $ git clone https://github.com/kismetwireless/lorcon.git lorcon
13
+ $ cd lorcon
14
+ $ ./configure
15
+ $ make
16
+ $ sudo make install
17
+ -- or --
18
+ $ su
19
+ # make install
20
+ # exit
21
+ $ cd ..
22
+
23
+ 2) build the ruby extension..
24
+ $ ruby extconf.rb
25
+ $ make
26
+ $ sudo make install
27
+ -- or --
28
+ $ su
29
+ # make install
30
+
31
+
32
+ NOTES:
33
+
34
+ if Ubuntu 8.04 (and probably others) bitches about 'mkmf',
35
+ you need ruby dev package.
36
+
37
+ :~/metasploit/external/ruby-lorcon$ ruby extconf.rb
38
+ extconf.rb:2:in `require': no such file to load -- mkmf (LoadError)
39
+ from extconf.rb:2
40
+
41
+ :~/metasploit/external/ruby-lorcon$ sudo apt-get install ruby1.8-dev
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ require 'mkmf'
3
+
4
+
5
+ $CFLAGS += " -I/usr/include/lorcon2"
6
+
7
+ if ( RUBY_VERSION =~ /^(1\.9|2\.0)/ )
8
+ $CFLAGS += " -DRUBY_19"
9
+ end
10
+
11
+ if find_library("orcon2", "lorcon_list_drivers", "lorcon2/lorcon.h") and find_library("pcap","pcap_dispatch","pcap/phap.h")
12
+ create_makefile("Lorcon2")
13
+ else
14
+ puts "Error: the lorcon2 library was not found, please see the README"
15
+ end
16
+
metadata ADDED
@@ -0,0 +1,52 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-lorcon
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - dragorn
8
+ - Joshua Wright
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2017-12-13 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: This interface is only available on Linux and with lorcon-supported wireless
15
+ drivers.
16
+ email:
17
+ - msfdev@metasploit.com
18
+ executables: []
19
+ extensions:
20
+ - extconf.rb
21
+ extra_rdoc_files: []
22
+ files:
23
+ - Lorcon2.c
24
+ - Lorcon2.h
25
+ - README
26
+ - extconf.rb
27
+ homepage: https://github.com/kismetwireless/lorcon/tree/master/ruby-lorcon
28
+ licenses:
29
+ - GPL-2.0
30
+ metadata:
31
+ source_code_uri: https://github.com/kismetwireless/lorcon.git
32
+ post_install_message:
33
+ rdoc_options: []
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ requirements: []
47
+ rubyforge_project:
48
+ rubygems_version: 2.5.1
49
+ signing_key:
50
+ specification_version: 4
51
+ summary: This is an experimental interface for lorcon.
52
+ test_files: []