Resultados 1 a 2 de 2
  1. #1

    Thumbs up Código Fonte - Mult-Loader

    Outro programa que fiz para matar o tempo (é semelhante ao meu outro projeto em Delphi que pode ser visto aqui).



    É um Loader para múltiplos programas, ele carrega as informações de um Xml com o seguinte formato.

    • <App> = Nó base de cada aplicação.
      • Atributo Name = Nome da aplicação.
      • Atributo Args = Argumentos que serão passados para a aplicação.
      • Atributo Suspend = Informa se o processo deve ser criado suspenso, antes de escrever as mudanças na memoria (Padrão false).
        • <Binary> (Podem existir múltiplos nós para um mesmo arquivo) = Dados a serem escritos na memoria formatados byte a byte "AA FF 11"...
          • Atributo Offset = Posição a partir dá qual escrever os dados na memoria.
          • Atributo Repeat = Quantidade de vezes que a sequencia deve ser repetida (Padrão 1).
          • Atributo AllAccess = Indica se deve ser concedido acesso de Leitura/Escrita/Execução a esta parte da memoria (Padrão false).
        • <String> (Podem existir múltiplos nós para um mesmo arquivo) = Semelhante ao <Binary> podem tem como valor uma string a ser escrita na memoria.
          • Atributo Offset = Posição a partir dá qual escrever os dados na memoria.
          • Atributo Repeat = Quantidade de vezes que a string será repetida na memoria (o caractere Nulo é acrescentado ao final), (Padrão 1).
          • Atributo AllAccess = Indica se deve ser concedido acesso de Leitura/Escrita/Execução a esta parte da memoria (Padrão false).


    Obs: Todo dado numero deve ser informado no formato hexadecimal (Offset, Bytes, Repeat).

    Código PHP:
    <Applications>
        <
    App Name="AppName" Args="-safe">
            <
    Binary Offset="1111">01 02 03 04 05 06 07 09 10</Binary>
        </
    App>
        <
    App Name="Test" Args="-s" Suspend="true">
            <
    String Offset="403027" Repeat="2">era</String>
            <
    Binary Offset="40302D" AllAccess="true">53 53 53 53 53</Binary>
        </
    App>
    </
    Applications





    Somente para constar foi feito em C++ com Qt 4.7.

    Header MainWindow
    Código PHP:
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include "appinfo.h"

    #include <QMainWindow>

    #include <QtXml/QXmlStreamReader>
    #include <QFile>
    #include <QProcess>
    #include <QFileDialog>
    #include <QMessageBox>
    #include <windows.h>

    namespace Ui {
    class 
    MainWindow;
    }

    class 
    MainWindow : public QMainWindow
    {
        
    Q_OBJECT
        
    public:
        
    explicit MainWindow(QWidget *parent 0);
        ~
    MainWindow();
        
    private 
    slots:
        
    void on_btnLoad_clicked();

        
    void on_btnAbout_clicked();

    private:
        
    Ui::MainWindow *ui;

        
    QVector<AppInfoApps;

        
    void LoadXml();
    };

    #endif // MAINWINDOW_H 
    Source MainWindow
    Código PHP:
    #include "mainwindow.h"
    #include "ui_mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) :
        
    QMainWindow(parent),
        
    ui(new Ui::MainWindow)
    {
        
    ui->setupUi(this);
        
    QWidget::setWindowFlags(Qt::WindowMinimizeButtonHint Qt::MSWindowsFixedSizeDialogHint);
        
    LoadXml();
    }

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

    void MainWindow::LoadXml()
    {
        
    QFile file("./Applications.xml");

        
    file.open(QIODevice::ReadOnly QIODevice::Text);

        if(
    file.error())
        {
            
    ui->cmbApp->addItem("Error");
            return;
        }

        
    QXmlStreamReader xml(&file);

        
    AppInfo appinfo;
        
    OffsetData offset;

        if(
    xml.hasError())
        {
            
    ui->cmbApp->addItem("Error");
            return;
        }

        while(!
    xml.atEnd())
        {
            if(
    xml.readNext() == xml.StartDocument)
            {
                continue;
            }

            if(
    xml.name() == "App")
            {
                if(
    xml.isStartElement())
                {
                    
    appinfo.Offsets.clear();
                    
    appinfo.Name.clear();
                    
    appinfo.Args.clear();
                    
    appinfo.Suspended false;

                    
    //ui->cmbApp->addItem(xml.attributes().value("Name").toString());
                    
    appinfo.Name xml.attributes().value("Name").toString();
                    
    appinfo.Args xml.attributes().value("Args").toString();
                    
    appinfo.Suspended = (xml.attributes().value("Suspend") == "true");
                    
    ui->cmbApp->addItem(appinfo.Name);
                }
                else if(
    xml.isEndElement())
                {
                    
    Apps.append(appinfo);
                }
            }
            else if(
    xml.name() == "Binary" && xml.isStartElement())
            {
                
    offset.Data.clear();
                
    offset.Offset 0;
                
    offset.AllAccess false;

                
    offset.Offset xml.attributes().value("Offset").toString().toInt(NULL16);
                
    offset.AllAccess = (xml.attributes().value("AllAccess") == "true");
                
    qint16 repeat xml.attributes().value("Repeat").toString().toInt(NULL16);

                if(
    repeat == 0)
                {
                    
    repeat 1;
                }

                
    QStringList bytes xml.readElementText().split(' ');

                for(
    qint16 i 0repeati++)
                {
                    foreach(
    QString bytebytes)
                    {
                        
    offset.Data.append(byte.toInt(NULL16));
                    }
                }

                
    appinfo.Offsets.append(offset);
            }
            else if(
    xml.name() == "String" && xml.isStartElement())
            {
                
    offset.Data.clear();
                
    offset.Offset 0;
                
    offset.AllAccess false;

                
    offset.Offset xml.attributes().value("Offset").toString().toInt(NULL16);
                
    offset.AllAccess = (xml.attributes().value("AllAccess") == "true");
                
    qint16 repeat xml.attributes().value("Repeat").toString().toInt(NULL16);

                if(
    repeat == 0)
                {
                    
    repeat 1;
                }

                
    QString temp xml.readElementText();

                for(
    qint16 i 0repeati++)
                {
                    foreach(
    char bytetemp.toAscii())
                    {
                        
    offset.Data.append(byte);
                    }
                }

                
    offset.Data.append('\0');
                
    appinfo.Offsets.append(offset);
            }
        }
    }

    void MainWindow::on_btnLoad_clicked()
    {
        
    QFileDialog dialog(ui->centralWidgetQt::Popup);
        
    QString filename;

        
    filename dialog.getOpenFileName(this, ("Select the executable of " Apps[ui->cmbApp->currentIndex()].Name),
                                          
    """Executable(*.exe);;Any(*.*)"0QFileDialog::DontConfirmOverwrite);

        if(!
    filename.isEmpty())
        {
            
    AppInfo app Apps[ui->cmbApp->currentIndex()];

            
    PROCESS_INFORMATION proc_info;
            
    STARTUPINFO start_info;

            
    ZeroMemory(&proc_info,sizeof(proc_info));
            
    ZeroMemory(&start_infosizeof(start_info));
            
    start_info.cb sizeof(start_info);

            
    CreateProcess(static_cast<LPCWSTR>(filename.toStdWString().c_str()), const_cast<LPWSTR>(app.Args.toStdWString().c_str()),
                          
    NULLNULLFALSEapp.Suspended?CREATE_SUSPENDED:0NULLNULL, &start_info,&proc_info);

            
    HANDLE hproc OpenProcess(PROCESS_ALL_ACCESSFALSEproc_info.dwProcessId);

            if(!
    hproc)
            {
                
    hproc proc_info.hProcess;
            }

            if(
    hproc)
            {
                foreach(
    OffsetData offsetapp.Offsets)
                {
                    
    DWORD old_protect 0;

                    if(
    VirtualProtectEx(hproc, (void*)offset.Offsetoffset.Data.size(), PAGE_EXECUTE_READWRITE, &old_protect))
                    {
                        for(
    qint16 i 0offset.Data.count(); i++)
                        {
                            
    char temp offset.Data[i];

                            if(!
    WriteProcessMemory(hproc, (void*)(offset.Offset i), static_cast<LPCVOID>(&temp), 1NULL))
                            {
                                
    TerminateProcess(proc_info.hProcess1);
                                
    qDebug("Write Error %d"GetLastError());
                                
    QMessageBox(QMessageBox::Critical,
                                            
    "Load error"QString(
                                                
    "Failed to write memory\nError code %1\nProcess Handle %2\nOffset %3\nData size %4\n")
                                            .
    arg(GetLastError()).arg((int)hproc).arg(offset.Offset).arg(offset.Data.size()),
                                            
    QMessageBox::OkthisQt::Popup Qt::MSWindowsFixedSizeDialogHint).exec();
                                return;
                            }
                        }

                        if(!
    offset.AllAccess)
                        {
                            
    DWORD trash 0;
                            
    VirtualProtectEx(hproc, (void*)offset.Offsetoffset.Data.size(), old_protect, &trash);
                        }
                    }
                    else
                    {
                        
    TerminateProcess(proc_info.hProcess2);
                        
    qDebug("Set Memory attributes error %d"GetLastError());
                        
    QMessageBox(QMessageBox::Critical,
                                    
    "Load error"QString(
                                        
    "Failed to set memory attributes\nError code %1\nProcess Handle %2\nOffset %3\nData size %4\n")
                                    .
    arg(GetLastError()).arg((int)hproc).arg(offset.Offset).arg(offset.Data.size()),
                                    
    QMessageBox::OkthisQt::Popup Qt::MSWindowsFixedSizeDialogHint).exec();
                        return;
                    }
                }

                if(
    app.Suspended)
                {
                    
    ResumeThread(proc_info.hThread);
                }

                
    CloseHandle(hproc);
            }
            else
            {
                
    QMessageBox(QMessageBox::Critical,
                            
    "Load error"QString(
                                
    "Cant open handle\nError code %1").arg(GetLastError()),
                            
    QMessageBox::OkthisQt::Popup Qt::MSWindowsFixedSizeDialogHint).exec();
            }

            
    CloseHandle(proc_info.hProcess);
            
    CloseHandle(proc_info.hThread);
        }
    }

    void MainWindow::on_btnAbout_clicked()
    {
        
    QMessageBox(QMessageBox::Information,
                    
    "About""By Hacker_wap\nhttp://www.forum-invaders.com.br",
                    
    QMessageBox::OkthisQt::Popup Qt::MSWindowsFixedSizeDialogHint).exec();

    Header AppInfo
    Código PHP:
    #ifndef APPINFO_H
    #define APPINFO_H

    #include <QByteArray>
    #include <QVector>
    #include <Qstring>


    struct OffsetData
    {
        
    qint32 Offset;
        
    bool AllAccess;
        
    QByteArray Data;
    };

    struct AppInfo
    {
        
    QString Name;
        
    QString Args;
        
    bool Suspended;
        
    QString VersionOrHash;
        
    QVector<OffsetDataOffsets;
    };

    //QVector<AppInfo> AppDatas;

    #endif // APPINFO_H 
    Espero que tenha alguma utilidade para alguém .
    É melhor não dizer nada e pensarem que é bobo, do que abrir a boca e acabar com as duvidas.

  2. #2
    Moderador Avatar de _Guga_
    Data de Ingresso
    Apr 2006
    Localização
    Salvador - BA
    Posts
    2.118
    cara simplismente fantástico.

    meus parabéns, vai ser muito util para o meu aprendizado sobre Qt rs

    abração


    I must not fear. Fear is the mind killer.

Tags para este Tópico

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •