OK335xS Qt network hacking
/**********************************************************************
* OK335xS Qt network hacking
* 说明:
* 应该半年前尝试过来解读这个程序,但是那时候对有些东西不是很理解,
* 最后不了了之了,这次因为需要,所以重新对network的mainwindow.cpp进行
* 一下解读。
*
* 2016-4-8 深圳 南山平山村 曾剑锋
*********************************************************************/ #include "mainwindow.h"
#include "ui_mainwindow.h" // ifconfig -a|grep -E "eth[0-9]|wlan[0-9]"|cut -d' ' -f 1
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
// 设置UI界面
ui->setupUi(this);
proc = NULL;
flag = false;
// 选择的网卡发生了改变
connect(ui->cb_interface, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(on_sel_changed(QString)));
// 点击了OK按j钮
connect(ui->ok, SIGNAL(clicked()), this, SLOT(on_ok_clicked()));
// 选择了dhcp单选按钮
connect(ui->radio_dhcp, SIGNAL(toggled(bool)), this, SLOT(on_toggled(bool)));
// 选择了static单选按钮
connect(ui->radio_static, SIGNAL(toggled(bool)), this, SLOT(on_toggled(bool))); // 获取当前系统中的网卡,并创建对应的网卡实例
refreshInterfaces();
// 读取当前系统默认对网卡的配置
readConfigs(); // 将当前默认的网卡的数据显示
on_sel_changed(ui->cb_interface->currentText()); } MainWindow::~MainWindow()
{
delete ui;
// 释放实例化的网卡实例
foreach(Interface *i,ints)
delete i;
} void MainWindow::state(bool dhcp)
{
// 设置UI显示状态
if(dhcp)
{
ui->radio_dhcp->setChecked(true);
ui->radio_static->setChecked(false);
ui->edt_ip->setDisabled(true);
ui->edt_mask->setDisabled(true);
ui->edt_gateway->setDisabled(true);
ui->edt_dns->setDisabled(true);
}
else
{
ui->radio_dhcp->setChecked(false);
ui->radio_static->setChecked(true);
ui->edt_ip->setDisabled(false);
ui->edt_mask->setDisabled(false);
ui->edt_gateway->setDisabled(false);
ui->edt_dns->setDisabled(false);
}
} void MainWindow::refreshInterfaces()
{
QStringList sl; /*过滤读eth[0-9] wlan[0-9]*/
// 获取网卡名保存在/tmp/interfaces文件中,一行一个网卡名
::system("ifconfig -a|grep -E \"eth[0-9]\"|cut -d' ' -f 1 >/tmp/interfaces");
// 打开缓存文件
QFile f("/tmp/interfaces");
if(f.open(QFile::ReadOnly))
{
// 创建文件流
QTextStream t(&f);
// 判断是否到了文件末尾
while(!t.atEnd())
{
// 获取一行,也就是一个网卡名
QString str=t.readLine();
if(str.size()>)
{
//QMessageBox::about(this,"aaa",str);
/**
* 1. QList<Interface*> ints;
* 2. class Interface
* {
* public:
* Interface(QString &name);
* public:
* QString name;
* bool dhcp;
* QString ip;
* QString mask;
* QString gateway;
* QString dns;
* };
* 3. 实例化网卡,添加在list后面
* 4. 与后面的c_interface的index是一样的
*
*/
ints.append(new Interface(str));
sl<<str;
}
}
}
f.close(); ui->cb_interface->addItems(sl);
} void MainWindow::readConfigs()
{
/*自己的配置文件*/
foreach(Interface *i,ints)
{
// 获取几个网卡的默认配置信息
QFile f("/etc/network/.conf/"+i->name);
if(f.open(QFile::ReadOnly))
{
QTextStream t(&f);
QString str = t.readLine(); if(str == "dhcp")//do nothing
;
// 从下面的内容可以知道,配置信息的循序必须按照下面读取的顺序进行排序写,
// 否则会照成配置出错
else if(str == "static")
{
i->dhcp = false;
i->ip = t.readLine();
i->mask = t.readLine();
i->gateway = t.readLine();
i->dns = t.readLine();
}
}
f.close();
}
} /**
* @brief ip2int
* @param ip
* @return
*
* 将IP地址转化成整数
*/
unsigned int ip2int(QString ip)
{
QStringList sl = ip.split('.');
unsigned int r = ;
foreach(QString s,sl)
{
r <<= ;
r |= s.toUInt();
} return r;
} /**
* @brief int2ip
* @param ip
* @return
*
* 将int型整数,转化成点分十进制IP
*/
QString int2ip(unsigned int ip)
{
return QString::number((ip >> ) & 0xff) + "." + QString::number((ip >> ) & 0xff)
+ "." + QString::number((ip >> ) & 0xff) + "." + QString::number(ip & 0xff);
} void MainWindow::writeConfigs()
{
/*真正的配置文件*/
// 域名服务器IP
::system("rm /etc/resolv.conf");
QFile r("/etc/resolv.conf");//for dns
QTextStream *t2 = NULL;
if(r.open(QFile::WriteOnly))
{
t2 = new QTextStream(&r);
} // 网卡参数
QFile m("/etc/network/interfaces");//for interface
QTextStream *t3 = NULL;
if(m.open(QFile::WriteOnly))
{
t3 = new QTextStream(&m);
} /*write `lo` configration first*/
*t3<<QString("auto lo\n");
*t3<<QString("iface lo inet loopback\n"); ::system("mkdir -p /etc/network/.conf"); /*自己的配置文件*/
// 重写配置文件
foreach(Interface *i,ints)
{
QFile f("/etc/network/.conf/"+i->name); if(f.open(QFile::WriteOnly))
{
QTextStream t(&f); if(i->dhcp)
{
t<<QString("dhcp")<<QString(QString("\n"));
*t3<<QString("auto ")<<i->name<<QString(QString("\n"));
*t3<<QString("iface ")<<i->name<<QString(" inet dhcp\n");
}
else
{
t<<QString("static")<<QString("\n");
t<<i->ip<<QString("\n");
t<<i->mask<<QString("\n");
t<<i->gateway<<QString("\n");
t<<i->dns<<QString("\n"); *t3<<QString("auto ")<<i->name<<QString("\n");
*t3<<QString("iface ")<<i->name<<QString(" inet static\n");
*t3<<QString("address ")<<i->ip<<QString("\n");
*t3<<QString("netmask ")<<i->mask<<QString("\n");
*t3<<QString("gateway ")<<i->gateway<<QString("\n");
*t3<<QString("broadcast ")<<int2ip((ip2int(i->ip) & ip2int(i->mask))|(~ip2int(i->mask)))<<QString("\n"); *t2<<QString("nameserver ")+i->dns<<QString("\n");//同时写入到/etc/resolv.conf
}
}
f.close();
} delete t2;
delete t3; r.close();
m.close();
} void MainWindow::on_toggled(bool b)
{
// 通过这里知道当前索引的那张网卡
Interface *i = NULL;
foreach(i,ints)
{
if(i->name == ui->cb_interface->currentText())
break;
} // 根据当前的是否采用dhcp还是static来显示UI控件
state(ui->radio_dhcp->isChecked()); // 显示对应的数据
if(ui->radio_dhcp->isChecked())
{
/*ui->edt_ip->clear();
ui->edt_mask->clear();
ui->edt_gateway->clear();
ui->edt_dns->clear();*/
}
else
{
ui->edt_ip->setText(i->ip);
ui->edt_mask->setText(i->mask);
ui->edt_gateway->setText(i->gateway);
ui->edt_dns->setText(i->dns);
}
} void MainWindow::on_sel_changed(const QString &text)
{
// 循环检查,如果当前次循环的网卡实例名与传入的参数一样,那么跳出循环,
// i则指向了当前需要配置的网卡
Interface *i = NULL;
foreach(i,ints)
{
if(i->name == text)
break;
} //QMessageBox::about(this,"aaa",i->name); // 设置UI显示状态
state(i->dhcp); // 重新设置UI中的值
if(i->dhcp)
{
ui->edt_ip->clear();
ui->edt_mask->clear();
ui->edt_gateway->clear();
ui->edt_dns->clear();
}
else
{
ui->edt_ip->setText(i->ip);
ui->edt_mask->setText(i->mask);
ui->edt_gateway->setText(i->gateway);
ui->edt_dns->setText(i->dns);
}
} void MainWindow::on_ok_clicked()
{
// 获取当前的网jjj卡
Interface *i = NULL;
foreach(i,ints)
{
if(i->name == ui->cb_interface->currentText())
break;
} // 设置当前的网卡
i->dhcp = ui->radio_dhcp->isChecked();
i->ip = ui->edt_ip->text();
i->mask = ui->edt_mask->text();
i->gateway = ui->edt_gateway->text();
i->dns = ui->edt_dns->text(); // 写入文件
writeConfigs();
// 同步,将内存中的数据写入NAND或者SD卡
::system("sync"); // 如果proc存在,那么就释放
if(proc)
delete proc; // 创建进程来重启网卡
proc = new QProcess(this);
proc->start("/etc/init.d/networking restart");
// 防止进程未处理完之前,程序退出
connect(proc,SIGNAL(finished(int)),this,SLOT(proc_finished(int)));
this->setDisabled(true); flag = true;
} void MainWindow::closeEvent(QCloseEvent * evt)
{
if(flag)
{
evt->ignore();
QMessageBox::about(this,"info","network is restarting,please wait");
}
else
{
destroy();
exit();
}
} void MainWindow::moveEvent(QMoveEvent *)
{
this->move(QPoint(,));
} void MainWindow::resizeEvent(QResizeEvent *)
{
this->showMaximized();
} void MainWindow::proc_finished(int code)
{
if(proc->exitStatus() == QProcess::NormalExit)
{
this->setDisabled(false);
flag = false;
QMessageBox::about(this,"info","network restart ok!");
}
}
OK335xS Qt network hacking的更多相关文章
- OK335xS mac address hacking
/*********************************************************************** * OK335xS mac address hacki ...
- OK335xS EMMC Partition hacking
#! /bin/sh # # OK335xS EMMC Partition hacking # 说明: # 本文主要是为了解读同事对EMMC分区的写法,其中有很多写法重复了,但 # 依然尽量保留其作者 ...
- 解决Qt5使用SSL的“qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method”错误
在使用Qt的网络组件连接某些服务器时, 会提示"qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method"的错误 ...
- qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
使用Qt编写程序访问知乎官网,程序报错 qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method ...
- QT4.8.6之qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
想试着用qt写一个爬虫,编译的时候报如下错误 qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error qt. ...
- OK335xS knob driver hacking
/************************************************************************* * OK335xS knob driver hac ...
- Top 10 Free Wireless Network hacking/monitoring tools for ethical hackers and businesses
There are lots of free tools available online to get easy access to the WiFi networks intended to he ...
- Qt NetWork即时通讯网络聊天室(基于TCP)
本文使用QT的网络模块来创建一个网络聊天室程序,主要包括以下功能: 1.基于TCP的可靠连接(QTcpServer.QTcpSocket) 2.一个服务器,多个客户端 3.服务器接收到某个客户端的请求 ...
- 解决qt提示:qt.network.ssl: QSslSocket: cannot call unresolved function DH_free
方法一(解决):把C:\Qt\Qt5.8.0\Tools\QtCreator\bin下的libeay32.dll和ssleay32.dll库复制到C:\Qt\Qt5.8.0\5.8\msvc2015_ ...
随机推荐
- Spark Streaming揭秘 Day16 数据清理机制
Spark Streaming揭秘 Day16 数据清理机制 今天主要来讲下Spark的数据清理机制,我们都知道,Spark是运行在jvm上的,虽然jvm本身就有对象的自动回收工作,但是,如果自己不进 ...
- Ubuntu虚拟机与Window、Arm的通信
Ubuntu虚拟机与Window的通信安装有Ubuntu14.04的虚拟机VMware,将虚拟机的网络适配器配置成NAT类型(默认使用VMnet8进行通信),此时将Ubuntu的IP地址设置成与VMn ...
- Intel Edison的那些事:修改Edison的HTTP服务的页面
Intel Edison配置好之后,按住PWR键2-7秒(4秒恰到好处),就可以进入AP热点模式(此时,Arduino扩展板上的灯不停闪烁),可以将笔记本接入Edison的热点,然后在浏览器中访问“h ...
- jquery全局加载函数的几种方式;
1.使用javascript方式(function(){})(); 2.使用jQuery(function($) {}); 3.使用$(document).ready(function(){}); 其 ...
- OnlineJudge大集合
什么是OJ Online Judge系统(简称OJ)是一个在线的判题系统.用户可以在线提交程序源代码,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性. 一个用户提交的程序 ...
- Searching in a rotated and sorted array
Given a sorted array that has been rotated serveral times. Write code to find an element in this arr ...
- spoj 1437
自己暴了一下不过 转一个 bfs... #include <cstdio> #include <vector> #include <queue> #incl ...
- Scrum中的User Story
我们通常用User Story来描述Backlog里的各个Backlog项,User Story是从用户的角度对系统的某个功能模块所作的简短描述.一个User Story描述了项目中的一个小功能,以及 ...
- KafkaSpout: PartitionManager的行为分析
KafkaSpout的核心逻辑都是由PartitionManager来实现的. 但是这个类实现时候需要考虑的东西有些多,0.92至0.93,至当前(2015.3.14)的master一直在变化.在这里 ...
- c/c++ define用法
define,无参宏定义的一般形式为:#define 标识符 字符串 外文名 define 词条范围 计算机专业用语 无参一般形式 #define 标识符 字符串 带参一般形式 #define 宏名( ...