initial
This commit is contained in:
		
						commit
						103011f8f7
					
				
					 7 changed files with 415 additions and 0 deletions
				
			
		
							
								
								
									
										73
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,73 @@ | ||||||
|  | # This file is used to ignore files which are generated | ||||||
|  | # ---------------------------------------------------------------------------- | ||||||
|  | 
 | ||||||
|  | *~ | ||||||
|  | *.autosave | ||||||
|  | *.a | ||||||
|  | *.core | ||||||
|  | *.moc | ||||||
|  | *.o | ||||||
|  | *.obj | ||||||
|  | *.orig | ||||||
|  | *.rej | ||||||
|  | *.so | ||||||
|  | *.so.* | ||||||
|  | *_pch.h.cpp | ||||||
|  | *_resource.rc | ||||||
|  | *.qm | ||||||
|  | .#* | ||||||
|  | *.*# | ||||||
|  | core | ||||||
|  | !core/ | ||||||
|  | tags | ||||||
|  | .DS_Store | ||||||
|  | .directory | ||||||
|  | *.debug | ||||||
|  | Makefile* | ||||||
|  | *.prl | ||||||
|  | *.app | ||||||
|  | moc_*.cpp | ||||||
|  | ui_*.h | ||||||
|  | qrc_*.cpp | ||||||
|  | Thumbs.db | ||||||
|  | *.res | ||||||
|  | *.rc | ||||||
|  | /.qmake.cache | ||||||
|  | /.qmake.stash | ||||||
|  | 
 | ||||||
|  | # qtcreator generated files | ||||||
|  | *.pro.user* | ||||||
|  | 
 | ||||||
|  | # xemacs temporary files | ||||||
|  | *.flc | ||||||
|  | 
 | ||||||
|  | # Vim temporary files | ||||||
|  | .*.swp | ||||||
|  | 
 | ||||||
|  | # Visual Studio generated files | ||||||
|  | *.ib_pdb_index | ||||||
|  | *.idb | ||||||
|  | *.ilk | ||||||
|  | *.pdb | ||||||
|  | *.sln | ||||||
|  | *.suo | ||||||
|  | *.vcproj | ||||||
|  | *vcproj.*.*.user | ||||||
|  | *.ncb | ||||||
|  | *.sdf | ||||||
|  | *.opensdf | ||||||
|  | *.vcxproj | ||||||
|  | *vcxproj.* | ||||||
|  | 
 | ||||||
|  | # MinGW generated files | ||||||
|  | *.Debug | ||||||
|  | *.Release | ||||||
|  | 
 | ||||||
|  | # Python byte code | ||||||
|  | *.pyc | ||||||
|  | 
 | ||||||
|  | # Binaries | ||||||
|  | # -------- | ||||||
|  | *.dll | ||||||
|  | *.exe | ||||||
|  | *.user | ||||||
							
								
								
									
										46
									
								
								CMakeLists.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								CMakeLists.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | ||||||
|  | cmake_minimum_required(VERSION 3.5) | ||||||
|  | 
 | ||||||
|  | project(littlesnitch LANGUAGES CXX) | ||||||
|  | 
 | ||||||
|  | set(CMAKE_INCLUDE_CURRENT_DIR ON) | ||||||
|  | 
 | ||||||
|  | set(CMAKE_AUTOUIC ON) | ||||||
|  | set(CMAKE_AUTOMOC ON) | ||||||
|  | set(CMAKE_AUTORCC ON) | ||||||
|  | 
 | ||||||
|  | set(CMAKE_CXX_STANDARD 11) | ||||||
|  | set(CMAKE_CXX_STANDARD_REQUIRED ON) | ||||||
|  | 
 | ||||||
|  | # QtCreator supports the following variables for Android, which are identical to qmake Android variables. | ||||||
|  | # Check http://doc.qt.io/qt-5/deployment-android.html for more information. | ||||||
|  | # They need to be set before the find_package(Qt5 ...) call. | ||||||
|  | 
 | ||||||
|  | #if(ANDROID) | ||||||
|  | #    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") | ||||||
|  | #    if (ANDROID_ABI STREQUAL "armeabi-v7a") | ||||||
|  | #        set(ANDROID_EXTRA_LIBS | ||||||
|  | #            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so | ||||||
|  | #            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so) | ||||||
|  | #    endif() | ||||||
|  | #endif() | ||||||
|  | 
 | ||||||
|  | find_package(Qt5 COMPONENTS Widgets REQUIRED) | ||||||
|  | find_package(cppzmq REQUIRED) | ||||||
|  | 
 | ||||||
|  | if(ANDROID) | ||||||
|  |   add_library(littlesnitch SHARED | ||||||
|  |     main.cpp | ||||||
|  |     mainwindow.cpp | ||||||
|  |     mainwindow.h | ||||||
|  |     mainwindow.ui | ||||||
|  |   ) | ||||||
|  | else() | ||||||
|  |   add_executable(littlesnitch | ||||||
|  |     main.cpp | ||||||
|  |     mainwindow.cpp | ||||||
|  |     mainwindow.h | ||||||
|  |     mainwindow.ui | ||||||
|  |   ) | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | target_link_libraries(littlesnitch PRIVATE Qt5::Widgets cppzmq) | ||||||
							
								
								
									
										11
									
								
								main.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								main.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | ||||||
|  | #include "mainwindow.h" | ||||||
|  | 
 | ||||||
|  | #include <QApplication> | ||||||
|  | 
 | ||||||
|  | int main(int argc, char *argv[]) | ||||||
|  | { | ||||||
|  |     QApplication a(argc, argv); | ||||||
|  |     MainWindow w; | ||||||
|  |     w.show(); | ||||||
|  |     return a.exec(); | ||||||
|  | } | ||||||
							
								
								
									
										86
									
								
								mainwindow.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								mainwindow.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,86 @@ | ||||||
|  | #include "mainwindow.h" | ||||||
|  | #include "./ui_mainwindow.h" | ||||||
|  | #include <QtGui> | ||||||
|  | 
 | ||||||
|  | MainWindow::MainWindow(QWidget *parent) | ||||||
|  |     : QMainWindow(parent), | ||||||
|  |       ui(new Ui::MainWindow) | ||||||
|  | { | ||||||
|  |     thread = new QThread; | ||||||
|  |     Worker* worker = new Worker(); | ||||||
|  |     worker->moveToThread(thread); | ||||||
|  |     //connect(worker, SIGNAL (error(QString)), this, SLOT (errorString(QString)));
 | ||||||
|  |     connect(thread, SIGNAL (started()), worker, SLOT (process())); | ||||||
|  |     connect(thread, SIGNAL (httpMessage()), worker, SLOT (httpMessage())); | ||||||
|  |     thread->start(); | ||||||
|  | 
 | ||||||
|  |     ui->setupUi(this); | ||||||
|  |     ui->historyHTTPTable->setShowGrid(true); | ||||||
|  |     ui->historyHTTPTable->setEditTriggers(QAbstractItemView::NoEditTriggers); | ||||||
|  |     ui->historyHTTPTable->setColumnCount(4); | ||||||
|  |     ui->historyHTTPTable->setRowCount(1); | ||||||
|  | 
 | ||||||
|  |     HTTPData data; | ||||||
|  |     data.index = 1; | ||||||
|  |     data.url = "https://test.com"; | ||||||
|  |     data.status = 200; | ||||||
|  |     data.method = "GET"; | ||||||
|  |     data.ttl = 44; | ||||||
|  | 
 | ||||||
|  |     ui->historyHTTPTable->setItem(0,0,new QTableWidgetItem(QString::number(data.index))); | ||||||
|  |     ui->historyHTTPTable->setItem(0,1,new QTableWidgetItem(QString::fromStdString(data.method))); | ||||||
|  |     ui->historyHTTPTable->setItem(0,2,new QTableWidgetItem(QString::fromStdString(data.url))); | ||||||
|  |     ui->historyHTTPTable->setItem(0,3,new QTableWidgetItem(QString::number(data.ttl))); | ||||||
|  |     ui->historyHTTPTable->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | MainWindow::~MainWindow() | ||||||
|  | { | ||||||
|  |     delete ui; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void MainWindow::httpMessage(HTTPData data) { | ||||||
|  |     qDebug() << data.index; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Worker::Worker() { // Constructor
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Worker::~Worker() { // Destructor
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Worker::process() { | ||||||
|  |     qDebug("thread started"); | ||||||
|  |     zmq::context_t ctx(1); | ||||||
|  |     zmq::socket_t sock(ctx, zmq::socket_type::pair); | ||||||
|  |     try { | ||||||
|  |         sock.bind("tcp://127.0.0.1:12345"); | ||||||
|  |     } catch (zmq::error_t err) { | ||||||
|  |         qDebug() << "failed binding socket" << err.what(); | ||||||
|  |         emit error(err.what()); | ||||||
|  |         return; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     qDebug("bound socket"); | ||||||
|  | 
 | ||||||
|  |     while(true) { | ||||||
|  |         sock.send(zmq::str_buffer("littlesnitch_init"), zmq::send_flags::dontwait); | ||||||
|  |         zmq::message_t msg; | ||||||
|  |         const auto ret = sock.recv(msg, zmq::recv_flags::dontwait); | ||||||
|  |         if(ret) { | ||||||
|  |             qDebug() << "got message: " << msg.to_string().c_str(); | ||||||
|  |             if(msg.to_string() == "mitmaddon") { | ||||||
|  |                 qDebug("connected"); | ||||||
|  |                 while(true) { | ||||||
|  |                     const auto ret = sock.recv(msg, zmq::recv_flags::dontwait); | ||||||
|  |                     if(ret) { | ||||||
|  |                         qDebug() << msg.to_string().c_str(); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } else { | ||||||
|  |                 qDebug("not connected"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										51
									
								
								mainwindow.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								mainwindow.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <QMainWindow> | ||||||
|  | #include <string> | ||||||
|  | #include <zmq.hpp> | ||||||
|  | 
 | ||||||
|  | QT_BEGIN_NAMESPACE | ||||||
|  | namespace Ui { class MainWindow; } | ||||||
|  | QT_END_NAMESPACE | ||||||
|  | 
 | ||||||
|  | class HTTPData { | ||||||
|  | private: | ||||||
|  | public: | ||||||
|  |     size_t index; | ||||||
|  |     size_t status; | ||||||
|  |     size_t ttl; | ||||||
|  |     std::string method; | ||||||
|  |     std::string url; | ||||||
|  |     std::string request_headers; | ||||||
|  |     std::string request_content; | ||||||
|  |     std::string response_headers; | ||||||
|  |     std::string response_content; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class Worker : public QObject { | ||||||
|  |     Q_OBJECT | ||||||
|  | public: | ||||||
|  |     Worker(); | ||||||
|  |     ~Worker(); | ||||||
|  | public slots: | ||||||
|  |     void process(); | ||||||
|  | signals: | ||||||
|  |     void finished(); | ||||||
|  |     void error(QString err); | ||||||
|  |     void httpMessage(HTTPData); | ||||||
|  | private: | ||||||
|  |     // add your variables here
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class MainWindow : public QMainWindow | ||||||
|  | { | ||||||
|  |     Q_OBJECT | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     Ui::MainWindow *ui; | ||||||
|  |     QThread* thread; | ||||||
|  | public: | ||||||
|  |     MainWindow(QWidget *parent = nullptr); | ||||||
|  |     ~MainWindow(); | ||||||
|  |     void httpMessage(HTTPData data); | ||||||
|  | }; | ||||||
							
								
								
									
										97
									
								
								mainwindow.ui
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								mainwindow.ui
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,97 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <ui version="4.0"> | ||||||
|  |  <class>MainWindow</class> | ||||||
|  |  <widget class="QMainWindow" name="MainWindow"> | ||||||
|  |   <property name="geometry"> | ||||||
|  |    <rect> | ||||||
|  |     <x>0</x> | ||||||
|  |     <y>0</y> | ||||||
|  |     <width>800</width> | ||||||
|  |     <height>600</height> | ||||||
|  |    </rect> | ||||||
|  |   </property> | ||||||
|  |   <property name="windowTitle"> | ||||||
|  |    <string>MainWindow</string> | ||||||
|  |   </property> | ||||||
|  |   <widget class="QWidget" name="centralwidget"> | ||||||
|  |    <layout class="QFormLayout" name="formLayout"> | ||||||
|  |     <item row="0" column="0"> | ||||||
|  |      <widget class="QFrame" name="frame_2"> | ||||||
|  |       <property name="frameShape"> | ||||||
|  |        <enum>QFrame::StyledPanel</enum> | ||||||
|  |       </property> | ||||||
|  |       <property name="frameShadow"> | ||||||
|  |        <enum>QFrame::Raised</enum> | ||||||
|  |       </property> | ||||||
|  |       <layout class="QHBoxLayout" name="horizontalLayout_2"> | ||||||
|  |        <item> | ||||||
|  |         <widget class="QTreeView" name="treeView"/> | ||||||
|  |        </item> | ||||||
|  |       </layout> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="0" column="1"> | ||||||
|  |      <widget class="QFrame" name="frame"> | ||||||
|  |       <property name="frameShape"> | ||||||
|  |        <enum>QFrame::StyledPanel</enum> | ||||||
|  |       </property> | ||||||
|  |       <property name="frameShadow"> | ||||||
|  |        <enum>QFrame::Raised</enum> | ||||||
|  |       </property> | ||||||
|  |       <layout class="QVBoxLayout" name="verticalLayout"> | ||||||
|  |        <item> | ||||||
|  |         <widget class="QWidget" name="widget" native="true"> | ||||||
|  |          <layout class="QGridLayout" name="gridLayout"> | ||||||
|  |           <item row="0" column="0"> | ||||||
|  |            <widget class="QTextEdit" name="textEdit"/> | ||||||
|  |           </item> | ||||||
|  |           <item row="0" column="1"> | ||||||
|  |            <widget class="QTextEdit" name="textEdit_2"/> | ||||||
|  |           </item> | ||||||
|  |           <item row="1" column="0"> | ||||||
|  |            <widget class="QTextEdit" name="textEdit_3"/> | ||||||
|  |           </item> | ||||||
|  |           <item row="1" column="1"> | ||||||
|  |            <widget class="QTextEdit" name="textEdit_4"/> | ||||||
|  |           </item> | ||||||
|  |          </layout> | ||||||
|  |         </widget> | ||||||
|  |        </item> | ||||||
|  |       </layout> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="1" column="0" colspan="2"> | ||||||
|  |      <widget class="QTabWidget" name="tabWidget"> | ||||||
|  |       <widget class="QWidget" name="tabWidgetPage1" native="true"> | ||||||
|  |        <attribute name="title"> | ||||||
|  |         <string/> | ||||||
|  |        </attribute> | ||||||
|  |        <layout class="QVBoxLayout" name="verticalLayout_2"> | ||||||
|  |         <item> | ||||||
|  |          <widget class="QTableWidget" name="historyHTTPTable"> | ||||||
|  |           <property name="gridStyle"> | ||||||
|  |            <enum>Qt::SolidLine</enum> | ||||||
|  |           </property> | ||||||
|  |          </widget> | ||||||
|  |         </item> | ||||||
|  |        </layout> | ||||||
|  |       </widget> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |    </layout> | ||||||
|  |   </widget> | ||||||
|  |   <widget class="QMenuBar" name="menubar"> | ||||||
|  |    <property name="geometry"> | ||||||
|  |     <rect> | ||||||
|  |      <x>0</x> | ||||||
|  |      <y>0</y> | ||||||
|  |      <width>800</width> | ||||||
|  |      <height>20</height> | ||||||
|  |     </rect> | ||||||
|  |    </property> | ||||||
|  |   </widget> | ||||||
|  |   <widget class="QStatusBar" name="statusbar"/> | ||||||
|  |  </widget> | ||||||
|  |  <resources/> | ||||||
|  |  <connections/> | ||||||
|  | </ui> | ||||||
							
								
								
									
										51
									
								
								mitmaddon/littlesnitch.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								mitmaddon/littlesnitch.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | ||||||
|  | #!/usr/bin/env python3 | ||||||
|  | import pdb | ||||||
|  | from mitmproxy import ctx | ||||||
|  | import threading | ||||||
|  | from queue import Queue | ||||||
|  | import time | ||||||
|  | import zmq | ||||||
|  | 
 | ||||||
|  | def networking(q): | ||||||
|  |         print("starting thread") | ||||||
|  | 
 | ||||||
|  |         context = zmq.Context() | ||||||
|  |         socket = context.socket(zmq.PAIR) | ||||||
|  |         socket.connect("tcp://127.0.0.1:12345") | ||||||
|  |          | ||||||
|  |         while True: | ||||||
|  |             print("try recv") | ||||||
|  |             message = socket.recv() | ||||||
|  |             if message == b"littlesnitch_init": | ||||||
|  |                 print("connected") | ||||||
|  |                 socket.send(b"mitmaddon") | ||||||
|  |                 while True: | ||||||
|  |                     a = q.get() | ||||||
|  |                     print(f"got {a}") | ||||||
|  |                     if a: | ||||||
|  |                         socket.send(str.encode(a)) | ||||||
|  |                     q.task_done() | ||||||
|  |             else: | ||||||
|  |                 raise ValueError("init failed") | ||||||
|  | 
 | ||||||
|  | class Counter: | ||||||
|  |     def __init__(self): | ||||||
|  |         self.q = Queue() | ||||||
|  |         self.thread = threading.Thread(name="NetworkThread", target=networking, args=(self.q,)) | ||||||
|  |         self.thread.start() | ||||||
|  |         self.q.join() | ||||||
|  | 
 | ||||||
|  |     def request(self, flow): | ||||||
|  |         data = flow.request.data | ||||||
|  |         self.q.put(f"{flow.id},REQ,{data.method},{data.scheme},{data.host},{data.port},{data.path},{data.http_version},{data.headers}") | ||||||
|  |         self.q.join() | ||||||
|  | 
 | ||||||
|  |     def response(self, flow): | ||||||
|  |         data = flow.response.data | ||||||
|  |         self.q.put(f"{flow.id},RES,{data.status_code},{data.http_version},{data.reason},{data.headers},{data.content},{data.timestamp_start},{data.timestamp_end}") | ||||||
|  |         self.q.join() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | addons = [ | ||||||
|  |         Counter() | ||||||
|  |         ] | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue