Jeśli jesteś właścicielem tej strony, możesz wyłączyć reklamę poniżej zmieniając pakiet na PRO lub VIP w panelu naszego hostingu już od 4zł!
2013-11-07    Kod, C++, RE

W szufladzie dziś odnalazłem stary, zapomniany pendrive. Po przejrzeniu plików znajdujących się na nim, jeden przykuł moją szczególną uwagę. Był to program modyfikujący subsystem na CUI, który już ładny czas temu napisałem.

Oto on:
 
#include <iostream> 
#include <fstream> 
 
using namespace std; 
 
int main(int argc, const char *argv[]) 
{ 
    string name_file; 
    string name_new_file; 
 
    if(argc == 1) 
      return 2; 
 
    string arg1 = argv[1]; 
 
    if(argc == 2) 
    { 
        if(arg1 == "-help" || arg1 == "--help" || arg1 == "-/?") 
        { 
            cout << "This is patcher by Szewy. Transformer GUI to CUI :)\n"
                    "  -o name_of_file_GUI\n  -n name_new_file_CUI(optional)"; 
            return 0; 
        } 
        else 
            return 3; 
    } 
 
    if(argc > 5 || argc == 4) 
      return 4; 
 
    string arg2 = argv[2]; 
 
    if(argc == 3) 
    { 
        if(arg1 != "-o") 
           return 6; 
 
        name_file = arg2; 
        name_file += ".exe"; 
 
        name_new_file = "PATCHED_"+name_file; 
    } 
    else if(argc == 5) 
    { 
        string arg3 = argv[3]; 
        string arg4 = argv[4]; 
 
        if(arg1 == "-o" || arg3 == "-o") 
        { 
            if(arg1 == "-o") 
                name_file = arg2; 
            else if(arg3 == "-o") 
                name_file = arg4; 
 
            name_file += ".exe"; 
        } 
        else 
            return 6; 
 
        if(arg1 == "-n" || arg3 == "-n") 
        { 
            if(arg1 == "-n") 
                name_new_file = arg2; 
            else if(arg3 == "-n") 
                name_new_file = arg4; 
 
            name_new_file += ".exe"; 
        } 
        else 
            return 6; 
    } 
    else 
       return 4; 
 
    fstream plik(name_file.c_str(), ios::in | ios::binary); 
 
    if(!plik) 
    { 
        cerr << "Error! No file :/ "; 
        return 1; 
    } 
 
    fstream plik2(name_new_file.c_str(), ios::out | ios::binary); 
 
    char znak_P; 
    char znak_E; 
 
    plik.get(znak_P); 
 
    while (true) 
    { 
       plik.get(znak_E); 
       plik2 << znak_P; 
 
       if(znak_P == 'P' && znak_E == 'E') 
       { 
           plik2 << znak_E; 
           break; 
       } 
 
       znak_P = znak_E; 
    } 
 
    char znak; 
 
    for(int i = 0; i < 90; i++) 
    { 
        plik.get(znak); 
        plik2 << znak; 
    } 
 
    plik.get(znak); 
    if(znak != 3) 
    { 
        plik2 << (char)3; 
        cout << "Patch complete :)"; 
    }else{ 
        cout << "Patch no work, because it was done early!"; 
        plik2 << znak; 
    } 
 
    while(plik.get(znak)) 
    { 
        plik2 << znak; 
    } 
 
    return 0; 
} 
 


Pierwsza część odpowiada za dokładny error checking, następnie podmienia wartość pola "Subsytem" ze strukturki IMAGE_OPTIONAL_HEADER.

Co ciekawe, niektóre aplikacje GUI wypisują coś niewidocznego na konsoli. Przy odrobinie szczęścia można je odnaleźć.
Dodaj komentarz:
Nick:
URL(opcjonalnie):