aboutsummaryrefslogtreecommitdiffstats
path: root/doc-src/scripting/libmproxy.html
blob: db58f7e0068aafb5a5ee6c5bd726f5fcbea4e780 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div class="well">
    <strong>Heads up!</strong> We strongly encourage you to use <a href="@!urlTo("scripting/inlinescripts.html")!@">inline scripts</a> rather than libmproxy
    directly.<br><br>
    <ul>
        <li>Inline Scripts are equally powerful and provide an easier syntax.</li>
        <li>Most examples are written as inline scripts.</li>
        <li>Multiple inline scripts can be combined and used together.</li>
        <li>Inline Scripts can either be executed headless with mitmdump or within the mitmproxy UI.</li>
    </ul>
</div>

All of mitmproxy's basic functionality is exposed through the __libmproxy__
library. The example below shows a simple implementation of the "sticky cookie"
functionality included in the interactive mitmproxy program. Traffic is
monitored for __cookie__ and __set-cookie__ headers, and requests are rewritten
to include a previously seen cookie if they don't already have one. In effect,
this lets you log in to a site using your browser, and then make subsequent
requests using a tool like __curl__, which will then seem to be part of the
authenticated session.

$!example("examples/stickycookies")!$
class="cp"> #include <machine/synch_bitops.h> #include <machine/hypervisor-ifs.h> /* * LOW-LEVEL DEFINITIONS */ /* Force a proper event-channel callback from Xen. */ void force_evtchn_callback(void); /* Entry point for notifications into Linux subsystems. */ void evtchn_do_upcall(struct intrframe *frame); /* Entry point for notifications into the userland character device. */ void evtchn_device_upcall(int port); static inline void mask_evtchn(int port) { shared_info_t *s = HYPERVISOR_shared_info; synch_set_bit(port, &s->evtchn_mask[0]); } static inline void unmask_evtchn(int port) { shared_info_t *s = HYPERVISOR_shared_info; synch_clear_bit(port, &s->evtchn_mask[0]); /* * The following is basically the equivalent of 'hw_resend_irq'. Just like * a real IO-APIC we 'lose the interrupt edge' if the channel is masked. */ if ( synch_test_bit (port, &s->evtchn_pending[0]) && !synch_test_and_set_bit(port>>5, &s->evtchn_pending_sel) ) { s->vcpu_data[0].evtchn_upcall_pending = 1; if ( !s->vcpu_data[0].evtchn_upcall_mask ) force_evtchn_callback(); } } static inline void clear_evtchn(int port) { shared_info_t *s = HYPERVISOR_shared_info; synch_clear_bit(port, &s->evtchn_pending[0]); } static inline void notify_via_evtchn(int port) { evtchn_op_t op; op.cmd = EVTCHNOP_send; op.u.send.local_port = port; (void)HYPERVISOR_event_channel_op(&op); } /* * CHARACTER-DEVICE DEFINITIONS */ #define PORT_NORMAL 0x0000 #define PORT_EXCEPTION 0x8000 #define PORTIDX_MASK 0x7fff /* /dev/xen/evtchn resides at device number major=10, minor=200 */ #define EVTCHN_MINOR 200 /* /dev/xen/evtchn ioctls: */ /* EVTCHN_RESET: Clear and reinit the event buffer. Clear error condition. */ #define EVTCHN_RESET _IO('E', 1) /* EVTCHN_BIND: Bind to the specified event-channel port. */ #define EVTCHN_BIND _IO('E', 2) /* EVTCHN_UNBIND: Unbind from the specified event-channel port. */ #define EVTCHN_UNBIND _IO('E', 3) #endif /* __ASM_EVTCHN_H__ */