summaryrefslogtreecommitdiffstats
path: root/src/libusb-sniff.c
diff options
context:
space:
mode:
authorPali Rohár <pali.rohar@gmail.com>2012-08-12 10:09:30 +0200
committerPali Rohár <pali.rohar@gmail.com>2012-08-12 10:09:30 +0200
commit0f5f96149f79c941e7fc0f39fdccfe7083353eca (patch)
treefc6e16c06e65ef01e97ede13ebe3c8b8a4941c62 /src/libusb-sniff.c
parente084cdaabeb167566dda6a8f118852ddc5f54be5 (diff)
download0xFFFF-0f5f96149f79c941e7fc0f39fdccfe7083353eca.tar.bz2
Added LD_PRELOAD library libusb-sniff for sniffing usb communication
Diffstat (limited to 'src/libusb-sniff.c')
-rw-r--r--src/libusb-sniff.c169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/libusb-sniff.c b/src/libusb-sniff.c
new file mode 100644
index 0000000..9477a3f
--- /dev/null
+++ b/src/libusb-sniff.c
@@ -0,0 +1,169 @@
+/*
+ libusb-sniff.c - Library for usb sniffing nokia's flasher-3.5
+ Copyright (C) 2011-2012 Pali Rohár <pali.rohar@gmail.com>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+/* compile: gcc libusb-sniff.c -o libusb-sniff.so -W -Wall -O2 -fPIC -ldl -shared -m32 */
+/* usage: sudo USBSNIFF_WAIT=1 LD_PRELOAD=./libusb-sniff.so flasher-3.5 ... */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <dlfcn.h>
+#include <usb.h>
+
+static char to_ascii(char c) {
+
+ if ( c >= 32 && c <= 126 )
+ return c;
+ return '.';
+
+}
+
+static void dump_bytes(const char * buf, size_t size) {
+
+ size_t i, ascii_cnt = 0;
+ char ascii[17] = { 0, };
+
+ for ( i = 0; i < size; i++ ) {
+ if ( i % 16 == 0 ) {
+ if ( i != 0 ) {
+ printf(" |%s|\n", ascii);
+ ascii[0] = 0;
+ ascii_cnt = 0;
+ }
+ printf("%04X:", (unsigned int)i);
+ }
+ printf(" %02X", buf[i] & 0xFF);
+ ascii[ascii_cnt] = to_ascii(buf[i]);
+ ascii[ascii_cnt + 1] = 0;
+ ascii_cnt++;
+ }
+
+ if ( ascii[0] ) {
+ if ( size % 16 )
+ for ( i = 0; i < 16 - (size % 16); i++ )
+ printf(" ");
+ printf(" |%s|\n", ascii);
+ }
+
+}
+
+int usb_bulk_write(usb_dev_handle * dev, int ep, const char * bytes, int size, int timeout) {
+
+ static int (*real_usb_bulk_write)(usb_dev_handle * dev, int ep, const char * bytes, int size, int timeout) = NULL;
+
+ if ( ! real_usb_bulk_write )
+ real_usb_bulk_write = dlsym(RTLD_NEXT, "usb_bulk_write");
+
+ printf("\n==== usb_bulk_write (ep=%d size=%d timeout=%d) ====\n", ep, size, timeout);
+ dump_bytes(bytes, size);
+ printf("====\n");
+
+ if ( getenv("USBSNIFF_WAIT") ) {
+ printf("Press ENTER"); fflush(stdout); getchar();
+ }
+
+ return real_usb_bulk_write(dev, ep, bytes, size, timeout);
+
+}
+
+int usb_bulk_read(usb_dev_handle * dev, int ep, char * bytes, int size, int timeout) {
+
+ static int (*real_usb_bulk_read)(usb_dev_handle * dev, int ep, char * bytes, int size, int timeout) = NULL;
+ int ret;
+
+ if ( ! real_usb_bulk_read )
+ real_usb_bulk_read = dlsym(RTLD_NEXT, "usb_bulk_read");
+
+ ret = real_usb_bulk_read(dev, ep, bytes, size, timeout);
+
+ printf("\n==== usb_bulk_read (ep=%d size=%d timeout=%d) ret = %d ====\n", ep, size, timeout, ret);
+ if ( ret > 0 ) {
+ dump_bytes(bytes, ret);
+ printf("====\n");
+ }
+
+ if ( getenv("USBSNIFF_WAIT") ) {
+ printf("Press ENTER"); fflush(stdout); getchar();
+ }
+
+ return ret;
+
+}
+
+int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout) {
+
+ static int (*real_usb_control_msg)(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout) = NULL;
+ int ret;
+
+ if ( ! real_usb_control_msg )
+ real_usb_control_msg = dlsym(RTLD_NEXT, "usb_control_msg");
+
+ ret = real_usb_control_msg(dev, requesttype, request, value, index, bytes, size, timeout);
+
+ printf("\n==== usb_control_msg(requesttype=%d, request=%d, value=%d, index=%d, size=%d, timeout=%d) ret = %d ====\n", requesttype, request, value, index, size, timeout, ret);
+ if ( ret > 0 ) {
+ dump_bytes(bytes, ret);
+ printf("====\n");
+ }
+
+ if ( getenv("USBSNIFF_WAIT") ) {
+ printf("Press ENTER"); fflush(stdout); getchar();
+ }
+
+ return ret;
+
+}
+
+int usb_set_configuration(usb_dev_handle *dev, int configuration) {
+
+ static int (*real_usb_set_configuration)(usb_dev_handle *dev, int configuration) = NULL;
+
+ if ( ! real_usb_set_configuration )
+ real_usb_set_configuration = dlsym(RTLD_NEXT, "usb_set_configuration");
+
+ printf("\n==== usb_set_configuration (configuration=%d) ====\n", configuration);
+
+ return real_usb_set_configuration(dev, configuration);
+
+}
+
+int usb_claim_interface(usb_dev_handle *dev, int interface) {
+
+ static int (*real_usb_claim_interface)(usb_dev_handle *dev, int interface) = NULL;
+
+ if ( ! real_usb_claim_interface )
+ real_usb_claim_interface = dlsym(RTLD_NEXT, "usb_claim_interface");
+
+ printf("\n==== usb_claim_interface (interface=%d) ====\n", interface);
+
+ return real_usb_claim_interface(dev, interface);
+
+}
+
+int usb_set_altinterface(usb_dev_handle *dev, int alternate) {
+
+ static int (*real_usb_set_altinterface)(usb_dev_handle *dev, int alternate) = NULL;
+
+ if ( ! real_usb_set_altinterface )
+ real_usb_set_altinterface = dlsym(RTLD_NEXT, "usb_set_altinterface");
+
+ printf("\n==== usb_set_altinterface (alternate=%d) ====\n", alternate);
+
+ return real_usb_set_altinterface(dev, alternate);
+
+}