Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dziwny rezultat odkodowania

Ostatnio zmodyfikowano 2013-02-15 15:36
Autor Wiadomość
crash
Temat założony przez niniejszego użytkownika
Dziwny rezultat odkodowania
» 2013-02-14 17:53:22
Siema po dłuższej nieobecności (wycieczka).

Do zaczerniania kodu służą obfuscatory, do szyfrowania plików exe jest już cała gama programów, a ja wymyśliłem nową metodę. Plik exe jest przekazywany przez parametr do ExeCoder'a, program ten wczytuje exe'ca do tablicy char. Tablica ta jest w unii wraz z drugą tablicą typu float. Pomysł jest taki, że program na podstawie wczytanego exe'ca szyfruje go, a następnie tworzy nowy kod źródłowy oparty o klasy, dziedziczenie, szablony, być może kontenery STL i zobaczę co jeszcze ślina na klawiaturę przyniesie, na razie nie ten etap.

Exe do szyfrowania będzie sprytnie przechowywany w uprzednio wymienionych strukturach, a przy uruchomieniu całość zostanie wypakowana i uruchomiona jako odszyfrowany exe. Podpięty GCC skompiluje utworzony kod i mamy zaszyfrowany Exec. Taki jest mniej więcej zamysł.

Wiem, jeden temat jeden problem, ale ja problemy mam dwa bardzo małe, więc chyba nikt się nie obrazi, jeśli oba tu umieszczę. Najpierw kod:

C/C++
#include <iostream>
#include <fstream>


using namespace std;

void inline err( string e )
{
    cout << endl << e << endl;
}


int main()
{
    //czesc pierwsza szyfrowanie exe   
    ifstream in( "./notepad.exe", ios::binary );
   
    in.seekg( 0, ios::end );
    int insize = in.tellg();
    in.seekg( 0, ios::beg );
   
    if( insize == 0 )
    {
        err( "Empty file" );
        return - 1;
    }
   
    union
    {
        char * cexe;
        float * fexe;
    };
   
    cexe = new char[ insize ];
   
    in.read( cexe, insize );
    in.close();
   
    for( int i = 0; i < insize; ++i )
    {
        //cexe[i] += 29;
        cexe[ i ] ^= 33;
    }
   
    for( int i = 0; i < insize / 4; i += 4 )
    {
        fexe[ i ] *= 0.29f;
        //fexe[i] +=  1.01f;
    }
   
    ofstream out( "out.txt", ios::binary );
   
    out.write( cexe, insize );
   
    delete[] cexe;
   
    //w druga strone:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   
    ifstream in2( "out.txt", ios::binary );
   
    in2.seekg( 0, ios::end );
    int size2 = in2.tellg();
    in2.seekg( 0, ios::beg );
   
    union
    {
        char * cexe2;
        float * fexe2;
    };
   
    cexe2 = new char[ size2 ];
   
    in2.read( cexe2, size2 );
    in2.close();
   
    for( int i = 0; i < size2 / 4; i += 4 )
    {
        fexe2[ i ] /= 0.29f;
        //fexe2[i] += 1.01f;
    }
   
    for( int i = 0; i < size2; ++i )
    {
        cexe2[ i ] ^= 33;
        //cexe2[i] -= 29;
    }
   
    ofstream out2( "a.exe", ios::binary );
   
    out2.write( cexe2, size2 );
   
    delete[] cexe2;
}

Mniejszy problem jest taki, że nie mogę sobie poradzić z odwracaniem xor'ów z mnożeniami oraz mnożeń z odejmowaniem, do tego prawdopodobnie sam dojdę, ale nie szkodzi zapytać. Zakomentowane wiersze: 41, 48, 79, 85;

Ważniejszy problem: program poprawnie co do bajta wypakowuje odszyfrowany plik, plik ma ikone notatnika (szyfruję notatnik), ale gdy odpalam dziada pokazuje się komunikat, że to nieprawidłowa aplikacja - a przecież ikonę notatnika ma ;p Ocb? Z góry dziękuję za pomoc.

edit:

Przy otwieraniu a.exe pojawia się komunikat:

Nie można uruchomić aplikacji, ponieważ jej konfiguracja równoczesna jest niepoprawna. Więcej szczegółów można znaleźć w dzienniku zdarzeń aplikacji lub przy użyciu narzędzia wiersza poleceń sxtrace.exe

Już lookam, być może to banalne jak słońce ;p

P-76282
krzyk
» 2013-02-14 19:18:14
brakuje
out.close();
P-76287
crash
Temat założony przez niniejszego użytkownika
» 2013-02-14 19:52:05
Nie tu tkwi problem, ale to nic, mam na oku inne podejście już :) Mimo to, na razie nie zamykam
P-76291
krzyk
» 2013-02-14 20:34:45
Nie tu tkwi problem
Zanim otworzysz ten sam plik musisz wcześniej go zamknąć.

Problem to
fexe[ i ] *= 0.29f;
 i
fexe2[ i ] /= 0.29f;
To że coś pomnożysz przez stałą zmiennoprzecinkową nie oznacza przy podzieleniu przez nią musisz otrzymać poprzedni wynik.
Możliwe też że pobierając z tablicy jako float otrzymujesz NaN lub inne śmiecie.
P-76297
pekfos
» 2013-02-14 20:42:56
Mnożenie znaku przez liczbę rzeczywistą. Brak tu elementarnej wiedzy o podstawowych typach..
P-76299
crash
Temat założony przez niniejszego użytkownika
» 2013-02-15 13:40:25
Pefkos@ zwróć uwagę na:

C/C++
union
{
    char * cexe;
    float * fexe;
};

Wczytywane są do tablicy char* wszystkie bajty pliku exe:

C/C++
in.read( cexe, insize );

A za pomocą unii traktowane są jako liczby zmiennoprzecinkowe i to m.in. na nich wykonywane są operacje mnożenia/dzielenia. Operacji na ułamkach nie wykonuję na char tylko na float. Operacje dodawania i xor'owania na char żeby właśnie wszystko było zgodne z arytmetyką liczb całkowitych. Porównywałem plik exe wejściowy z wynikowym - ilość bajtów zgadza się, pojawia sie ikona i info o wersji (próbowałem różne pliki tak traktować)
P-76339
DejaVu
» 2013-02-15 13:55:57
C/C++
fexe[ i ] = 1;
fexe[ i ] *= 0.29f;
//fexe[i] = 0;
fexe2[ i ] /= 0.29f;
//fexe[i] = 0;
P-76341
crash
Temat założony przez niniejszego użytkownika
» 2013-02-15 14:41:28
No nic, dzieki za komenty. Chwytam problem z innej strony ;)

Zamykam
P-76343
« 1 » 2
  Strona 1 z 2 Następna strona