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()>0)
            {
                //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 = 0;
    foreach(QString s,sl)
    {
        r <<= 8;
        r |= s.toUInt();
    }

    return r;
}

/**
 * @brief int2ip
 * @param ip
 * @return
 *
 * 将int型整数,转化成点分十进制IP
 */
QString int2ip(unsigned int ip)
{
    return QString::number((ip >> 24) & 0xff) + "." + QString::number((ip >> 16) & 0xff)
            + "." + QString::number((ip >> 8) & 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(0);
    }
}

void MainWindow::moveEvent(QMoveEvent *)
{
    this->move(QPoint(0,0));
}

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!");
    }
}

 

时间: 2024-08-23 20:53:20

OK335xS Qt network hacking的相关文章

OK335xS mac address hacking

/*********************************************************************** * OK335xS mac address hacking * 声明: * 在一般的嵌入式产品中,一般mac地址都是存在于CPU芯片中,不过有时候 * 我们也许会表示怀疑,因为我们可能更希望知道那些东西到底存在哪里,以一 * 种什么样的形式存在. * * 2016-2-1 深圳 南山平山村 曾剑锋 ***************************

OK335xS knob driver hacking

/************************************************************************* * OK335xS knob driver hacking * 说明: * 本文主要是为了分析knob设备的创建,驱动层如何注册,发送信息. * * 2015-11-18 晴 深圳 南山平山村 曾剑锋 ************************************************************************/

OK335xS EMMC Partition hacking

#! /bin/sh # # OK335xS EMMC Partition hacking # 说明: # 本文主要是为了解读同事对EMMC分区的写法,其中有很多写法重复了,但 # 依然尽量保留其作者写的原貌. # # 2016-3-24 深圳 南山平山村 曾剑锋 # 卸载分区 umount /dev/mmcblk1boot0 umount /dev/mmcblk1boot1 umount /dev/mmcblk1p1 umount /dev/mmcblk1p2 sync sync sleep

matrix-gui-browser-2.0 matrix-browser Qt QWebView hacking

/* * matrix-browser * * Simple web viewer used by Matrix application launcher * * Copyright (C) 2011,2012 Texas Instruments Incorporated - http://www.ti.com/ * * * Redistribution and use in source and binary forms, with or without * modification, are

[Qt教程] 第32篇 网络(二)HTTP

[Qt教程] 第32篇 网络(二)HTTP 楼主  发表于 2013-8-28 17:21:28 | 查看: 637| 回复: 8 HTTP 版权声明 该文章原创于作者yafeilinux,转载请注明出处! 导语        HTTP(HyperText Transfer Protocol,超文本传输协议)是一个客户端和服务器端请求和应答的标准.在Qt的网络模块中提供了网络访问接口来实现HTTP编程.网络访问接口是执行一般的网络操作的类的集合,该接口在特定的操作和使用的协议(例如,通过HTTP

[Qt教程] 第31篇 网络(一)Qt网络编程简介

[Qt教程] 第31篇 网络(一)Qt网络编程简介 楼主  发表于 2013-8-28 17:04:17 | 查看: 515| 回复: 0 Qt网络编程简介 版权声明 该文章原创于作者yafeilinux,转载请注明出处! 导语 从这一节开始我们讲述Qt网络应用方面的编程知识.在开始这部分知识的学习之前,大家最好已经拥有了一定的网络知识和Qt的编程基础.在后面的教程中我们不会对一个常用的网络名词进行详细的解释,对于不太了解的地方,大家可以参考相关书籍. 不过,大家也没有必要非得先去学习网络专业知

[Qt教程] 第35篇 网络(五)获取本机网络信息

[Qt教程] 第35篇 网络(五)获取本机网络信息 楼主  发表于 2013-9-5 11:32:58 | 查看: 278| 回复: 2 获取本机网络信息 版权声明 该文章原创于作者yafeilinux,转载请注明出处! 导语 前面讲完了HTTP和FTP,下面本来该讲解UDP和TCP了.不过,在讲解它们之前,我们先在这一节里讲解一个以后要经常用到的名词,那就是IP地址.        对于IP地址,其实,会上网的人都应该听说过它.如果你实在很不属性,那么简单的说:IP即InternetProto

[Qt教程] 第33篇 网络(三)FTP(一)

[Qt教程] 第33篇 网络(三)FTP(一) 楼主  发表于 2013-9-4 14:52:46 | 查看: 392| 回复: 8 FTP(一) 版权声明 该文章原创于作者yafeilinux,转载请注明出处! 导语 上一节我们讲述了HTTP的编程,这一节讲述与其及其相似的FTP的编程.FTP即FileTransfer Protocol,也就是文件传输协议.FTP的主要作用,就是让用户连接上一个远程计算机,查看远程计算机有哪些文件,然后把文件从远程计算机上拷贝到本地计算机,或者把本地计算机的文

[Qt教程] 第36篇 网络(六)UDP

[Qt教程] 第36篇 网络(六)UDP 楼主  发表于 2013-9-5 11:38:50 | 查看: 241| 回复: 0 UDP 版权声明 该文章原创作者yafeilinux,转载请注明出处! 导语 这一节讲述UDP编程的知识.UDP(UserDatagram Protocol即用户数据报协议)是一个轻量级的,不可靠的,面向数据报的无连接协议.对于UDP我们不再进行过多介绍,如果你对UDP不是很了解,而且不知道它有什么用,那么这里就举个简单的例子:我们现在几乎每个人都使用的腾讯QQ,其聊天