~george-edison55/pedeconstructor/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* PE Deconstructor - A tool for examining Windows PE executables.
   Copyright (C) 2012 Nathan Osman

   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/>. */

#include <CMainWindow.h>
#include "ui_CMainWindow.h"

#include <QFileDialog>
#include <QFileInfo>
#include <QMessageBox>

#include <CAboutDialog.h>
#include <CExecutable.h>
#include <CFileHeader.h>

CMainWindow::CMainWindow(QWidget * parent)
    : QMainWindow(parent), ui(new Ui::CMainWindow)
{
    ui->setupUi(this);
    ui->Tabs->hide();

    // Parse command-line options
    if(QCoreApplication::arguments().count() == 2)
        OnOpenExecutable(QCoreApplication::arguments().at(1));
}

CMainWindow::~CMainWindow()
{
    delete ui;
}

void CMainWindow::OnOpenExecutable()
{
    QString filename = QFileDialog::getOpenFileName(this, "Select PE Executable", QString(),
                                                    "PE Executables (*.exe *.dll *.cpl *.scr);;All files (*.*)");
    if(!filename.isEmpty())
        OnOpenExecutable(filename);
}

void CMainWindow::OnOpenExecutable(QString filename)
{
    CExecutable exec;
    QString error_message;

    if(exec.Load(filename, error_message))
    {
        // Fill in the first page
        QFileInfo info(filename);

        ui->Filename->setText(info.fileName());
        ui->SizeOnDisk->setText(tr("%L2 bytes").arg(info.size()));

        // Load the file header
        ui->FileHeader->Load(exec.GetFileHeader());

        // Load the appropriate optional header
        switch(exec.GetFileHeader().Machine)
        {
            case CFileHeader::I386:
                ui->OptionalHeader->LoadI386(exec.GetI386OptionalHeader());
                break;
            case CFileHeader::AMD64:
                ui->OptionalHeader->LoadAMD64(exec.GetAMD64OptionalHeader());
                break;
        }

        ui->Tabs->show();
        setWindowTitle(tr("PE Deconstructor - %1").arg(info.fileName()));
    }
    else
        QMessageBox::critical(this, "Error:", error_message);
}

void CMainWindow::OnAbout()
{
    CAboutDialog().exec();
}