Saludos.
Hoy vengo con una pequeña libreria (que espero continuar y mejorar en muchos aspectos), que sirve principalmente para encriptar recursos
pequeños y en futuro ojalá que sean de más importancia.

¿De que me sirve ésto.?
Bueno comenzare diciendo que estaba programando un minijuego en SDL con C++ me disponía de encriptar los recursos del juego(como imágenes y otros archivos)
ya que cuando se distribuye un juego no nos interesa que el jugador vea todos estos avances...
Tras buscar un largo rato sin encontrar nada se me ocurrió hacerlo por mi cuenta...
Éste es mi método y como siempre digo, puedes mejorarlo(de hecho es la idea) a fin de cuentas ésto es mas una prueba de concepto,
espero pronto documentar más el uso de SDL en alguns aspectos... ya que no encontre demasiado acerca de como cargar recursos salvo RWops.

Otra cosa interesante es que encripta sin sobreescribir, con ésto me refiero a que si tenemos 2 archivos uno con nombre A.ext y B.ext al encriptarlo
quedará así A(0).ext y B(1).ext, lo mismo al desencriptar...

Así que repito, puede encriptar imágenes perfectamente aquí la prueba.
Encriptado:
Imagen


Del mismo modo puede desencriptarlo(con SDL logre hacerlo runtime, osea que el usuario no se daria cuenta!).
Desencriptado:
Imagen


Código:
/*******************************************
*
*
* Author : NvK
* Libreria : FileEncryptionOps
* Versión : 0.9
* Descripción : Trabaja con imágenes principalmente, permitiendo encriptar/desencriptar,
* Compatible con SDL para trabajar con RWops y recursos!!.
* Fecha : 24-2-2014
*
********************************************/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <fcntl.h>

#ifndef __FILE_ENCRYPTION_OPS__
	#define __FILE_ENCRYPTION_OPS__

	#define BEGIN_FILE_POS          (0x0001)
	#define WRITE_TEXT              ("w")
	#define WRITE_BINARY            ("wb")
	#define READ_TEXT               ("r")
	#define READ_BINARY             ("rb")

	long GetFileSize(const char *filePath);
	char *strlast(char *str, int last_n);
	void WriteXORFileEx(const char *InputFile, const char *OutputFile);
	void XOR_WriteFile_Encryption(const char *FilePath);

    #define __XOR_KEY__
    #ifdef __XOR_KEY__
        const char xor_key[]= {'N', 'V', 'K'};
	#endif
#endif

long GetFileSize(const char *filePath)
{
	int fp= open(filePath, O_RDONLY);
	return (lseek(fp, 0x0000, SEEK_END));
}

void strlast(char *str, int last_n, char output_buf[])
{
    volatile register int __ptr_length __asm__("ebx");
    register int __ptr_last_n __asm__("ecx");

    __asm__(
            "mov %%eax, (%%esp);"
            "call _strlen;"
            "movl %%eax, %%ebx;"
            ::"a"(str)
        );
    __asm__("mov %%edx, %%ecx;"
            "sub %%ebx, %%ecx;"
            "neg %%ecx;" :: "d"(last_n) );

    for(int i=0; i<=last_n; i++)
        __asm__ volatile(";":"=r"(output_buf[i]):"a"(str[ __ptr_last_n++ ]));
}

void WriteXORFileEx(const char *InputFile, const char *OutputFile)
{
    int fileSize= GetFileSize(InputFile);
    FILE *fInput= fopen(InputFile, READ_BINARY); // abre el archivo en modo binario
    FILE *fOutput= fopen(OutputFile, WRITE_BINARY); // escribe el archivo en modo binario
    int Buff[fileSize];
    char EncBuf[fileSize];

    char *Write= (char *)malloc(fileSize);
    fread(Write, fileSize, BEGIN_FILE_POS, fInput);

    for(int b=0;b<fileSize;b++)
    {
        EncBuf[b]= (Write[b]^xor_key[b % (sizeof(xor_key))]);
    }
    fwrite(EncBuf, BEGIN_FILE_POS, fileSize, fOutput);

    fclose(fInput);
    fclose(fOutput);
}

void XOR_WriteFile_Encryption(const char *FilePath)
{
    char filesPath[460];
    char fileName[360];
    char fileExt[4];
    char *fileNum;
    char filesToEncrypt[360];
    char filesEncrypted[360];

    WIN32_FIND_DATA FindFileData;
    HANDLE hFile;

    sprintf(filesPath, FilePath);
    chdir(FilePath);
    hFile= FindFirstFile("*.*", &FindFileData);

    volatile UINT nFiles __asm__("eax") = 0; // así se preserva

    if(hFile!=INVALID_HANDLE_VALUE)
    {
        do{
            if(strcmp(FindFileData.cFileName, ".")&&
               (strcmp("..", FindFileData.cFileName)) )
            {
                sprintf(filesToEncrypt, "%s%s", filesPath, FindFileData.cFileName);
                snprintf(fileName, strlen(FindFileData.cFileName)-0x3, "%s", FindFileData.cFileName); // quitar la extención del archivo
                strlast(FindFileData.cFileName, 4, fileExt);

                itoa(nFiles, fileNum, 0x4);
                sprintf(filesEncrypted, "%s%s(%s)%s",
                        filesPath,                      // Copia la ruta del archivo
                        fileName,                       // Copia el nombre
                        fileNum,                        // Copia el numero
                        fileExt                         // agrega la extención
                        );

                printf("%s\n", filesToEncrypt);

                WriteXORFileEx(filesToEncrypt, filesEncrypted);
                __asm__ volatile(
                         "inc %%eax;" : "=r"(nFiles) : "a"(nFiles)
                        );

            }
        } while(FindNextFile(hFile, &FindFileData));
    }
    free(fileNum);

    FindClose(hFile);
}
Ejemplo de uso:
#include "FileEncryptionOps.h"
int main()
{
	XOR_WriteFile_Encryption("C:\\Objs\\"); // Encriptara todo lo de la carpeta "Objs" en el disco C:
	return 0;
}
Lamentablemente lo intente con archivos .mp3 y .exe y no funciono... así que por ahora ésto es todo lo que puedo ofrecerles :¬/
awita colega estas que te sales en el tema, el number one, a veces me pregunto si eres humano aaah, un saludo crack
Abolición para el torneo del toro de la vega. Death to the murderers of bulls.
Espero en algún tiempo publicar la beta del juego que estoy programando(en mis horas libres), de hecho le hice un sistema de RPG(todo desde 0 sin rips), con inventario, menu, huds etc... se que ésto no tiene que ver mucho con "hacking" pero créanme, programar un juego desde 0 es un proceso sumamente matemático y complejo, se aprende mucho...
En fin, aun conservo el espíritu gamer.
NvK escribió:Espero en algún tiempo publicar la beta del juego que estoy programando(en mis horas libres), de hecho le hice un sistema de RPG(todo desde 0 sin rips), con inventario, menu, huds etc... se que ésto no tiene que ver mucho con "hacking" pero créanme, programar un juego desde 0 es un proceso sumamente matemático y complejo, se aprende mucho...
En fin, aun conservo el espíritu gamer.
Me parece muy bueno, estaré esperando. lastima la gente se quede solo en el malware. yo veré si poste otras(códigos), cosas que no tienen nada que ver con malware pero se podría a prender algo.

Saludos
Imagen
Pink escribió:
NvK escribió:Espero en algún tiempo publicar la beta del juego que estoy programando(en mis horas libres), de hecho le hice un sistema de RPG(todo desde 0 sin rips), con inventario, menu, huds etc... se que ésto no tiene que ver mucho con "hacking" pero créanme, programar un juego desde 0 es un proceso sumamente matemático y complejo, se aprende mucho...
En fin, aun conservo el espíritu gamer.
Me parece muy bueno, estaré esperando. lastima la gente se quede solo en el malware. yo veré si poste otras(códigos), cosas que no tienen nada que ver con malware pero se podría a prender algo.

Saludos
Que bueno ver que comparto mismos ideales con personas como tu. Y si la programación avanzada no solo se encuentra en el malware y no toda la programación es así... opinamos igual
Gracias fiera, buen proyecto!

No entiendo muy bien, quizás estoy buscando la complejidad en algo sencillo.

Lo que hace es cifrar o descifrar una carpeta completa, hasta ahí bien, pero:

Cuando dices lo de descifrar en runtime, te refieres a un simple doble click y el fichero será descifrado en memoria y visualizado? (sin escribir en disco el fichero descifrado)

Una herramienta que se me ocurre es un visor propio, los ficheros cifrados con extensión *.jpg_ y con doble click se ejecute nuestra aplicación, descifre el fichero en memoria mediante streams y lo cargue, de este modo no escribimos jamás el fichero descifrado en disco.

Saludos!
UDTools.net
GitHub: https://github.com/MetalUDT
Saludos metal.
Bueno este es un pequeño proyecto que hice hace tiempo... y tiene algunos fallos, claro que encripta y luego puede desencriptar en memoria
para ello hice un función pero que solo es usada con SDL, claro que puede adaptarse a cualquier otra lib pero deberías decirme maso menos sobre que y como lo quieres.

De todos modos ahora estoy programando un motor grafico para SDL (es un proyecto empresarial al estilo RPG).
Y cree mi propio formato(.NRC) el cual comprime toda una "pelicula" de imagenes y las encripta, luego las puede descargar en memoria(y desencriptarlas) sin consumir memoria y muy optima, si quieres el código fuente no tengo problemas en proporcionartelo... ya que sera open source.


Aca te dejo la vieja version del vizualidor de imagen en memoria(con SLD obvio):
SDL_Surface *LoadDecryptedSDL_Texture(const char *FilePath, bool ALPHA)
{
    SDL_Surface *tmp=NULL;
    SDL_Surface *img=NULL;
    SDL_RWops   *RW= NULL;

    int filesize= GetFileSize(FilePath);
    char *ptr= (char*)malloc(filesize);
    memcpy(ptr, ReadFileEncrypted(FilePath), filesize);

    RW= SDL_RWFromMem(ptr, filesize);
    tmp= IMG_Load_RW(RW, 1);

    if (ALPHA)
    {
        img = SDL_DisplayFormatAlpha(tmp);
        SDL_SetColorKey(img, SDL_SRCCOLORKEY, SDL_MapRGB(img->format, 0xFF, 0xFF, 0xFF));
    }
    else
    {
        img = SDL_DisplayFormat(tmp);
        SDL_SetColorKey(img, SDL_SRCCOLORKEY, SDL_MapRGB(img->format, 0x00, 0xFF, 0xFF));
    }

    SDL_FreeSurface(tmp);//SDL_FreeRW(RW);
    free(ptr);
    ptr= NULL;

    return img
Gracias por todo, no iba mal encaminado entonces.

Más que nada es porque en breves tendré tiempo libre y algo habrá que programar, sobretodo algo no-malware (que estoy harto xD), y tu proyecto me parece muy bueno, además ya veo que existen los componentes SDL para delphi así que me viene de lujo para aprender unas cuantas cosillas más.

Saludos!
UDTools.net
GitHub: https://github.com/MetalUDT
Claro compañero yo también tengo suficiente de malware...
Ademas programando juegos se aprende mucho ya que no hay tutos ni guías exactas, es pura lógica y capacidad
analítica.
Este es un motor con un sistema RPG completamente hecho de 0 sin rips ni nada, en un futuro daré más previas
pero por ahora tiene bastantes cosas como recursos propios encriptados, mini-animaciones, sistema de inventario,
de consumo, etc..
Previa:
Imagen


Imagen


Pascal es muy bueno para juegos, tienes jediSDL y también puedes usar OpenGl yo no lo use por que la verdad
quería un juego clásico... no me gustan demasiado los juegos modernos que se pasan en gráficos pierden la esencia...

En fin si quieres algún consejo/ayuda sobre como programar un juego(sea el estilo que sea) puedes mandarme un MP.
Responder

Volver a “Fuentes”