diff options
Diffstat (limited to 'VMProtect/property_editor.cc')
-rw-r--r-- | VMProtect/property_editor.cc | 2765 |
1 files changed, 2765 insertions, 0 deletions
diff --git a/VMProtect/property_editor.cc b/VMProtect/property_editor.cc new file mode 100644 index 0000000..01ec142 --- /dev/null +++ b/VMProtect/property_editor.cc @@ -0,0 +1,2765 @@ +#include "../runtime/common.h" +#include "../runtime/crypto.h" +#include "../core/objects.h" +#include "../core/osutils.h" +#include "../core/streams.h" +#include "../core/files.h" +#include "../core/lang.h" +#include "../core/core.h" +#include "../core/processors.h" +#include "widgets.h" +#include "models.h" +#include "property_editor.h" +#include "moc/moc_property_editor.cc" + +std::string formatBase64(const std::string &value) +{ + std::string res = value; + size_t len = res.size(); + for (size_t i = 0; i < len / 76; i++) { + res.insert(res.begin() + (i + 1) * 76 + i, '\n'); + } + return res; +} + +std::string formatVector(const std::vector<uint8_t> &value) +{ + std::string dst; + size_t dst_len = Base64EncodeGetRequiredLength(value.size()); + if (dst_len) { + dst.resize(dst_len); + Base64Encode(&value[0], value.size(), &dst[0], dst_len); + if (dst_len != dst.size()) + dst.resize(dst_len); + } + return formatBase64(dst); +} + +/** + * Property + */ + +Property::Property(Property *parent, const QString &name) + : parent_(NULL), name_(name), readOnly_(false) +{ + if (parent) + parent->addChild(this); +} + +Property::~Property() +{ + if (parent_) + parent_->removeChild(this); + clear(); + emit destroyed(this); +} + +void Property::clear() +{ + while (!children_.isEmpty()) { + QListIterator<Property *> it(children_); + Property *prop = it.next(); + delete prop; + } +} + +QWidget *Property::createEditor(QWidget * /*parent*/) +{ + return NULL; +} + +QString Property::valueText() const +{ + return QString(); +} + +void Property::setName(const QString &name) +{ + if (name_ == name) + return; + + name_ = name; + emit changed(this); +} + +void Property::setReadOnly(bool value) +{ + if (readOnly_ == value) + return; + + readOnly_ = value; + emit changed(this); +} + +void Property::addChild(Property *child) +{ + insertChild(childCount(), child); +} + +void Property::insertChild(int index, Property *child) +{ + if (child->parent()) + return; + + child->parent_ = this; + children_.insert(index, child); +} + +void Property::removeChild(Property *child) +{ + children_.removeOne(child); +} + +/** + * StringProperty + */ + +StringProperty::StringProperty(Property *parent, const QString &name, const QString &value) + : Property(parent, name), value_(value) +{ + +} + +QString StringProperty::valueText() const +{ + return value_; +} + +QWidget *StringProperty::createEditor(QWidget *parent) +{ + QLineEdit *editor = new LineEdit(parent); + editor->setFrame(false); + editor->setText(value_); + connect(editor, SIGNAL(textChanged(const QString &)), this, SLOT(editorChanged(const QString &))); + + return editor; +} + +void StringProperty::editorChanged(const QString &value) +{ + setValue(value); +} + +void StringProperty::setValue(const QString &value) +{ + if (value_ != value) { + value_ = value; + emit valueChanged(value); + emit changed(this); + } +} + +/** + * BoolProperty + */ + +BoolProperty::BoolProperty(Property *parent, const QString &name, bool value) + : Property(parent, name), value_(value) +{ + +} + +QString BoolProperty::valueText() const +{ + return value_ ? QString::fromUtf8(language[lsYes].c_str()) : QString::fromUtf8(language[lsNo].c_str()); +} + +QWidget *BoolProperty::createEditor(QWidget *parent) +{ + BoolEdit *editor = new BoolEdit(parent); + editor->setFrame(false); + editor->setChecked(value_); + + connect(editor, SIGNAL(toggled(bool)), this, SLOT(editorChanged(bool))); + + return editor; +} + +void BoolProperty::editorChanged(bool value) +{ + setValue(value); +} + +void BoolProperty::setValue(bool value) +{ + if (value_ != value) { + value_ = value; + emit valueChanged(value); + emit changed(this); + } +} + +/** + * DateProperty + */ + +DateProperty::DateProperty(Property *parent, const QString &name, const QDate &value) + : Property(parent, name), value_(value) +{ + +} + +QString DateProperty::valueText() const +{ + return value_.toString(Qt::SystemLocaleShortDate); +} + +QWidget *DateProperty::createEditor(QWidget *parent) +{ + QDateEdit *editor = new QDateEdit(parent); + editor->setFrame(false); + editor->setDate(value_); + connect(editor, SIGNAL(dateChanged(const QDate &)), this, SLOT(editorChanged(const QDate &))); + + return editor; +} + +void DateProperty::editorChanged(const QDate &value) +{ + setValue(value); +} + +void DateProperty::setValue(const QDate &value) +{ + if (value_ != value) { + value_ = value; + emit valueChanged(value); + emit changed(this); + } +} + +/** + * StringListProperty + */ + +StringListProperty::StringListProperty(Property *parent, const QString &name, const QString &value) + : StringProperty(parent, name, value) +{ + +} + +QWidget *StringListProperty::createEditor(QWidget *parent) +{ + StringListEdit *editor = new StringListEdit(parent); + editor->document()->setDocumentMargin(0); + editor->setFrameShape(QFrame::NoFrame); + editor->setPlainText(value()); + connect(editor, SIGNAL(textChanged(const QString &)), this, SLOT(editorChanged(const QString &))); + + return editor; +} + +/** + * HexProperty + */ + + /* +HexProperty::HexProperty(Property *parent, const QString &name, const QByteArray &value) + : Property(parent, name) +{ + edit_ = new QHexEdit(); + edit_->setFrameShape(QFrame::NoFrame); + edit_->setData(value); +} + +HexProperty::~HexProperty() +{ + delete edit_; +} + */ + +/** + * GroupProperty + */ + +GroupProperty::GroupProperty(Property *parent, const QString &name) + : Property(parent, name) +{ + +} + +/** + * CommandProperty + */ + +CommandProperty::CommandProperty(Property *parent, ICommand *value) + : Property(parent, QString::fromLatin1(value->display_address().c_str())), value_(value) +{ + text_ = QString::fromUtf8(value_->text().c_str()); +} + +QString CommandProperty::valueText() const +{ + return text_; +} + +bool CommandProperty::hasStaticText(int column) const +{ + if (!value_) + return false; + + if (column == 0) + return true; + + if (column == 1) + return (value_->comment().type > ttNone); + + return false; +} + +QString CommandProperty::staticText(int column) const +{ + if (!value_) + return QString(); + + if (column == 0) + return QString::fromLatin1(value_->dump_str().c_str()); + + if (column == 1) + return QString::fromUtf8(value_->comment().display_value().c_str()); + + return QString(); +} + +QColor CommandProperty::staticColor(int column) const +{ + if (!value_) + return QColor(); + + if (column == 0) + return Qt::gray; + + if (column == 1) { + switch (value_->comment().type) { + case ttFunction: case ttJmp: + return Qt::blue; + case ttImport: + return Qt::darkRed; + case ttExport: + return Qt::red; + case ttString: + return Qt::darkGreen; + case ttVariable: + return Qt::magenta; + case ttComment: + return Qt::gray; + } + } + return QColor(); +} + +/** + * EnumProperty + */ + +EnumProperty::EnumProperty(Property *parent, const QString &name, const QStringList &items, int value) + : Property(parent, name), items_(items), value_(value) +{ + +} + +void EnumProperty::setValue(int value) +{ + if (value_ != value) { + value_ = value; + emit valueChanged(value); + emit changed(this); + } +} + +void EnumProperty::editorChanged(int value) +{ + setValue(value); +} + +QString EnumProperty::valueText() const +{ + if (value_ >= 0 && value_ < items_.size()) + return items_[value_]; + return QString(); +} + +QWidget *EnumProperty::createEditor(QWidget *parent) +{ + EnumEdit *editor = new EnumEdit(parent, items_); + editor->setFrame(false); + editor->setCurrentIndex(value_); + + connect(editor, SIGNAL(currentIndexChanged(int)), this, SLOT(editorChanged(int))); + + return editor; +} + +/** + * CompilationTypeProperty + */ + +CompilationTypeProperty::CompilationTypeProperty(Property *parent, const QString &name, CompilationType value) + : Property(parent, name), value_(value), defaultValue_(ctNone) +{ + items_ << QString::fromUtf8(language[lsNone].c_str()); + items_ << QString::fromUtf8(language[lsVirtualization].c_str()); + items_ << QString::fromUtf8(language[lsMutation].c_str()); + items_ << QString("%1 (%2 + %3)").arg(QString::fromUtf8(language[lsUltra].c_str())).arg(QString::fromUtf8(language[lsMutation].c_str())).arg(QString::fromUtf8(language[lsVirtualization].c_str())); +} + +void CompilationTypeProperty::setValue(CompilationType value) +{ + if (value_ != value) { + value_ = value; + emit valueChanged(value); + emit changed(this); + } +} + +void CompilationTypeProperty::editorChanged(int value) +{ + CompilationType new_value = ctNone; + if (value > 0) { + if (defaultValue_ == ctNone) + new_value = static_cast<CompilationType>(value - 1); + else + new_value = (value == 1) ? defaultValue_ : ctNone; + } + + setValue(new_value); +} + +QString CompilationTypeProperty::valueText() const +{ + switch (value_) { + case ctNone: + return items_[0]; + case ctVirtualization: + return items_[1]; + case ctMutation: + return items_[2]; + case ctUltra: + return items_[3]; + } + + return QString(); +} + +QWidget *CompilationTypeProperty::createEditor(QWidget *parent) +{ + QStringList items; + items << items_[0]; + switch (defaultValue_) { + case ctNone: + items << items_[1]; + items << items_[2]; + items << items_[3]; + break; + case ctVirtualization: + items << items_[1]; + break; + case ctMutation: + items << items_[2]; + break; + case ctUltra: + items << items_[3]; + break; + } + + int index = 0; + if (defaultValue_ != ctNone) { + if (value_ == defaultValue_) + index = 1; + } else if (value_ != ctNone) { + index = value_ + 1; + } + + EnumEdit *editor = new EnumEdit(parent, items); + editor->setFrame(false); + editor->setCurrentIndex(index); + + connect(editor, SIGNAL(currentIndexChanged(int)), this, SLOT(editorChanged(int))); + + return editor; +} + +/** + * FileNameProperty + */ + +FileNameProperty::FileNameProperty(Property *parent, const QString &name, const QString &filter, const QString &value, bool saveMode) + : Property(parent, name), filter_(filter), value_(value), saveMode_(saveMode) +{ + +} + +QString FileNameProperty::valueText() const +{ + return value_; +} + +QWidget *FileNameProperty::createEditor(QWidget *parent) +{ + FileNameEdit *editor = new FileNameEdit(parent); + editor->setFrame(false); + editor->setFilter(filter_); + editor->setRelativePath(relativePath_); + editor->setText(value_); + editor->setSaveMode(saveMode_); + connect(editor, SIGNAL(textChanged(const QString &)), this, SLOT(editorChanged(const QString &))); + + return editor; +} + +void FileNameProperty::editorChanged(const QString &value) +{ + setValue(value); +} + +void FileNameProperty::setValue(const QString &value) +{ + if (value_ != value) { + value_ = value; + emit valueChanged(value); + emit changed(this); + } +} + +/** + * FileNameProperty + */ + +WatermarkProperty::WatermarkProperty(Property *parent, const QString &name, const QString &value) + : Property(parent, name), value_(value) +{ + +} + +QString WatermarkProperty::valueText() const +{ + return value_; +} + +QWidget *WatermarkProperty::createEditor(QWidget *parent) +{ + WatermarkEdit *editor = new WatermarkEdit(parent); + editor->setFrame(false); + editor->setText(value_); + connect(editor, SIGNAL(textChanged(const QString &)), this, SLOT(editorChanged(const QString &))); + + return editor; +} + +void WatermarkProperty::editorChanged(const QString &value) +{ + setValue(value); +} + +void WatermarkProperty::setValue(const QString &value) +{ + if (value_ != value) { + value_ = value; + emit valueChanged(value); + emit changed(this); + } +} + +/** + * PropertyManager + */ + +PropertyManager::PropertyManager(QObject *parent) + : QAbstractItemModel(parent) +{ + root_ = new GroupProperty(NULL, ""); +} + +PropertyManager::~PropertyManager() +{ + delete root_; +} + +QModelIndex PropertyManager::index(int row, int column, const QModelIndex &parent) const +{ + //if (parent.isValid() && parent.column() != 0) + // return QModelIndex(); + + Property *parentProp = indexToProperty(parent); + Property *childProp = parentProp->children().value(row); + if (!childProp) + return QModelIndex(); + + return createIndex(row, column, childProp); +} + +QModelIndex PropertyManager::parent(const QModelIndex &index) const +{ + if (!index.isValid()) + return QModelIndex(); + + Property *childProp = indexToProperty(index); + Property *parentProp = childProp->parent(); + if (parentProp == root_) + return QModelIndex(); + + return createIndex(parentProp->parent()->children().indexOf(parentProp), 0, parentProp); +} + +int PropertyManager::columnCount(const QModelIndex & /* parent */) const +{ + return 2; +} + +int PropertyManager::rowCount(const QModelIndex &parent) const +{ + Property *parentProp = indexToProperty(parent); + return parentProp->childCount(); +} + +QVariant PropertyManager::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + Property *prop = indexToProperty(index); + switch (role) { + case Qt::DisplayRole: + if (index.column() == 0) { + return prop->name(); + } else if (index.column() == 1) { + return prop->valueText(); + } + break; + case Qt::DecorationRole: + if (CommandProperty *c = qobject_cast<CommandProperty *>(prop)) { + if (index.column() == 0) { + ICommand *command = c->value(); + IFunction *func = command->owner(); + if (qobject_cast<CommandProperty *>(c->parent())) { + return QIcon(":/images/reference.png"); + } else if (func->ext_command_list()->GetCommandByAddress(command->address())) { + return QIcon(":/images/link.png"); + } else if (func->is_breaked_address(command->address())) { + return QIcon(":/images/disabled.png"); + } + QIcon res; + QPixmap pixmap(18, 1); + pixmap.fill(Qt::transparent); + res.addPixmap(pixmap); + return res; + } + } + break; + case Qt::TextColorRole: + if (prop->readOnly() && index.column() == 1) { + QPalette palette; + return palette.color(QPalette::Disabled, QPalette::Text); + } + break; + case Qt::FontRole: + if (!prop->readOnly() && index.column() == 1) { + QFont font; + font.setBold(true); + return font; + } + break; + case Qt::Vmp::StaticTextRole: + if (prop->hasStaticText(index.column())) + return prop->staticText(index.column()); + break; + case Qt::Vmp::StaticColorRole: + if (prop->hasStaticText(index.column())) + return prop->staticColor(index.column()); + break; + } + + return QVariant(); +} + +QVariant PropertyManager::headerData(int section, Qt::Orientation /*orientation*/, int role) const +{ + if (role == Qt::DisplayRole) { + if (section == 0) { + return QString::fromUtf8(language[lsName].c_str()); + } else { + return QString::fromUtf8(language[lsValue].c_str()); + } + } + return QVariant(); +} + +void PropertyManager::clear() +{ + root_->clear(); +} + +BoolProperty *PropertyManager::addBoolProperty(Property *parent, const QString &name, bool value) +{ + BoolProperty *prop = new BoolProperty(parent ? parent : root_, name, value); + addProperty(prop); + return prop; +} + +StringProperty *PropertyManager::addStringProperty(Property *parent, const QString &name, const QString &value) +{ + StringProperty *prop = new StringProperty(parent ? parent : root_, name, value); + addProperty(prop); + return prop; +} + +DateProperty *PropertyManager::addDateProperty(Property *parent, const QString &name, const QDate &value) +{ + DateProperty *prop = new DateProperty(parent ? parent : root_, name, value); + addProperty(prop); + return prop; +} + +StringListProperty *PropertyManager::addStringListProperty(Property *parent, const QString &name, const QString &value) +{ + StringListProperty *prop = new StringListProperty(parent ? parent : root_, name, value); + addProperty(prop); + return prop; +} + +GroupProperty *PropertyManager::addGroupProperty(Property *parent, const QString &name) +{ + GroupProperty *prop = new GroupProperty(parent ? parent : root_, name); + addProperty(prop); + return prop; +} + +EnumProperty *PropertyManager::addEnumProperty(Property *parent, const QString &name, const QStringList &items, int value) +{ + EnumProperty *prop = new EnumProperty(parent ? parent : root_, name, items, value); + addProperty(prop); + return prop; +} + +FileNameProperty *PropertyManager::addFileNameProperty(Property *parent, const QString &name, const QString &filter, const QString &value, bool saveMode) +{ + FileNameProperty *prop = new FileNameProperty(parent ? parent : root_, name, filter, value, saveMode); + addProperty(prop); + return prop; +} + +CommandProperty *PropertyManager::addCommandProperty(Property *parent, ICommand *value) +{ + CommandProperty *prop = new CommandProperty(parent ? parent : root_, value); + addProperty(prop); + return prop; +} + +WatermarkProperty *PropertyManager::addWatermarkProperty(Property *parent, const QString &name, const QString &value) +{ + WatermarkProperty *prop = new WatermarkProperty(parent ? parent : root_, name, value); + addProperty(prop); + return prop; +} + +CompilationTypeProperty *PropertyManager::addCompilationTypeProperty(Property *parent, const QString &name, CompilationType value) +{ + CompilationTypeProperty *prop = new CompilationTypeProperty(parent ? parent : root_, name, value); + addProperty(prop); + return prop; +} + +void PropertyManager::addProperty(Property *prop) +{ + if (!prop) + return; + + connect(prop, SIGNAL(destroyed(Property *)), this, SLOT(slotPropertyDestroyed(Property *))); + connect(prop, SIGNAL(changed(Property *)), this, SLOT(slotPropertyChanged(Property *))); +} + +Property *PropertyManager::indexToProperty(const QModelIndex &index) const +{ + if (index.isValid()) + return static_cast<Property *>(index.internalPointer()); + return root_; +} + +QModelIndex PropertyManager::propertyToIndex(Property *prop) const +{ + if (!prop) + return QModelIndex(); + + return createIndex(prop->parent()->children().indexOf(prop), 0, prop); +} + +void PropertyManager::slotPropertyChanged(Property *prop) +{ + QModelIndex index = propertyToIndex(prop); + emit dataChanged(index, index.sibling(index.row(), 1)); +} + +void PropertyManager::slotPropertyDestroyed(Property * /*prop*/) +{ + // +} + +Qt::ItemFlags PropertyManager::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return 0; + + Qt::ItemFlags res = Qt::ItemIsEnabled | Qt::ItemIsSelectable; + Property *prop = indexToProperty(index); + if (prop && prop->hasValue() && !prop->readOnly()) + res |= Qt::ItemIsEditable; + return res; +} + +/** + * PropertyEditorDelegate + */ + +PropertyEditorDelegate::PropertyEditorDelegate(QObject *parent) + : TreeViewItemDelegate(parent) +{ + +} + +Property *PropertyEditorDelegate::indexToProperty(const QModelIndex &index) const +{ + return static_cast<Property *>(index.internalPointer()); +} + +QWidget *PropertyEditorDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem &, const QModelIndex &index) const +{ + if (index.column() != 1) + return NULL; + + Property *prop = indexToProperty(index); + if (!prop) + return NULL; + + QWidget *editor = prop->createEditor(parent); + if (editor) { + QWidget *corrBearing = dynamic_cast<QLineEdit *>(editor); + editor->setObjectName("editor"); + editor->setAutoFillBackground(true); + QVariant value = index.data(Qt::FontRole); + if (value.isValid() && value.canConvert<QFont>()) + editor->setFont(qvariant_cast<QFont>(value)); + if (QComboBox *c = qobject_cast<QComboBox *>(editor)) { + c->lineEdit()->selectAll(); + corrBearing = c; + } else if (QPlainTextEdit *c = qobject_cast<QPlainTextEdit *>(editor)) { + c->selectAll(); + } + if(corrBearing) + { + corrBearing->setProperty("corrBearing", +#ifdef __APPLE__ + false +#else + true +#endif + ); + corrBearing->style()->unpolish(corrBearing); + corrBearing->style()->polish(corrBearing); + corrBearing->update(); + } + } + return editor; +} + +void PropertyEditorDelegate::setEditorData(QWidget * /*widget*/, const QModelIndex &) const +{ + //do nothing +} + +/** + * TreePropertyEditor + */ + +TreePropertyEditor::TreePropertyEditor(QWidget *parent) + : TreeView(parent) +{ + setObjectName("grid"); + setIconSize(QSize(18, 18)); + setFrameShape(QFrame::NoFrame); + setItemDelegate(new PropertyEditorDelegate(this)); +} + +Property *TreePropertyEditor::indexToProperty(const QModelIndex &index) const +{ + return static_cast<Property *>(index.internalPointer()); +} + +void TreePropertyEditor::keyPressEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Return: + case Qt::Key_Enter: + case Qt::Key_Space: // Trigger Edit + { + QModelIndex index = currentIndex(); + if ((index.flags() & (Qt::ItemIsEditable | Qt::ItemIsEnabled)) == (Qt::ItemIsEditable | Qt::ItemIsEnabled)) { + event->accept(); + // If the current position is at column 0, move to 1. + if (index.column() == 0) { + index = index.sibling(index.row(), 1); + setCurrentIndex(index); + } + edit(index); + return; + } + } + break; + default: + break; + } + + TreeView::keyPressEvent(event); +} + +void TreePropertyEditor::mousePressEvent(QMouseEvent *event) +{ + QTreeView::mousePressEvent(event); + QModelIndex index = indexAt(event->pos()); + + if (index.isValid()) { + Property *prop = indexToProperty(index); + if ((event->button() == Qt::LeftButton) && (index.column() == 1) && ((index.flags() & (Qt::ItemIsEditable | Qt::ItemIsEnabled)) == (Qt::ItemIsEditable | Qt::ItemIsEnabled))) { + edit(index); + } else if (!rootIsDecorated() && prop->childCount()) { + QRect rect = visualRect(index); + if (event->pos().x() >= rect.left() && event->pos().x() <= rect.left() + 20) + setExpanded(index, !isExpanded(index)); + } + } +} + +void TreePropertyEditor::dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight, const QVector<int> &roles /*= QVector<int>()*/) +{ + QRect rect = visualRect(topLeft); + QTreeView::dataChanged(topLeft, bottomRight, roles); + if (topLeft.row() == bottomRight.row() && topLeft.isValid()) { + if (rect != visualRect(bottomRight)) + updateEditorGeometries(); + } +} + +/** + * LicensePropertyManager + */ + +LicensePropertyManager::LicensePropertyManager(QObject *parent) + : PropertyManager(parent), value_(NULL), lock_(false) +{ + details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); + licenseName_ = addStringProperty(details_, QString::fromUtf8(language[lsCustomerName].c_str()), QString()); + licenseEmail_ = addStringProperty(details_, QString::fromUtf8(language[lsEmail].c_str()), QString()); + licenseDate_ = addDateProperty(details_, QString::fromUtf8(language[lsDate].c_str()), QDate()); + licenseOrder_ = addStringProperty(details_, QString::fromUtf8(language[lsOrderRef].c_str()), QString()); + licenseComments_ = addStringListProperty(details_, QString::fromUtf8(language[lsComments].c_str()), QString()); + licenseBlocked_ = addBoolProperty(details_, QString::fromUtf8(language[lsBlocked].c_str()), false); + licenseSerialNumber_ = addStringProperty(details_, QString::fromUtf8(language[lsSerialNumber].c_str()), QString()); + licenseSerialNumber_->setReadOnly(true); + + contents_ = addGroupProperty(NULL, QString::fromUtf8(language[lsSerialNumberContents].c_str())); + serialName_ = addStringProperty(contents_, QString::fromUtf8(language[lsCustomerName].c_str()), QString()); + serialName_->setReadOnly(true); + serialEmail_ = addStringProperty(contents_, QString::fromUtf8(language[lsEmail].c_str()), QString()); + serialEmail_->setReadOnly(true); + serialHWID_ = addStringProperty(contents_, QString::fromUtf8(language[lsHardwareID].c_str()), QString()); + serialHWID_->setReadOnly(true); + serialExpirationDate_ = addDateProperty(contents_, QString::fromUtf8(language[lsExpirationDate].c_str()), QDate()); + serialExpirationDate_->setReadOnly(true); + serialTimeLimit_ = addStringProperty(contents_, QString::fromUtf8(language[lsRunningTimeLimit].c_str()), QString()); + serialTimeLimit_->setReadOnly(true); + serialMaxBuildDate_ = addDateProperty(contents_, QString::fromUtf8(language[lsMaxBuildDate].c_str()), QDate()); + serialMaxBuildDate_->setReadOnly(true); + serialUserData_ = addStringProperty(contents_, QString::fromUtf8(language[lsUserData].c_str()), QString()); + serialUserData_->setReadOnly(true); + + connect(licenseName_, SIGNAL(valueChanged(const QString &)), this, SLOT(nameChanged(const QString &))); + connect(licenseEmail_, SIGNAL(valueChanged(const QString &)), this, SLOT(emailChanged(const QString &))); + connect(licenseDate_, SIGNAL(valueChanged(const QDate &)), this, SLOT(dateChanged(const QDate &))); + connect(licenseOrder_, SIGNAL(valueChanged(const QString &)), this, SLOT(orderChanged(const QString &))); + connect(licenseComments_, SIGNAL(valueChanged(const QString &)), this, SLOT(commentsChanged(const QString &))); + connect(licenseBlocked_, SIGNAL(valueChanged(bool)), this, SLOT(blockedChanged(bool))); + + localize(); +} + +void LicensePropertyManager::localize() +{ + details_->setName(QString::fromUtf8(language[lsDetails].c_str())); + licenseName_->setName(QString::fromUtf8(language[lsCustomerName].c_str())); + licenseEmail_->setName(QString::fromUtf8(language[lsEmail].c_str())); + licenseDate_->setName(QString::fromUtf8(language[lsDate].c_str())); + licenseComments_->setName(QString::fromUtf8(language[lsComments].c_str())); + licenseOrder_->setName(QString::fromUtf8(language[lsOrderRef].c_str())); + licenseBlocked_->setName(QString::fromUtf8(language[lsBlocked].c_str())); + licenseSerialNumber_->setName(QString::fromUtf8(language[lsSerialNumber].c_str())); + + contents_->setName(QString::fromUtf8(language[lsSerialNumberContents].c_str())); + serialName_->setName(QString::fromUtf8(language[lsCustomerName].c_str())); + serialEmail_->setName(QString::fromUtf8(language[lsEmail].c_str())); + serialHWID_->setName(QString::fromUtf8(language[lsHardwareID].c_str())); + serialExpirationDate_->setName(QString::fromUtf8(language[lsExpirationDate].c_str())); + serialTimeLimit_->setName(QString::fromUtf8(language[lsRunningTimeLimit].c_str())); + serialMaxBuildDate_->setName(QString::fromUtf8(language[lsMaxBuildDate].c_str())); + serialUserData_->setName(QString::fromUtf8(language[lsUserData].c_str())); +} + +QVariant LicensePropertyManager::data(const QModelIndex &index, int role) const +{ + Property *prop = indexToProperty(index); + if (role == Qt::FontRole) { + if (index.column() == 1 && (prop == licenseSerialNumber_ || prop == serialUserData_)) + return QFont(MONOSPACE_FONT_FAMILY); + } + + return PropertyManager::data(index, role); +} + +void LicensePropertyManager::nameChanged(const QString &value) +{ + if (!value_ || lock_) + return; + +#ifdef ULTIMATE + value_->set_customer_name(value.toUtf8().constData()); +#endif +} + +void LicensePropertyManager::emailChanged(const QString &value) +{ + if (!value_ || lock_) + return; + +#ifdef ULTIMATE + value_->set_customer_email(value.toUtf8().constData()); +#endif +} + +void LicensePropertyManager::orderChanged(const QString &value) +{ + if (!value_ || lock_) + return; + +#ifdef ULTIMATE + value_->set_order_ref(value.toUtf8().constData()); +#endif +} + +void LicensePropertyManager::dateChanged(const QDate &value) +{ + if (!value_ || lock_) + return; + +#ifdef ULTIMATE + value_->set_date(LicenseDate(value.year(), value.month(), value.day())); +#endif +} + +void LicensePropertyManager::commentsChanged(const QString &value) +{ + if (!value_ || lock_) + return; + +#ifdef ULTIMATE + value_->set_comments(value.toUtf8().constData()); +#endif +} + +void LicensePropertyManager::blockedChanged(bool value) +{ + if (!value_ || lock_) + return; + +#ifdef ULTIMATE + value_->set_blocked(value); +#endif +} + +void LicensePropertyManager::setValue(License *value) +{ + value_ = value; + update(); +} + +void LicensePropertyManager::update() +{ +#ifdef ULTIMATE + lock_ = true; + + licenseName_->setValue(value_ ? QString::fromUtf8(value_->customer_name().c_str()) : QString()); + licenseEmail_->setValue(value_ ? QString::fromUtf8(value_->customer_email().c_str()) : QString()); + licenseDate_->setValue(value_ ? QDate(value_->date().Year, value_->date().Month, value_->date().Day) : QDate()); + licenseOrder_->setValue(value_ ? QString::fromUtf8(value_->order_ref().c_str()) : QString()); + licenseComments_->setValue(value_ ? QString::fromUtf8(value_->comments().c_str()) : QString()); + licenseBlocked_->setValue(value_ ? value_->blocked() : false); + licenseSerialNumber_->setValue(value_ ? QString::fromLatin1(formatBase64(value_->serial_number()).c_str()) : QString()); + + LicenseInfo *license_info = value_ ? value_->info() : NULL; + serialName_->setValue(license_info && (license_info->Flags & HAS_USER_NAME) ? QString::fromUtf8(license_info->CustomerName.c_str()) : QString()); + serialEmail_->setValue(license_info && (license_info->Flags & HAS_EMAIL) ? QString::fromUtf8(license_info->CustomerEmail.c_str()) : QString()); + serialHWID_->setValue(license_info && (license_info->Flags & HAS_HARDWARE_ID) ? QString::fromLatin1(license_info->HWID.c_str()) : QString()); + serialTimeLimit_->setValue(license_info && (license_info->Flags & HAS_TIME_LIMIT) ? QString::number(license_info->RunningTimeLimit) : QString()); + serialExpirationDate_->setValue(license_info && (license_info->Flags & HAS_EXP_DATE) ? QDate(license_info->ExpireDate.Year, license_info->ExpireDate.Month, license_info->ExpireDate.Day) : QDate()); + serialMaxBuildDate_->setValue(license_info && (license_info->Flags & HAS_MAX_BUILD_DATE) ? QDate(license_info->MaxBuildDate.Year, license_info->MaxBuildDate.Month, license_info->MaxBuildDate.Day) : QDate()); + QString userData; + if (license_info && license_info->Flags & HAS_USER_DATA) { + int bytes = 16; + for (size_t line = 0; line <= license_info->UserData.size() / bytes; line++) { + QString hex; + QString text; + for (int i = 0; i < bytes; i++) { + size_t pos = line * bytes + i; + if (pos < license_info->UserData.size()) { + uint8_t value = static_cast<uint8_t>(license_info->UserData[pos]); + hex.append(QString("%1 ").arg(value, 2, 16, QChar('0'))); + QChar qc(value); + if (qc.unicode() >= 127 || !qc.isPrint()) + qc = 0xB7; + text += qc; + } else { + if (i == 0) + break; + hex.append(" "); + text.append(" "); + } + } + if (!hex.isEmpty()) { + if (!userData.isEmpty()) + userData.append('\n'); + userData.append(QString("%1 ").arg(line * bytes, 4, 16, QChar('0'))).append(hex).append(text); + } + } + } + serialUserData_->setValue(userData); + + if (serialHWID_->childCount()) { + beginRemoveRows(propertyToIndex(serialHWID_), 0, serialHWID_->childCount()); + serialHWID_->clear(); + endRemoveRows(); + } + if (license_info && (license_info->Flags & HAS_HARDWARE_ID) && !license_info->HWID.empty()) { + size_t len = license_info->HWID.size(); + uint8_t *hwid = new uint8_t[len]; + Base64Decode(license_info->HWID.c_str(), license_info->HWID.size(), hwid, len); + beginInsertRows(propertyToIndex(serialHWID_), 0, (int)(len / 4)); + for (size_t i = 0; i < len; i += 4) { + uint32_t value = *reinterpret_cast<uint32_t *>(&hwid[i]); + QString name; + switch (value & 3) { + case 0: + name = QString::fromUtf8(language[lsCPU].c_str()); + break; + case 1: + name = QString::fromUtf8(language[lsHost].c_str()); + break; + case 2: + name = QString::fromUtf8(language[lsEthernet].c_str()); + break; + case 3: + name = QString::fromUtf8(language[lsHDD].c_str()); + break; + } + StringProperty *prop = addStringProperty(serialHWID_, name, QString("%1").arg(value & ~3, 8, 16, QChar('0')).toUpper()); + prop->setReadOnly(true); + } + delete [] hwid; + endInsertRows(); + } + + lock_ = false; +#endif +} + +/** + * FilePropertyManager + */ + +InternalFilePropertyManager::InternalFilePropertyManager(QObject *parent) + : PropertyManager(parent), value_(NULL), lock_(false) +{ + details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); + name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); + fileName_ = addFileNameProperty(details_, QString::fromUtf8(language[lsFileName].c_str()), QString( +#ifdef VMP_GNU + "%1 (*)" +#else + "%1 (*.*)" +#endif + ).arg(QString::fromUtf8(language[lsAllFiles].c_str())), QString()); + + action_ = addEnumProperty(details_, QString::fromUtf8(language[lsAction].c_str()), QStringList() << QString::fromUtf8(language[lsNo].c_str()) + << QString::fromUtf8(language[lsLoadAtStart].c_str()) << QString::fromUtf8(language[lsRegisterCOMServer].c_str()) << QString::fromUtf8(language[lsInstallCOMServer].c_str()), 0); + + connect(name_, SIGNAL(valueChanged(const QString &)), this, SLOT(nameChanged(const QString &))); + connect(fileName_, SIGNAL(valueChanged(const QString &)), this, SLOT(fileNameChanged(const QString &))); + connect(action_, SIGNAL(valueChanged(int)), this, SLOT(actionChanged(int))); +} + +void InternalFilePropertyManager::localize() +{ + details_->setName(QString::fromUtf8(language[lsDetails].c_str())); + name_->setName(QString::fromUtf8(language[lsName].c_str())); + fileName_->setName(QString::fromUtf8(language[lsFileName].c_str())); + fileName_->setFilter(QString( +#ifdef VMP_GNU + "%1 (*)" +#else + "%1 (*.*)" +#endif + ).arg(QString::fromUtf8(language[lsAllFiles].c_str()))); + action_->setName(QString::fromUtf8(language[lsAction].c_str())); + action_->setText(0, QString::fromUtf8(language[lsNo].c_str())); + action_->setText(1, QString::fromUtf8(language[lsLoadAtStart].c_str())); + action_->setText(2, QString::fromUtf8(language[lsRegisterCOMServer].c_str())); + action_->setText(3, QString::fromUtf8(language[lsInstallCOMServer].c_str())); +} + +void InternalFilePropertyManager::nameChanged(const QString &value) +{ + if (!value_ || lock_) + return; + +#ifdef ULTIMATE + value_->set_name(value.toUtf8().constData()); +#endif +} + +void InternalFilePropertyManager::fileNameChanged(const QString &value) +{ + if (!value_ || lock_) + return; + +#ifdef ULTIMATE + value_->set_file_name(value.toUtf8().constData()); +#endif +} + +void InternalFilePropertyManager::actionChanged(int value) +{ + if (!value_ || lock_) + return; + +#ifdef ULTIMATE + value_->set_action(static_cast<InternalFileAction>(value)); +#endif +} + +void InternalFilePropertyManager::setValue(InternalFile *value) +{ + value_ = value; + +#ifdef ULTIMATE + fileName_->setRelativePath(value_ ? QString::fromUtf8(value_->owner()->owner()->project_path().c_str()) : QString()); + update(); +#endif +} + +void InternalFilePropertyManager::update() +{ +#ifdef ULTIMATE + lock_ = true; + + name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); + fileName_->setValue(value_ ? QString::fromUtf8(value_->file_name().c_str()) : QString()); + int i = 0; + if (value_) { + switch (value_->action()) { + case faLoad: + i = 1; + break; + case faRegister: + i = 2; + break; + case faInstall: + i = 3; + break; + } + } + action_->setValue(value_ ? i : 0); + + lock_ = false; +#endif +} + +/** +* AssemblyPropertyManager +*/ + +AssemblyPropertyManager::AssemblyPropertyManager(QObject *parent) + : PropertyManager(parent), value_(NULL), lock_(false) +{ + details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); + name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); + fileName_ = addFileNameProperty(details_, QString::fromUtf8(language[lsFileName].c_str()), + QString("%1 (*.dll);;%2 (*.*)").arg(QString::fromUtf8(language[lsAssemblies].c_str())).arg(QString::fromUtf8(language[lsAllFiles].c_str())), QString()); + + connect(name_, SIGNAL(valueChanged(const QString &)), this, SLOT(nameChanged(const QString &))); + connect(fileName_, SIGNAL(valueChanged(const QString &)), this, SLOT(fileNameChanged(const QString &))); +} + +void AssemblyPropertyManager::localize() +{ + details_->setName(QString::fromUtf8(language[lsDetails].c_str())); + name_->setName(QString::fromUtf8(language[lsName].c_str())); + fileName_->setName(QString::fromUtf8(language[lsFileName].c_str())); + fileName_->setFilter(QString("%1 (*.dll);;%2 (*.*)").arg(QString::fromUtf8(language[lsAssemblies].c_str())).arg(QString::fromUtf8(language[lsAllFiles].c_str()))); +} + +void AssemblyPropertyManager::nameChanged(const QString &value) +{ + if (!value_ || lock_) + return; + +#ifdef ULTIMATE + value_->set_name(value.toUtf8().constData()); +#endif +} + +void AssemblyPropertyManager::fileNameChanged(const QString &value) +{ + if (!value_ || lock_) + return; + +#ifdef ULTIMATE + value_->set_file_name(value.toUtf8().constData()); +#endif +} + +void AssemblyPropertyManager::setValue(InternalFile *value) +{ + value_ = value; + +#ifdef ULTIMATE + fileName_->setRelativePath(value_ ? QString::fromUtf8(value_->owner()->owner()->project_path().c_str()) : QString()); + update(); +#endif +} + +void AssemblyPropertyManager::update() +{ +#ifdef ULTIMATE + lock_ = true; + + name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); + fileName_->setValue(value_ ? QString::fromUtf8(value_->file_name().c_str()) : QString()); + + lock_ = false; +#endif +} + +/** + * FunctionPropertyManager + */ + +FunctionPropertyManager::FunctionPropertyManager(QObject *parent) + : PropertyManager(parent), value_(NULL), lock_(false) +{ + protection_ = addGroupProperty(NULL, QString::fromUtf8(language[lsProtection].c_str())); + compilationType_ = addCompilationTypeProperty(protection_, QString::fromUtf8(language[lsCompilationType].c_str()), ctNone); + lockToKey_ = addBoolProperty(protection_, QString::fromUtf8(language[lsLockToSerialNumber].c_str()), false); + + details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); + type_ = addStringProperty(details_, QString::fromUtf8(language[lsType].c_str()), QString()); + type_->setReadOnly(true); + name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); + name_->setReadOnly(true); + address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); + address_->setReadOnly(true); + + connect(compilationType_, SIGNAL(valueChanged(CompilationType)), this, SLOT(compilationTypeChanged(CompilationType))); + connect(lockToKey_, SIGNAL(valueChanged(bool)), this, SLOT(lockToKeyChanged(bool))); +} + +void FunctionPropertyManager::localize() +{ + protection_->setName(QString::fromUtf8(language[lsProtection].c_str())); + compilationType_->setName(QString::fromUtf8(language[lsCompilationType].c_str())); + compilationType_->setText(0, QString::fromUtf8(language[lsNone].c_str())); + compilationType_->setText(1, QString::fromUtf8(language[lsVirtualization].c_str())); + compilationType_->setText(2, QString::fromUtf8(language[lsMutation].c_str())); + compilationType_->setText(3, QString("%1 (%2 + %3)").arg(QString::fromUtf8(language[lsUltra].c_str())).arg(QString::fromUtf8(language[lsMutation].c_str())).arg(QString::fromUtf8(language[lsVirtualization].c_str()))); + compilationType_->setToolTip(QString::fromUtf8(language[lsCompilationTypeHelp].c_str())); + + lockToKey_->setName(QString::fromUtf8(language[lsLockToSerialNumber].c_str())); + lockToKey_->setToolTip(QString::fromUtf8(language[lsLockToSerialNumberHelp].c_str())); + + details_->setName(QString::fromUtf8(language[lsDetails].c_str())); + type_->setName(QString::fromUtf8(language[lsType].c_str())); + name_->setName(QString::fromUtf8(language[lsName].c_str())); + address_->setName(QString::fromUtf8(language[lsAddress].c_str())); + + if (value_) { + for (QMap<IArchitecture *, ArchInfo>::const_iterator arch = map_.begin(); arch != map_.end(); arch++) { + QString str = QString::fromUtf8(language[lsCode].c_str()); + if (value_->show_arch_name()) + str.append(" ").append(QString::fromLatin1(arch.key()->name().c_str())); + arch.value().code->setName(str); + } + update(); + } +} + +QVariant FunctionPropertyManager::data(const QModelIndex &index, int role) const +{ + Property *prop = indexToProperty(index); + if (role == Qt::FontRole) { + if (qobject_cast<CommandProperty*>(prop)) + return QFont(MONOSPACE_FONT_FAMILY); + } + + return PropertyManager::data(index, role); +} + +void FunctionPropertyManager::setValue(FunctionBundle *value) +{ + if (value_ == value) + return; + + value_ = value; + + for (QMap<IArchitecture *, ArchInfo>::iterator arch = map_.begin(); arch != map_.end(); arch++) { + Property *code = arch.value().code; + if (code->childCount()) { + beginRemoveRows(propertyToIndex(code), 0, code->childCount()); + code->clear(); + endRemoveRows(); + } + arch.value().map.clear(); + } + + if (value_) { + for (size_t i = 0; i < value_->count(); i++) { + internalAddFunction(value_->item(i)->func()); + } + } else { + for (QMap<IArchitecture *, ArchInfo>::const_iterator arch = map_.begin(); arch != map_.end(); arch++) { + Property *code = arch.value().code; + int index = code->parent()->children().indexOf(code); + beginRemoveRows(propertyToIndex(code->parent()), index, index + 1); + delete code; + endRemoveRows(); + } + map_.clear(); + } + + update(); +} + +void FunctionPropertyManager::addFunction(IFunction *func) +{ + if (internalAddFunction(func)) + update(); +} + +void FunctionPropertyManager::createCommands(IFunction *func, Property *code) +{ + size_t i; + QMap<uint64_t, QList<ICommand*> > references; + + for (i = 0; i < func->link_list()->count(); i++) { + CommandLink *link = func->link_list()->item(i); + if (link->to_address()) { + QMap<uint64_t, QList<ICommand*> >::iterator it = references.find(link->to_address()); + if (it == references.end()) + it = references.insert(link->to_address(), QList<ICommand*>() << link->from_command()); + else + it.value().push_back(link->from_command()); + } + } + + beginInsertRows(propertyToIndex(code), 0, (int)func->count()); + for (i = 0; i < func->count(); i++) { + ICommand *command = func->item(i); + Property *prop = addCommandProperty(code, command); + prop->setReadOnly(true); + + QMap<uint64_t, QList<ICommand*> >::ConstIterator it = references.find(command->address()); + if (it != references.end()) { + for (int j = 0; j < it.value().size(); j++) { + Property *link_prop = addCommandProperty(prop, it.value().at(j)); + link_prop->setReadOnly(true); + } + } + } + endInsertRows(); +} + +bool FunctionPropertyManager::internalAddFunction(IFunction *func) +{ + if (!value_) + return false; + + FunctionArch *func_arch = value_->GetArchByFunction(func); + if (!func_arch) + return false; + + QMap<IArchitecture *, ArchInfo>::iterator arch = map_.find(func_arch->arch()); + if (arch == map_.end()) { + beginInsertRows(propertyToIndex(details_), details_->childCount(), details_->childCount() + 1); + QString str = QString::fromUtf8(language[lsCode].c_str()); + if (value_->show_arch_name()) + str.append(" ").append(QString::fromLatin1(func_arch->arch()->name().c_str())); + ArchInfo info; + info.code = addStringProperty(details_, str, QString()); + info.code->setReadOnly(true); + endInsertRows(); + arch = map_.insert(func_arch->arch(), info); + } + QMap<IFunction *, StringProperty *>::const_iterator it = arch.value().map.find(func); + if (it == arch.value().map.end()) { + StringProperty *code = arch.value().code; + if (!arch.value().map.empty()) { + if (arch.value().map.size() == 1) { + QMap<IFunction *, StringProperty *>::iterator tmp = arch.value().map.begin(); + if (tmp.value() == code) { + beginRemoveRows(propertyToIndex(code), 0, code->childCount()); + code->clear(); + endRemoveRows(); + + beginInsertRows(propertyToIndex(code), code->childCount(), code->childCount() + 1); + StringProperty *newCode = addStringProperty(code, QString::fromLatin1(tmp.key()->display_address("").c_str()), QString()); + newCode->setReadOnly(true); + endInsertRows(); + tmp.value() = newCode; + + createCommands(tmp.key(), newCode); + } + } + beginInsertRows(propertyToIndex(code), code->childCount(), code->childCount() + 1); + code = addStringProperty(code, QString::fromLatin1(func->display_address("").c_str()), QString()); + code->setReadOnly(true); + endInsertRows(); + } + it = arch.value().map.insert(func, code); + } + createCommands(func, it.value()); + + return true; +} + +void FunctionPropertyManager::updateFunction(IFunction *func) +{ + if (value_ && value_->GetArchByFunction(func)) + update(); +} + +bool FunctionPropertyManager::removeFunction(IFunction *func) +{ + if (internalRemoveFunction(func)) { + update(); + return true; + } + return false; +} + +bool FunctionPropertyManager::internalRemoveFunction(IFunction *func) +{ + if (!value_) + return false; + + FunctionArch *func_arch = value_->GetArchByFunction(func); + if (!func_arch) + return false; + + QMap<IArchitecture *, ArchInfo>::iterator arch = map_.find(func_arch->arch()); + if (arch != map_.end()) { + QMap<IFunction *, StringProperty *>::iterator it = arch.value().map.find(func); + if (it != arch.value().map.end()) { + StringProperty *code = it.value(); + if (code == arch.value().code) { + beginRemoveRows(propertyToIndex(code), 0, code->childCount()); + code->clear(); + endRemoveRows(); + } else { + int index = code->parent()->children().indexOf(code); + beginRemoveRows(propertyToIndex(code->parent()), index, index + 1); + delete code; + endRemoveRows(); + } + arch.value().map.erase(it); + } + } + + return true; +} + +void FunctionPropertyManager::update() +{ + lock_ = true; + + name_->setValue(value_ ? QString::fromUtf8(value_->display_name().c_str()) : QString()); + + QString str; + if (value_) { + switch (value_->type()) { + case otAPIMarker: + case otMarker: + str = QString::fromUtf8(language[lsMarker].c_str()); + break; + case otString: + str = QString::fromUtf8(language[lsString].c_str()); + break; + case otCode: + str = QString::fromUtf8(language[lsFunction].c_str()); + break; + case otExport: + str = QString::fromUtf8(language[lsExport].c_str()); + break; + default: + str = QString::fromUtf8(language[lsUnknown].c_str()); + break; + } + } else { + str = ""; + } + type_->setValue(str); + address_->setValue(value_ ? QString::fromUtf8(value_->display_address().c_str()) : QString()); + + compilationType_->setValue(value_ && value_->need_compile() ? value_->compilation_type() : ctNone); + compilationType_->setDefaultValue(value_ ? value_->default_compilation_type() : ctNone); + lockToKey_->setReadOnly(value_ && (!value_->need_compile() || value_->compilation_type() == ctMutation)); + lockToKey_->setValue((value_ && !lockToKey_->readOnly()) ? (value_->compilation_options() & coLockToKey) != 0 : false); + + for (QMap<IArchitecture *, ArchInfo>::const_iterator arch = map_.begin(); arch != map_.end(); arch++) { + ArchInfo info = arch.value(); + if (info.code->childCount()) + info.code->setValue(QString::number(info.code->childCount()) + " " + QString::fromUtf8(language[lsItems].c_str())); + else + info.code->setValue(QString()); + for (QMap<IFunction *, StringProperty *>::const_iterator it = info.map.begin(); it != info.map.end(); it++) { + IFunction *func = it.key(); + StringProperty *code = it.value(); + + str.clear(); + if (func->type() != otUnknown) { + str = QString::number(func->count()) + " " + QString::fromUtf8(language[lsItems].c_str()); + QString hint; + if (func->ext_command_list()->count()) { + if (!hint.isEmpty()) + hint.append(", "); + hint.append(QString::fromUtf8(language[lsExternalAddress].c_str())).append(": ").append(QString::number(func->ext_command_list()->count())); + } + if (func->break_address()) { + if (!hint.isEmpty()) + hint.append(", "); + hint.append(QString::fromUtf8(language[lsBreakAddress].c_str())); + } + if (!hint.isEmpty()) + str.append(" (").append(hint).append(")"); + } + code->setValue(str); + } + } + + lock_ = false; +} + +void FunctionPropertyManager::compilationTypeChanged(CompilationType value) +{ + if (!value_ || lock_) + return; + + if (value == ctNone) { + value_->set_need_compile(false); + } else { + value_->set_need_compile(true); + value_->set_compilation_type(value); + } +} + +void FunctionPropertyManager::lockToKeyChanged(bool value) +{ + if (!value_ || lock_) + return; + + uint32_t options = value_->compilation_options(); + if (value) { + options |= coLockToKey; + } else { + options &= ~coLockToKey; + } + value_->set_compilation_options(options); +} + +ICommand *FunctionPropertyManager::indexToCommand(const QModelIndex &index) const +{ + if (!index.isValid()) + return NULL; + + Property *prop = indexToProperty(index); + if (prop) { + if (CommandProperty *c = qobject_cast<CommandProperty*>(prop)) + return c->value(); + } + return NULL; +} + +IFunction *FunctionPropertyManager::indexToFunction(const QModelIndex &index) const +{ + if (!index.isValid()) + return NULL; + + Property *prop = indexToProperty(index); + if (prop) { + for (QMap<IArchitecture *, ArchInfo>::const_iterator arch = map_.begin(); arch != map_.end(); arch++) { + for (QMap<IFunction *, StringProperty *>::const_iterator it = arch.value().map.begin(); it != arch.value().map.end(); it++) { + if (it.value() == prop) + return it.key(); + } + } + } + return NULL; +} + +QModelIndex FunctionPropertyManager::commandToIndex(ICommand *command) const +{ + for (QMap<IArchitecture *, ArchInfo>::const_iterator arch = map_.begin(); arch != map_.end(); arch++) { + ArchInfo info = arch.value(); + for (QMap<IFunction *, StringProperty *>::const_iterator it = info.map.begin(); it != info.map.end(); it++) { + QList<Property *> propList = it.value()->children(); + for (int j = 0; j < propList.size(); j++) { + Property *prop = propList[j]; + if (reinterpret_cast<CommandProperty*>(prop)->value() == command) + return propertyToIndex(prop); + } + } + } + return QModelIndex(); +} + +/** + * SectionPropertyManager + */ + +SectionPropertyManager::SectionPropertyManager(QObject *parent) + : PropertyManager(parent), value_(NULL) +{ + details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); + + name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); + name_->setReadOnly(true); + address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); + address_->setReadOnly(true); + virtual_size_ = addStringProperty(details_, QString::fromUtf8(language[lsSize].c_str()), QString()); + virtual_size_->setReadOnly(true); + physical_offset_ = addStringProperty(details_, QString::fromUtf8(language[lsRawAddress].c_str()), QString()); + physical_offset_->setReadOnly(true); + physical_size_ = addStringProperty(details_, QString::fromUtf8(language[lsRawSize].c_str()), QString()); + physical_size_->setReadOnly(true); + flags_ = addStringProperty(details_, QString::fromUtf8(language[lsFlags].c_str()), QString()); + flags_->setReadOnly(true); +} + +void SectionPropertyManager::localize() +{ + details_->setName(QString::fromUtf8(language[lsDetails].c_str())); + name_->setName(QString::fromUtf8(language[lsName].c_str())); + address_->setName(QString::fromUtf8(language[lsAddress].c_str())); + virtual_size_->setName(QString::fromUtf8(language[lsSize].c_str())); + physical_offset_->setName(QString::fromUtf8(language[lsRawAddress].c_str())); + physical_size_->setName(QString::fromUtf8(language[lsRawSize].c_str())); + flags_->setName(QString::fromUtf8(language[lsFlags].c_str())); +} + +void SectionPropertyManager::setValue(ISection *value) +{ + value_ = value; + + update(); +} + +void SectionPropertyManager::update() +{ + name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); + address_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->address()).c_str()) : QString()); + virtual_size_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->size()).c_str()) : QString()); + physical_offset_->setValue(value_ ? QString::fromUtf8(DisplayValue(osDWord, value_->physical_offset()).c_str()) : QString()); + physical_size_->setValue(value_ ? QString::fromUtf8(DisplayValue(osDWord, value_->physical_size()).c_str()) : QString()); + flags_->setValue(value_ ? QString::fromLatin1(DisplayValue(osDWord, value_->flags()).c_str()) : QString()); +} + +/** + * SegmentPropertyManager + */ + +SegmentPropertyManager::SegmentPropertyManager(QObject *parent) + : PropertyManager(parent), value_(NULL), lock_(false) +{ + options_ = addGroupProperty(NULL, QString::fromUtf8(language[lsOptions].c_str())); + excluded_from_memory_protection_ = addBoolProperty(options_, QString::fromUtf8(language[lsExcludedFromMemoryProtection].c_str()), false); + excluded_from_packing_ = addBoolProperty(options_, QString::fromUtf8(language[lsExcludedFromPacking].c_str()), false); + + details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); + name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); + name_->setReadOnly(true); + address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); + address_->setReadOnly(true); + virtual_size_ = addStringProperty(details_, QString::fromUtf8(language[lsSize].c_str()), QString()); + virtual_size_->setReadOnly(true); + physical_offset_ = addStringProperty(details_, QString::fromUtf8(language[lsRawAddress].c_str()), QString()); + physical_offset_->setReadOnly(true); + physical_size_ = addStringProperty(details_, QString::fromUtf8(language[lsRawSize].c_str()), QString()); + physical_size_->setReadOnly(true); + flags_ = addStringProperty(details_, QString::fromUtf8(language[lsFlags].c_str()), QString()); + flags_->setReadOnly(true); + flag_readable_ = addBoolProperty(flags_, "Readable", false); + flag_readable_->setReadOnly(true); + flag_writable_ = addBoolProperty(flags_, "Writable", false); + flag_writable_->setReadOnly(true); + flag_executable_ = addBoolProperty(flags_, "Executable", false); + flag_executable_->setReadOnly(true); + flag_shared_ = addBoolProperty(flags_, "Shared", false); + flag_shared_->setReadOnly(true); + flag_discardable_ = addBoolProperty(flags_, "Discardable", false); + flag_discardable_->setReadOnly(true); + flag_notpaged_ = addBoolProperty(flags_, "NotPaged", false); + flag_notpaged_->setReadOnly(true); + + connect(excluded_from_packing_, SIGNAL(valueChanged(bool)), this, SLOT(excludedFromPackingChanged(bool))); + connect(excluded_from_memory_protection_, SIGNAL(valueChanged(bool)), this, SLOT(excludedFromMemoryProtectionChanged(bool))); +} + +void SegmentPropertyManager::localize() +{ + options_->setName(QString::fromUtf8(language[lsOptions].c_str())); + excluded_from_packing_->setName(QString::fromUtf8(language[lsExcludedFromPacking].c_str())); + excluded_from_memory_protection_->setName(QString::fromUtf8(language[lsExcludedFromMemoryProtection].c_str())); + + details_->setName(QString::fromUtf8(language[lsDetails].c_str())); + name_->setName(QString::fromUtf8(language[lsName].c_str())); + virtual_size_->setName(QString::fromUtf8(language[lsSize].c_str())); + address_->setName(QString::fromUtf8(language[lsAddress].c_str())); + physical_offset_->setName(QString::fromUtf8(language[lsRawAddress].c_str())); + physical_size_->setName(QString::fromUtf8(language[lsRawSize].c_str())); + flags_->setName(QString::fromUtf8(language[lsFlags].c_str())); +} + +void SegmentPropertyManager::setValue(ISection *value) +{ + value_ = value; + update(); +} + +void SegmentPropertyManager::update() +{ + lock_ = true; + + excluded_from_packing_->setValue(value_ ? value_->excluded_from_packing() : false); + excluded_from_memory_protection_->setValue(value_ ? value_->excluded_from_memory_protection() : false); + name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); + address_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->address()).c_str()) : QString()); + virtual_size_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->size()).c_str()) : QString()); + physical_offset_->setValue(value_ ? QString::fromUtf8(DisplayValue(osDWord, value_->physical_offset()).c_str()) : QString()); + physical_size_->setValue(value_ ? QString::fromUtf8(DisplayValue(osDWord, value_->physical_size()).c_str()) : QString()); + flags_->setValue(value_ ? QString::fromLatin1(DisplayValue(osDWord, value_->flags()).c_str()) : QString()); + uint32_t memoryType = value_ ? value_->memory_type() : mtNone; + flag_readable_->setValue(memoryType & mtReadable); + flag_writable_->setValue(memoryType & mtWritable); + flag_executable_->setValue(memoryType & mtExecutable); + flag_shared_->setValue(memoryType & mtShared); + flag_notpaged_->setValue(memoryType & mtNotPaged); + flag_discardable_->setValue(memoryType & mtDiscardable); + + lock_ = false; +} + +void SegmentPropertyManager::excludedFromPackingChanged(bool value) +{ + if (!value_ || lock_) + return; + + value_->set_excluded_from_packing(value); +} + +void SegmentPropertyManager::excludedFromMemoryProtectionChanged(bool value) +{ + if (!value_ || lock_) + return; + + value_->set_excluded_from_memory_protection(value); +} + +/** + * LoadCommandPropertyManager + */ + +LoadCommandPropertyManager::LoadCommandPropertyManager(QObject *parent) + : PropertyManager(parent), value_(NULL) +{ + details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); + + name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); + name_->setReadOnly(true); + address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); + address_->setReadOnly(true); + size_ = addStringProperty(details_, QString::fromUtf8(language[lsSize].c_str()), QString()); + size_->setReadOnly(true); + segment_ = addStringProperty(details_, QString::fromUtf8(language[lsSegment].c_str()), QString()); + segment_->setReadOnly(true); +} + +void LoadCommandPropertyManager::localize() +{ + details_->setName(QString::fromUtf8(language[lsDetails].c_str())); + name_->setName(QString::fromUtf8(language[lsName].c_str())); + address_->setName(QString::fromUtf8(language[lsAddress].c_str())); + size_->setName(QString::fromUtf8(language[lsSize].c_str())); + segment_->setName(QString::fromUtf8(language[lsSegment].c_str())); +} + +void LoadCommandPropertyManager::setValue(ILoadCommand *value) +{ + value_ = value; + + update(); +} + +void LoadCommandPropertyManager::update() +{ + name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); + address_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->address()).c_str()) : QString()); + size_->setValue(value_ ? QString::fromUtf8(DisplayValue(osDWord, value_->size()).c_str()) : QString()); + + ISection *segment = NULL; + if (value_) { + IArchitecture *file = value_->owner()->owner(); + segment = file->segment_list()->GetSectionByAddress(value_->address()); + if (file->owner()->format_name() == "ELF") { + switch (value_->type()) { + case DT_NEEDED: + case DT_PLTRELSZ: + case DT_RELASZ: + case DT_RELAENT: + case DT_STRSZ: + case DT_SYMENT: + case DT_SONAME: + case DT_RPATH: + case DT_RELSZ: + case DT_RELENT: + case DT_PLTREL: + case DT_DEBUG: + case DT_BIND_NOW: + case DT_INIT_ARRAYSZ: + case DT_FINI_ARRAYSZ: + case DT_RUNPATH: + case DT_FLAGS: + case DT_PREINIT_ARRAYSZ: + case DT_GNU_HASH: + case DT_RELACOUNT: + case DT_RELCOUNT: + case DT_FLAGS_1: + case DT_VERDEFNUM: + case DT_VERNEEDNUM: + segment = NULL; + break; + } + } + } + segment_->setValue(segment ? QString::fromUtf8(segment->name().c_str()) : QString()); +} + +/** + * ImportPropertyManager + */ + +ImportPropertyManager::ImportPropertyManager(QObject *parent) + : PropertyManager(parent), value_(NULL), func_(NULL) +{ + details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); + + name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); + name_->setReadOnly(true); + address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); + address_->setReadOnly(true); + references_ = addStringProperty(details_, QString::fromUtf8(language[lsReferences].c_str()), QString()); + references_->setReadOnly(true); +} + +ImportPropertyManager::~ImportPropertyManager() +{ + delete func_; +} + +void ImportPropertyManager::localize() +{ + details_->setName(QString::fromUtf8(language[lsDetails].c_str())); + name_->setName(QString::fromUtf8(language[lsName].c_str())); + address_->setName(QString::fromUtf8(language[lsAddress].c_str())); + references_->setName(QString::fromUtf8(language[lsReferences].c_str())); + references_->setValue(value_ ? QString::number(references_->childCount()) + " " + QString::fromUtf8(language[lsItems].c_str()) : QString()); +} + +QVariant ImportPropertyManager::data(const QModelIndex &index, int role) const +{ + Property *prop = indexToProperty(index); + if (role == Qt::FontRole) { + if (prop && prop->parent() == references_) + return QFont(MONOSPACE_FONT_FAMILY); + } + + return PropertyManager::data(index, role); +} + +void ImportPropertyManager::setValue(IImportFunction *value) +{ + value_ = value; + delete func_; + func_ = NULL; + + if (references_->childCount()) { + beginRemoveRows(propertyToIndex(references_), 0, references_->childCount()); + references_->clear(); + endRemoveRows(); + } + + if (value_) { + IArchitecture *file = value_->owner()->owner()->owner(); + func_ = file->function_list()->CreateFunction(); + ReferenceList *reference_list = value_->map_function()->reference_list(); + for (size_t i = 0; i < reference_list->count(); i++) { + Reference *reference = reference_list->item(i); + if (file->AddressSeek(reference->address())) + func_->ParseCommand(*file, reference->address()); + } + beginInsertRows(propertyToIndex(references_), 0, (int)reference_list->count()); + for (size_t i = 0; i < func_->count(); i++) { + Property *prop = addCommandProperty(references_, func_->item(i)); + prop->setReadOnly(true); + } + endInsertRows(); + } + + update(); +} + +void ImportPropertyManager::update() +{ + name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); + address_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->address()).c_str()) : QString()); + references_->setValue(value_ ? QString::number(references_->childCount()) + " " + QString::fromUtf8(language[lsItems].c_str()) : QString()); +} + +/** + * ExportPropertyManager + */ + +ExportPropertyManager::ExportPropertyManager(QObject *parent) + : PropertyManager(parent), value_(NULL) +{ + details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); + + name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); + name_->setReadOnly(true); + forwarded_ = addStringProperty(details_, "Forwarded", QString()); + forwarded_->setReadOnly(true); + address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); + address_->setReadOnly(true); +} + +void ExportPropertyManager::localize() +{ + details_->setName(QString::fromUtf8(language[lsDetails].c_str())); + name_->setName(QString::fromUtf8(language[lsName].c_str())); + address_->setName(QString::fromUtf8(language[lsAddress].c_str())); +} + +void ExportPropertyManager::setValue(IExport *value) +{ + value_ = value; + + update(); +} + +void ExportPropertyManager::update() +{ + name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); + forwarded_->setValue(value_ ? QString::fromUtf8(value_->forwarded_name().c_str()) : QString()); + address_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->address()).c_str()) : QString()); +} + +/** + * ResourcePropertyManager + */ + +ResourcePropertyManager::ResourcePropertyManager(QObject *parent) + : PropertyManager(parent), value_(NULL), lock_(false) +{ + options_ = addGroupProperty(NULL, QString::fromUtf8(language[lsPacking].c_str())); + excluded_from_packing_ = addBoolProperty(options_, QString::fromUtf8(language[lsExcludedFromPacking].c_str()), false); + + details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); + name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); + name_->setReadOnly(true); + address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); + address_->setReadOnly(true); + size_ = addStringProperty(details_, QString::fromUtf8(language[lsSize].c_str()), QString()); + size_->setReadOnly(true); + + connect(excluded_from_packing_, SIGNAL(valueChanged(bool)), this, SLOT(excludedFromPackingChanged(bool))); +} + +void ResourcePropertyManager::localize() +{ + options_->setName(QString::fromUtf8(language[lsOptions].c_str())); + excluded_from_packing_->setName(QString::fromUtf8(language[lsExcludedFromPacking].c_str())); + + details_->setName(QString::fromUtf8(language[lsDetails].c_str())); + name_->setName(QString::fromUtf8(language[lsName].c_str())); + address_->setName(QString::fromUtf8(language[lsAddress].c_str())); + size_->setName(QString::fromUtf8(language[lsSize].c_str())); +} + +void ResourcePropertyManager::setValue(IResource *value) +{ + value_ = value; + + update(); +} + +void ResourcePropertyManager::update() +{ + lock_ = true; + + name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); + address_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->address()).c_str()) : QString()); + size_->setValue(value_ ? QString::fromUtf8(DisplayValue(osDWord, value_->size()).c_str()) : QString()); + excluded_from_packing_->setValue(value_ ? value_->excluded_from_packing() : false); + + lock_ = false; +} + +void ResourcePropertyManager::excludedFromPackingChanged(bool value) +{ + if (!value_ || lock_) + return; + + value_->set_excluded_from_packing(value); +} + +/** + * CorePropertyManager + */ + +CorePropertyManager::CorePropertyManager(QObject *parent) + : PropertyManager(parent), core_(NULL), lock_(false) +{ + file_ = addGroupProperty(NULL, QString::fromUtf8(language[lsFile].c_str())); + memoryProtection_ = addBoolProperty(file_, QString::fromUtf8(language[lsMemoryProtection].c_str()), false); + connect(memoryProtection_, SIGNAL(valueChanged(bool)), this, SLOT(memoryProtectionChanged(bool))); + importProtection_ = addBoolProperty(file_, QString::fromUtf8(language[lsImportProtection].c_str()), false); + connect(importProtection_, SIGNAL(valueChanged(bool)), this, SLOT(importProtectionChanged(bool))); + resourceProtection_ = addBoolProperty(file_, QString::fromUtf8(language[lsResourceProtection].c_str()), false); + connect(resourceProtection_, SIGNAL(valueChanged(bool)), this, SLOT(resourceProtectionChanged(bool))); + packOutputFile_ = addBoolProperty(file_, QString::fromUtf8(language[lsPackOutputFile].c_str()), false); + connect(packOutputFile_, SIGNAL(valueChanged(bool)), this, SLOT(packOutputFileChanged(bool))); + outputFileName_ = addFileNameProperty(file_, QString::fromUtf8(language[lsOutputFile].c_str()), QString("%1 (" +#ifdef VMP_GNU + "*.dylib *.exe *.dll *.bpl *.ocx *.sys *.scr *.so);;%2 (*)" +#else + "*.exe *.dll *.bpl *.ocx *.sys *.scr *.dylib *.so);;%2 (*.*)" +#endif + ).arg(QString::fromUtf8(language[lsExecutableFiles].c_str())).arg(QString::fromUtf8(language[lsAllFiles].c_str())), QString(), true); + connect(outputFileName_, SIGNAL(valueChanged(const QString &)), this, SLOT(outputFileChanged(const QString &))); + + detection_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetection].c_str())); + detectionDebugger_ = addEnumProperty(detection_, QString::fromUtf8(language[lsDebugger].c_str()), QStringList() << QString::fromUtf8(language[lsNo].c_str()) << "User-mode" << "User-mode + Kernel-mode", 0); + connect(detectionDebugger_, SIGNAL(valueChanged(int)), this, SLOT(detectionDebuggerChanged(int))); + detectionVMTools_ = addBoolProperty(detection_, QString::fromUtf8(language[lsVirtualizationTools].c_str()), false); + connect(detectionVMTools_, SIGNAL(valueChanged(bool)), this, SLOT(detectioncpVMToolsChanged(bool))); + + additional_ = addGroupProperty(NULL, QString::fromUtf8(language[lsAdditional].c_str())); + vmSectionName_ = addStringProperty(additional_, QString::fromUtf8(language[lsVMSegments].c_str()), QString()); + connect(vmSectionName_, SIGNAL(valueChanged(const QString &)), this, SLOT(vmSectionNameChanged(const QString &))); + stripDebugInfo_ = addBoolProperty(additional_, QString::fromUtf8(language[lsStripDebugInfo].c_str()), false); + connect(stripDebugInfo_, SIGNAL(valueChanged(bool)), this, SLOT(stripDebugInfoChanged(bool))); + stripRelocations_ = addBoolProperty(additional_, QString::fromUtf8(language[lsStripRelocations].c_str()), false); + connect(stripRelocations_, SIGNAL(valueChanged(bool)), this, SLOT(stripRelocationsChanged(bool))); +#ifndef LITE + watermarkName_ = addWatermarkProperty(additional_, QString::fromUtf8(language[lsWatermark].c_str()), QString()); + connect(watermarkName_, SIGNAL(valueChanged(const QString &)), this, SLOT(watermarkNameChanged(const QString &))); +#ifdef ULTIMATE + hwid_ = addStringProperty(additional_, QString::fromUtf8(language[lsLockToHWID].c_str()), QString()); + connect(hwid_, SIGNAL(valueChanged(const QString &)), this, SLOT(hwidChanged(const QString &))); +#ifdef DEMO + if (true) +#else + if (VMProtectGetSerialNumberState() != SERIAL_STATE_SUCCESS) +#endif + { + size_t size = VMProtectGetCurrentHWID(NULL, 0); + char *hwid = new char[size]; + VMProtectGetCurrentHWID(hwid, (int)size); + hwid_->setValue(QString().fromLatin1(hwid)); + hwid_->setReadOnly(true); + delete [] hwid; + } + +#endif + + messages_ = addGroupProperty(NULL, QString::fromUtf8(language[lsMessages].c_str())); + messageDebuggerFound_ = addStringListProperty(messages_, QString::fromUtf8(language[lsDebuggerFound].c_str()), QString()); + connect(messageDebuggerFound_, SIGNAL(valueChanged(const QString &)), this, SLOT(messageDebuggerFoundChanged(const QString &))); + messageVMToolsFound_ = addStringListProperty(messages_, QString::fromUtf8(language[lsVirtualizationToolsFound].c_str()), QString()); + connect(messageVMToolsFound_, SIGNAL(valueChanged(const QString &)), this, SLOT(messageVMToolsFoundChanged(const QString &))); + messageFileCorrupted_ = addStringListProperty(messages_, QString::fromUtf8(language[lsFileCorrupted].c_str()), QString()); + connect(messageFileCorrupted_, SIGNAL(valueChanged(const QString &)), this, SLOT(messageFileCorruptedChanged(const QString &))); + messageSerialNumberRequired_ = addStringListProperty(messages_, QString::fromUtf8(language[lsSerialNumberRequired].c_str()), QString()); + connect(messageSerialNumberRequired_, SIGNAL(valueChanged(const QString &)), this, SLOT(messageSerialNumberRequiredChanged(const QString &))); + messageHWIDMismatched_ = addStringListProperty(messages_, QString::fromUtf8(language[lsHWIDMismatched].c_str()), QString()); + connect(messageHWIDMismatched_, SIGNAL(valueChanged(const QString &)), this, SLOT(messageHWIDMismatchedChanged(const QString &))); +#endif + +#ifdef ULTIMATE + licensingParameters_ = addGroupProperty(NULL, QString::fromUtf8(language[lsLicensingParameters].c_str())); + licenseDataFileName_ = addFileNameProperty(licensingParameters_, QString::fromUtf8(language[lsFileName].c_str()), QString("%1 (*.vmp);;" +#ifdef VMP_GNU + " %2 (*)" +#else + " %2 (*.*)" +#endif + ).arg(QString::fromUtf8(language[lsProjectFiles].c_str())).arg(QString::fromUtf8(language[lsAllFiles].c_str())), QString()); + connect(licenseDataFileName_, SIGNAL(valueChanged(const QString &)), this, SLOT(licenseDataFileNameChanged(const QString &))); + keyPairAlgorithm_ = addStringProperty(licensingParameters_, QString::fromUtf8(language[lsKeyPairAlgorithm].c_str()), QString()); + keyPairAlgorithm_->setReadOnly(true); + activationServer_ = addStringProperty(licensingParameters_, QString::fromUtf8(language[lsActivationServer].c_str()), QString()); + connect(activationServer_, SIGNAL(valueChanged(const QString &)), this, SLOT(activationServerChanged(const QString &))); +#endif +} + +void CorePropertyManager::localize() +{ + file_->setName(QString::fromUtf8(language[lsFile].c_str())); + memoryProtection_->setName(QString::fromUtf8(language[lsMemoryProtection].c_str())); + memoryProtection_->setToolTip(QString::fromUtf8(language[lsMemoryProtectionHelp].c_str())); + importProtection_->setName(QString::fromUtf8(language[lsImportProtection].c_str())); + importProtection_->setToolTip(QString::fromUtf8(language[lsImportProtectionHelp].c_str())); + resourceProtection_->setName(QString::fromUtf8(language[lsResourceProtection].c_str())); + resourceProtection_->setToolTip(QString::fromUtf8(language[lsResourceProtectionHelp].c_str())); + packOutputFile_->setName(QString::fromUtf8(language[lsPackOutputFile].c_str())); + packOutputFile_->setToolTip(QString::fromUtf8(language[lsPackOutputFileHelp].c_str())); +#ifndef LITE + watermarkName_->setName(QString::fromUtf8(language[lsWatermark].c_str())); + watermarkName_->setToolTip(QString::fromUtf8(language[lsWatermarkHelp].c_str())); +#endif + outputFileName_->setName(QString::fromUtf8(language[lsOutputFile].c_str())); + outputFileName_->setFilter(QString("%1 (" +#ifdef VMP_GNU + "*.dylib *.exe *.dll *.bpl *.ocx *.sys *.scr *.so);;%2 (*)" +#else + "*.exe *.dll *.bpl *.ocx *.sys *.scr *.dylib *.so);;%2 (*.*)" +#endif + ).arg(QString::fromUtf8(language[lsExecutableFiles].c_str())).arg(QString::fromUtf8(language[lsAllFiles].c_str()))); + + detection_->setName(QString::fromUtf8(language[lsDetection].c_str())); + detectionDebugger_->setName(QString::fromUtf8(language[lsDebugger].c_str())); + detectionDebugger_->setToolTip(QString::fromUtf8(language[lsDebuggerHelp].c_str())); + detectionDebugger_->setText(0, QString::fromUtf8(language[lsNo].c_str())); + detectionVMTools_->setName(QString::fromUtf8(language[lsVirtualizationTools].c_str())); + detectionVMTools_->setToolTip(QString::fromUtf8(language[lsVirtualizationToolsHelp].c_str())); + +#ifndef LITE + messages_->setName(QString::fromUtf8(language[lsMessages].c_str())); + messageDebuggerFound_->setName(QString::fromUtf8(language[lsDebuggerFound].c_str())); + messageVMToolsFound_->setName(QString::fromUtf8(language[lsVirtualizationToolsFound].c_str())); + messageFileCorrupted_->setName(QString::fromUtf8(language[lsFileCorrupted].c_str())); + messageSerialNumberRequired_->setName(QString::fromUtf8(language[lsSerialNumberRequired].c_str())); + messageHWIDMismatched_->setName(QString::fromUtf8(language[lsHWIDMismatched].c_str())); +#endif + + additional_->setName(QString::fromUtf8(language[lsAdditional].c_str())); + vmSectionName_->setName(QString::fromUtf8(language[lsVMSegments].c_str())); + vmSectionName_->setToolTip(QString::fromUtf8(language[lsVMSegmentsHelp].c_str())); + stripDebugInfo_->setName(QString::fromUtf8(language[lsStripDebugInfo].c_str())); + stripRelocations_->setName(QString::fromUtf8(language[lsStripRelocations].c_str())); + +#ifdef ULTIMATE + hwid_->setName(QString::fromUtf8(language[lsLockToHWID].c_str())); + licensingParameters_->setName(QString::fromUtf8(language[lsLicensingParameters].c_str())); + licensingParameters_->setToolTip(QString::fromUtf8(language[lsLicensingParametersHelp].c_str())); + licenseDataFileName_->setName(QString::fromUtf8(language[lsFileName].c_str())); + licenseDataFileName_->setFilter(QString( +#ifdef VMP_GNU + "%1 (*.vmp);;%2 (*)" +#else + "%1 (*.vmp);;%2 (*.*)" +#endif + ).arg(QString::fromUtf8(language[lsProjectFiles].c_str())).arg(QString::fromUtf8(language[lsAllFiles].c_str()))); + keyPairAlgorithm_->setName(QString::fromUtf8(language[lsKeyPairAlgorithm].c_str())); + if (keyPairAlgorithm_->childCount()) { + QList<Property *> keyProps = keyPairAlgorithm_->children(); + keyProps[0]->setName(QString::fromUtf8(language[lsPublicExp].c_str())); + keyProps[1]->setName(QString::fromUtf8(language[lsPrivateExp].c_str())); + keyProps[2]->setName(QString::fromUtf8(language[lsModulus].c_str())); + keyProps[3]->setName(QString::fromUtf8(language[lsProductCode].c_str())); + } else { + keyPairAlgorithm_->setValue(QString::fromUtf8(language[lsNone].c_str())); + } + activationServer_->setName(QString::fromUtf8(language[lsActivationServer].c_str())); +#endif +} + +void CorePropertyManager::setCore(Core *core) +{ + core_ = core; + if (core_ && core_->input_file()) { + uint32_t disable_options = core_->input_file()->disable_options(); + stripRelocations_->setReadOnly(disable_options & cpStripFixups); + importProtection_->setReadOnly(disable_options & cpImportProtection); + resourceProtection_->setReadOnly(disable_options & cpResourceProtection); + packOutputFile_->setReadOnly(disable_options & cpPack); + } + outputFileName_->setRelativePath(core ? QString::fromUtf8(core->project_path().c_str()) : QString()); +#ifdef ULTIMATE + licenseDataFileName_->setRelativePath(core ? QString::fromUtf8(core->project_path().c_str()) : QString()); +#endif + update(); +} + +QVariant CorePropertyManager::data(const QModelIndex &index, int role) const +{ + if (role == Qt::FontRole) { +#ifdef ULTIMATE + Property *prop = indexToProperty(index); + if (prop && prop->parent() == keyPairAlgorithm_ && index.column() == 1) + return QFont(MONOSPACE_FONT_FAMILY); +#endif + } + + return PropertyManager::data(index, role); +} + +void CorePropertyManager::update() +{ + lock_ = true; + + uint32_t options = core_ ? core_->options() : 0; + if (core_ && core_->input_file()) + options &= ~core_->input_file()->disable_options(); + memoryProtection_->setValue(core_ ? (options & cpMemoryProtection) != 0 : false); + importProtection_->setValue(core_ ? (options & cpImportProtection) != 0 : false); + resourceProtection_->setValue(core_ ? (options & cpResourceProtection) != 0 : false); + packOutputFile_->setValue(core_ ? (options & cpPack) != 0 : false); +#ifndef LITE + watermarkName_->setValue(core_ ? QString::fromUtf8(core_->watermark_name().c_str()) : QString()); +#endif + outputFileName_->setValue(core_ ? QString::fromUtf8(core_->output_file_name().c_str()) : QString()); + int i; + switch (options & (cpCheckDebugger | cpCheckKernelDebugger)) { + case cpCheckDebugger: + i = 1; + break; + case cpCheckDebugger | cpCheckKernelDebugger: + i = 2; + break; + default: + i = 0; + break; + } + detectionDebugger_->setValue(core_ ? i : 0); + detectionVMTools_->setValue(core_ ? (options & cpCheckVirtualMachine) != 0 : false); +#ifndef LITE + messageDebuggerFound_->setValue(core_ ? QString::fromUtf8(core_->message(MESSAGE_DEBUGGER_FOUND).c_str()) : QString()); + messageVMToolsFound_->setValue(core_ ? QString::fromUtf8(core_->message(MESSAGE_VIRTUAL_MACHINE_FOUND).c_str()) : QString()); + messageFileCorrupted_->setValue(core_ ? QString::fromUtf8(core_->message(MESSAGE_FILE_CORRUPTED).c_str()) : QString()); + messageSerialNumberRequired_->setValue(core_ ? QString::fromUtf8(core_->message(MESSAGE_SERIAL_NUMBER_REQUIRED).c_str()) : QString()); + messageHWIDMismatched_->setValue(core_ ? QString::fromUtf8(core_->message(MESSAGE_HWID_MISMATCHED).c_str()) : QString()); +#endif + + vmSectionName_->setValue(core_ ? QString::fromUtf8(core_->vm_section_name().c_str()) : QString()); + stripDebugInfo_->setValue(core_ ? (options & cpStripDebugInfo) != 0 : false); + stripRelocations_->setValue(core_ ? (options & cpStripFixups) != 0 : false); + +#ifdef ULTIMATE + if (!hwid_->readOnly()) + hwid_->setValue(core_ ? QString::fromUtf8(core_->hwid().c_str()) : QString()); + licenseDataFileName_->setValue(core_ ? QString::fromUtf8(core_->license_data_file_name().c_str()) : QString()); + QString str; + if (core_) { + LicensingManager *licensingManager = core_->licensing_manager(); + switch (licensingManager->algorithm()) { + case alNone: + str = QString::fromUtf8(language[lsNone].c_str()); + if (keyPairAlgorithm_->childCount()) { + beginRemoveRows(propertyToIndex(keyPairAlgorithm_), 0, keyPairAlgorithm_->childCount()); + keyPairAlgorithm_->clear(); + endRemoveRows(); + } + break; + case alRSA: + str = QString("RSA %1").arg(licensingManager->bits()); + if (!keyPairAlgorithm_->childCount()) { + beginInsertRows(propertyToIndex(keyPairAlgorithm_), 0, 4); + + StringProperty *prop = addStringProperty(keyPairAlgorithm_, QString::fromUtf8(language[lsPublicExp].c_str()), QString()); + prop->setReadOnly(true); + + prop = addStringProperty(keyPairAlgorithm_, QString::fromUtf8(language[lsPrivateExp].c_str()), QString()); + prop->setReadOnly(true); + + prop = addStringProperty(keyPairAlgorithm_, QString::fromUtf8(language[lsModulus].c_str()), QString()); + prop->setReadOnly(true); + + prop = addStringProperty(keyPairAlgorithm_, QString::fromUtf8(language[lsProductCode].c_str()), QString()); + prop->setReadOnly(true); + + endInsertRows(); + } + QList<Property *> list = keyPairAlgorithm_->children(); + reinterpret_cast<StringProperty *>(list.at(0))->setValue(QString::fromLatin1(formatVector(licensingManager->public_exp()).c_str())); + reinterpret_cast<StringProperty *>(list.at(1))->setValue(QString::fromLatin1(formatVector(licensingManager->private_exp()).c_str())); + reinterpret_cast<StringProperty *>(list.at(2))->setValue(QString::fromLatin1(formatVector(licensingManager->modulus()).c_str())); + uint64_t product_code = licensingManager->product_code(); + reinterpret_cast<StringProperty *>(list.at(3))->setValue(QByteArray(reinterpret_cast<char *>(&product_code), sizeof(product_code)).toBase64()); + break; + } + } + keyPairAlgorithm_->setValue(str); + activationServer_->setValue(core_ ? QString::fromUtf8(core_->activation_server().c_str()) : QString()); +#endif + + lock_ = false; +} + +void CorePropertyManager::memoryProtectionChanged(bool value) +{ + if (!core_ || lock_) + return; + + if (value) { + core_->include_option(cpMemoryProtection); + } else { + core_->exclude_option(cpMemoryProtection); + } +} + +void CorePropertyManager::importProtectionChanged(bool value) +{ + if (!core_ || lock_) + return; + + if (value) { + core_->include_option(cpImportProtection); + } else { + core_->exclude_option(cpImportProtection); + } +} + +void CorePropertyManager::resourceProtectionChanged(bool value) +{ + if (!core_ || lock_) + return; + + if (value) { + core_->include_option(cpResourceProtection); + } else { + core_->exclude_option(cpResourceProtection); + } +} + +void CorePropertyManager::packOutputFileChanged(bool value) +{ + if (!core_ || lock_) + return; + + if (value) { + core_->include_option(cpPack); + } else { + core_->exclude_option(cpPack); + } +} + +void CorePropertyManager::watermarkNameChanged(const QString &value) +{ + if (!core_ || lock_) + return; + + core_->set_watermark_name(value.toUtf8().constData()); +} + +void CorePropertyManager::outputFileChanged(const QString &value) +{ + if (!core_ || lock_) + return; + + core_->set_output_file_name(value.toUtf8().constData()); +} + +void CorePropertyManager::detectionDebuggerChanged(int value) +{ + if (!core_ || lock_) + return; + + if (value) + core_->include_option(cpCheckDebugger); + else + core_->exclude_option(cpCheckDebugger); + if (value == 2) + core_->include_option(cpCheckKernelDebugger); + else + core_->exclude_option(cpCheckKernelDebugger); +} + +void CorePropertyManager::detectioncpVMToolsChanged(bool value) +{ + if (!core_ || lock_) + return; + + if (value) { + core_->include_option(cpCheckVirtualMachine); + } else { + core_->exclude_option(cpCheckVirtualMachine); + } +} + +void CorePropertyManager::vmSectionNameChanged(const QString &value) +{ + if (!core_ || lock_) + return; + + core_->set_vm_section_name(value.toUtf8().constData()); +} + +void CorePropertyManager::stripDebugInfoChanged(bool value) +{ + if (!core_ || lock_) + return; + + if (value) { + core_->include_option(cpStripDebugInfo); + } else { + core_->exclude_option(cpStripDebugInfo); + } +} + +void CorePropertyManager::stripRelocationsChanged(bool value) +{ + if (!core_ || lock_) + return; + + if (value) { + core_->include_option(cpStripFixups); + } else { + core_->exclude_option(cpStripFixups); + } +} + +void CorePropertyManager::debugModeChanged(bool value) +{ + if (!core_ || lock_) + return; + + if (value) { + core_->include_option(cpDebugMode); + } else { + core_->exclude_option(cpDebugMode); + } +} + +void CorePropertyManager::messageDebuggerFoundChanged(const QString &value) +{ + if (!core_ || lock_) + return; + + core_->set_message(MESSAGE_DEBUGGER_FOUND, value.toUtf8().constData()); +} + +void CorePropertyManager::messageVMToolsFoundChanged(const QString &value) +{ + if (!core_ || lock_) + return; + + core_->set_message(MESSAGE_VIRTUAL_MACHINE_FOUND, value.toUtf8().constData()); +} + +void CorePropertyManager::messageFileCorruptedChanged(const QString &value) +{ + if (!core_ || lock_) + return; + + core_->set_message(MESSAGE_FILE_CORRUPTED, value.toUtf8().constData()); +} + +void CorePropertyManager::messageSerialNumberRequiredChanged(const QString &value) +{ + if (!core_ || lock_) + return; + + core_->set_message(MESSAGE_SERIAL_NUMBER_REQUIRED, value.toUtf8().constData()); +} + +void CorePropertyManager::messageHWIDMismatchedChanged(const QString &value) +{ + if (!core_ || lock_) + return; + + core_->set_message(MESSAGE_HWID_MISMATCHED, value.toUtf8().constData()); +} + +#ifdef ULTIMATE +void CorePropertyManager::hwidChanged(const QString &value) +{ + if (!core_ || lock_) + return; + + core_->set_hwid(value.toUtf8().constData()); +} + +void CorePropertyManager::licenseDataFileNameChanged(const QString &value) +{ + if (!core_ || lock_) + return; + + core_->set_license_data_file_name(value.toUtf8().constData()); +} + +void CorePropertyManager::activationServerChanged(const QString &value) +{ + if (!core_ || lock_) + return; + + core_->set_activation_server(value.toUtf8().constData()); +} +#else +void CorePropertyManager::hwidChanged(const QString &) {} +void CorePropertyManager::licenseDataFileNameChanged(const QString &) {} +void CorePropertyManager::activationServerChanged(const QString &) {} +#endif + +/** + * WatermarkPropertyManager + */ + +WatermarkPropertyManager::WatermarkPropertyManager(QObject *parent) + : PropertyManager(parent), lock_(false), watermark_(NULL) +{ + GroupProperty *details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); + name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); + blocked_ = addBoolProperty(details_, QString::fromUtf8(language[lsBlocked].c_str()), false); + useCount_ = addStringProperty(details_, QString::fromUtf8(language[lsUsageCount].c_str()), QString()); + useCount_->setReadOnly(true); + + connect(name_, SIGNAL(valueChanged(const QString &)), this, SLOT(nameChanged(const QString &))); + connect(blocked_, SIGNAL(valueChanged(bool)), this, SLOT(blockedChanged(bool))); +} + +void WatermarkPropertyManager::setWatermark(Watermark *watermark) +{ + watermark_ = watermark; + update(); +} + +void WatermarkPropertyManager::update() +{ + lock_ = true; + + name_->setValue(watermark_ ? QString::fromUtf8(watermark_->name().c_str()) : QString()); + blocked_->setValue(watermark_ ? !watermark_->enabled() : false); + useCount_->setValue(watermark_ ? QString::number(watermark_->use_count()) : QString()); + + lock_ = false; +} + +void WatermarkPropertyManager::nameChanged(const QString &value) +{ + if (!watermark_ || lock_) + return; + + watermark_->set_name(value.toUtf8().constData()); +} + +void WatermarkPropertyManager::blockedChanged(bool value) +{ + if (!watermark_ || lock_) + return; + + watermark_->set_enabled(!value); +} + +/** + * AddressCalculator + */ + +AddressCalculator::AddressCalculator(QObject *parent) + : PropertyManager(parent), lock_(false), file_(NULL) +{ + address_ = addStringProperty(NULL, QString::fromUtf8(language[lsAddress].c_str()), QString()); + offset_ = addStringProperty(NULL, QString::fromUtf8(language[lsRawAddress].c_str()), QString()); + segment_ = addEnumProperty(NULL, QString::fromUtf8(language[lsSegment].c_str()), QStringList(), -1); + + connect(address_, SIGNAL(valueChanged(const QString &)), this, SLOT(addressChanged(const QString &))); + connect(offset_, SIGNAL(valueChanged(const QString &)), this, SLOT(offsetChanged(const QString &))); + connect(segment_, SIGNAL(valueChanged(int)), this, SLOT(segmentChanged(int))); +} + +void AddressCalculator::localize() +{ + address_->setName(QString::fromUtf8(language[lsAddress].c_str())); + offset_->setName(QString::fromUtf8(language[lsRawAddress].c_str())); + segment_->setName(QString::fromUtf8(language[lsSegment].c_str())); +} + +void AddressCalculator::setValue(IArchitecture *file) +{ + if (file_ == file) + return; + + file_ = file; + + lock_ = true; + address_->setValue(QString()); + offset_->setValue(QString()); + QStringList segments; + if (file_) { + for (size_t i = 0; i < file_->segment_list()->count(); i++) { + segments.push_back(QString::fromUtf8(file_->segment_list()->item(i)->name().c_str())); + } + } + segment_->setValue(-1); + segment_->setItems(segments); + lock_ = false; +} + +void AddressCalculator::addressChanged(const QString &value) +{ + if (!file_ || lock_) + return; + + lock_ = true; + bool is_valid; + ISection *segment = NULL; + uint64_t address = value.toULongLong(&is_valid, 16); + if (is_valid) + segment = file_->segment_list()->GetSectionByAddress(address); + offset_->setValue(segment ? QString::fromUtf8(DisplayValue(osDWord, segment->physical_offset() + address - segment->address()).c_str()) : QString()); + segment_->setValue(segment ? (int)file_->segment_list()->IndexOf(segment) : -1); + lock_ = false; +} + +void AddressCalculator::offsetChanged(const QString &value) +{ + if (!file_ || lock_) + return; + + lock_ = true; + bool is_valid; + ISection *segment = NULL; + uint64_t offset = value.toULongLong(&is_valid, 16); + if (is_valid) + segment = file_->segment_list()->GetSectionByOffset(offset); + uint64_t address = segment ? segment->address() + offset - segment->physical_offset() : 0; + address_->setValue(segment ? QString::fromUtf8(DisplayValue(file_->cpu_address_size(), address).c_str()) : QString()); + segment_->setValue(segment ? (int)file_->segment_list()->IndexOf(segment) : -1); + lock_ = false; +} + +void AddressCalculator::segmentChanged(int value) +{ + if (!file_ || lock_) + return; + + lock_ = true; + ISection *segment = file_->segment_list()->item(value); + uint64_t address = segment ? segment->address() : 0; + address_->setValue(segment ? QString::fromUtf8(DisplayValue(file_->cpu_address_size(), address).c_str()) : QString()); + offset_->setValue(segment ? QString::fromUtf8(DisplayValue(osDWord, segment->physical_offset() + address - segment->address()).c_str()) : QString()); + lock_ = false; +}
\ No newline at end of file |