This commit is contained in:
Tim Blume 2020-08-05 02:08:41 +02:00
commit 103011f8f7
7 changed files with 415 additions and 0 deletions

73
.gitignore vendored Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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()
]