Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перекодировать бинарный файл в текстовый

841
06 июля 2008 года
_nic
199 / / 29.07.2006
Подскажите кому несложно какие существуют алгоритмы кодирования бинарных файлов в текстовые?
А то я кроме MIME ничего больше немогк припомнить :(
3
06 июля 2008 года
Green
4.8K / / 20.01.2000
Ну а чем тебя не устраивает base64 ?
841
06 июля 2008 года
_nic
199 / / 29.07.2006
Цитата: Green
Ну а чем тебя не устраивает base64 ?



Хотелось бы попроще :rolleyes:

92
08 июля 2008 года
Тень Пса
2.2K / / 19.10.2006
и так всё просто, а если вопрос в реализации - вот
841
18 июля 2008 года
_nic
199 / / 29.07.2006
Вот статю нашел на эту тему http://www.codenet.ru/progr/cpp/UUEncode-Base64.php Там с ней идет интересный исходник.Попытался я использовать из него ф-ции uuencode и uudecode что бы закодировать и раскодировать exe файл.Но только ниче невышло :( Куда то пропадает около 2 кбайт на выходе хотя начало выходного exe идентично с входным.Помогите распутать эту ситуация кому несложно.
Код:
#include <string.h>
#include <windows.h>

int res,err;DWORD sz;LPDWORD lp;
unsigned long mask=127;
char text[1024];
HANDLE FileData;
DWORD nReadBytes;
const char uucode[]="`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
long uuencode(const char* FileName, char* buffer,unsigned  int length)//&#226;&#251;&#239;&#238;&#235;&#237;&#255;&#229;&#242; &#234;&#238;&#228;&#232;&#240;&#238;&#226;&#224;&#237;&#232;&#229; &#226; uuencode &#229;&#241;&#235;&#232; &#244;&#224;&#233;&#235; &#238;&#242;&#234;&#240;&#251;&#242;&#252; &#237;&#229; &#243;&#228;&#224;&#235;&#238;&#241;&#252;, &#232;&#235;&#232; &#225;&#243;&#244;&#244;&#229;&#240; &#241;&#235;&#232;&#248;&#234;&#238;&#236; &#236;&#224;&#235;&#229;&#237;&#252;&#234;&#232;&#233;, &#247;&#242;&#238;&#225; &#231;&#224;&#239;&#232;&#245;&#237;&#243;&#242;&#252; &#242;&#243;&#228;&#224; &#231;&#224;&#234;&#238;&#228;&#232;&#240;&#238;&#226;&#224;&#237;&#237;&#251;&#233; &#244;&#224;&#233;&#235; - &#226;&#238;&#231;&#226;&#240;&#224;&#249;&#224;&#229;&#242; 0 &#232;&#237;&#224;&#247;&#229; &#226;&#238;&#231;&#226;&#240;&#224;&#249;&#224;&#229;&#242; &#240;&#224;&#231;&#236;&#229;&#240; &#231;&#224;&#234;&#238;&#228;&#232;&#240;&#238;&#226;&#224;&#237;&#237;&#238;&#227;&#238; &#244;&#224;&#233;&#235;&#224;
{
    unsigned char ReadData[45];//&#232;&#241;&#245;&#238;&#228;&#237;&#224;&#255; &#241;&#242;&#240;&#238;&#234;&#224;
    unsigned char ResData[61];//&#231;&#224;&#234;&#238;&#228;&#232;&#240;&#238;&#226;&#224;&#237;&#237;&#224;&#255; &#241;&#242;&#240;&#238;&#234;&#224;
    unsigned long p=0;
    unsigned long len=0;
    unsigned long CurResBufferPos=0;//&#241; &#253;&#242;&#238;&#233; &#239;&#238;&#231;&#232;&#246;&#232;&#232; &#226; &#240;&#229;&#231;&#243;&#235;&#252;&#242;&#232;&#240;&#243;&#254;&#249;&#232;&#233; &#225;&#243;&#244;&#229;&#240; &#231;&#224;&#237;&#238;&#241;&#232;&#242;&#252;&#241;&#255; &#238;&#247;&#229;&#240;&#229;&#228;&#237;&#224;&#255; &#231;&#224;&#234;&#238;&#228;&#232;&#240;&#238;&#226;&#224;&#237;&#237;&#224;&#255; &#241;&#242;&#240;&#238;&#234;&#224;
    unsigned int j;
    unsigned char tmpchar;
    FileData=CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
    if(FileData==INVALID_HANDLE_VALUE) return 0;
   
    do
    {
        memset(ReadData,0,45);//&#231;&#224;&#239;&#238;&#235;&#237;&#255;&#229;&#236; &#226;&#241;&#229; &#237;&#243;&#235;&#255;&#236;&#232;, &#228;&#235;&#255; &#242;&#238;&#227;&#238;, &#247;&#238;&#225;&#251; &#229;&#241;&#235;&#232; &#226; &#241;&#242;&#240;&#238;&#234;&#229; *** &#225;&#243;&#228;&#229;&#242; &#239;&#238;&#239;&#251;&#242;&#234;&#224;
                             //&#231;&#224;&#235;&#229;&#231;&#242;&#252; &#231;&#224; nReadBytes, &#242;&#224;&#234;&#238;&#229; &#226;&#238;&#231;&#236;&#238;&#230;&#237;&#238;, &#242;&#234; i &#243;&#226;&#229;&#228;&#232;&#247;&#232;&#226;&#224;&#229;&#242;&#241;&#255; &#234;&#224;&#230;&#228;&#251;&#233; &#240;&#224;&#231; &#237;&#224; 3,
                             //&#242;&#238; &#235;&#232;&#248;&#237;&#232;&#229; &#225;&#224;&#233;&#242;&#251; &#237;&#229; &#225;&#243;&#228;&#243;&#242; &#241;&#238;&#228;&#229;&#240;&#230;&#224;&#242;&#252; &#236;&#243;&#241;&#238;&#240;&#224;, &#224; &#237;&#243;&#235;&#232; &#237;&#229; &#232;&#241;&#239;&#238;&#240;&#242;&#255;&#242; &#237;&#243;&#230;&#237;&#251;&#229; &#228;&#224;&#237;&#237;&#251;&#229;
        ReadFile(FileData,ReadData,45,&nReadBytes,NULL);//&#239;&#240;&#238;&#247;&#232;&#242;&#224;&#235;&#232; &#241;&#242;&#240;&#238;&#234;&#243; 45 &#225;&#224;&#233;&#242;
        if (nReadBytes==0) return len;//&#237;&#224; &#242;&#238;&#242; &#241;&#235;&#243;&#247;&#224;&#233;, &#229;&#241;&#235;&#232; &#240;&#224;&#231;&#236;&#229;&#240; &#244;&#224;&#233;&#235;&#224; &#234;&#240;&#224;&#242;&#229;&#237; 45. &#232;&#237;&#224;&#247;&#229; &#225;&#251; &#236;&#251; &#247;&#232;&#242;&#224;&#235;&#232; 0 &#225;&#224;&#233;&#242;, &#200; &#221;&#210;&#206;&#210; &#205;&#206;&#203;&#220; &#216;&#197;&#203; &#193;&#219; &#210;&#206;&#198;&#197; &#194; &#206;&#210;&#209;&#203;&#219;&#202;&#211;.
        //&#231;&#224;&#234;&#238;&#228;&#232;&#240;&#243;&#229;&#236; &#229;&#229;.
        j=1;//&#232;&#242;&#229;&#240;&#224;&#242;&#238;&#240; &#228;&#235;&#255; ResData &#237;&#224;&#247; &#241; 1 &#242;&#234; &#226; &#239;&#229;&#240;&#226;&#238;&#236;(&#241; &#232;&#237;&#228;&#229;&#234;&#241;&#238;&#236; 0) &#225;&#224;&#233;&#242;&#229; &#241;&#238;&#228;&#229;&#240;&#230; &#228;&#235;&#232;&#237;&#224; &#241;&#242;&#240;&#238;&#234;&#232;
        ResData[0]=nReadBytes;//&#234;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#225;&#224;&#233;&#242;&#238;&#226; &#226; &#232;&#241;&#245;&#238;&#228;&#237;&#238;&#233; &#241;&#242;&#240;&#238;&#234;&#229;. -1 &#237;&#229; &#237;&#224;&#228;&#238;, &#245;&#238;&#242;&#255; &#239;&#238;&#242;&#238;&#236; &#253;&#242;&#238; &#225;&#243;&#228;&#229;&#242; &#239;&#240;&#229;&#238;&#225;&#240;&#224;&#231;&#238;&#226;&#224;&#237;&#238; &#226; &#237;&#238;&#236;&#229;&#240; &#241;&#232;&#236;&#226;&#238;&#235;&#224; &#226; &#241;&#242;&#240;&#238;&#234; uucode. &#224; &#237;&#243;&#236;&#229;&#240;&#224;&#246;&#232;&#255; &#232;&#228;&#229;&#242; &#241; &#237;&#243;&#235;&#255;.

        for(unsigned int i=0;i<nReadBytes;i+=3)//&#234;&#238;&#228;&#232;&#240;&#243;&#229;&#236; &#239;&#238; &#242;&#240;&#232; &#225;&#224;&#233;&#242;&#224;
        {
            //memcpy(&p,ReadData+i,3);//&#242;&#229;&#236;&#237;&#238;&#229; &#236;&#229;&#241;&#242;&#238;. &#204;&#224;&#248;&#232;&#237;&#237;&#238;&#231;&#224;&#226;&#232;&#241;&#232;&#236;&#238;.
            //&#231;&#224;&#241;&#238;&#226;&#251;&#226;&#224;&#229;&#236; &#226;&#241;&#229; &#242;&#240;&#232; &#225;&#224;&#233;&#242;&#224; &#226; &#238;&#228;&#237;&#238; &#239;&#238;&#235;&#229; &#228;&#224;&#237;&#237;&#251;&#245; (&#242;&#247;&#238;&#225;&#251; &#238;&#237;&#232; &#225;&#251;&#235;&#232; &#240;&#224;&#241;&#239;&#238;&#235;&#238;&#230;&#229;&#237;&#251; &#239;&#238;&#228;&#240;&#255;&#228;.
            //&#228;&#229;&#235;&#224;&#229;&#236; &#232;&#231; 3 &#225;&#224;&#233;&#242;&#238;&#226; 4.
            p=ReadData[i+2]+ReadData[i+1]*256+ReadData*65536;//&#241;&#242;&#240;&#238;&#234;&#224; ***
            for(unsigned char i1=0;i1<3;i1++)
            {
                tmpchar=p;
                tmpchar<<=2;//&#226;&#251;&#228;&#229;&#235;&#255;&#229;&#236; &#239;&#238;&#241;&#235;&#228;&#229;&#237;&#232;&#229; 6 &#225;&#232;&#242;
                tmpchar>>=2;//
                ResData[j+3-i1]=tmpchar;
                p>>=6;//&#241;&#228;&#226;&#232;&#227;&#224;&#229;&#236; &#237;&#224; &#253;&#242;&#232; 6 &#225;&#232;&#242;
            }
            ResData[j]=p;//&#226; p &#238;&#241;&#242;&#224;&#235;&#232;&#241;&#252; &#242;&#238;&#235;&#252;&#234;&#238; &#239;&#238;&#241;&#235;&#228;&#229;&#237;&#232;&#229; 6 &#225;&#232;&#242;. &#200;&#245; &#232; &#231;&#224;&#237;&#229;&#241;&#229;&#236; &#226; &#240;&#229;&#231;&#243;&#235;&#252;&#242;&#232;&#240;&#243;&#254;&#249;&#243;&#254; &#241;&#242;&#240;&#238;&#234;&#243;.
            j+=4;
        }

        len+=j+1;//j - &#241;&#234;&#238;&#235;&#252;&#234;&#238; &#225;&#224;&#233;&#242;&#238;&#226; &#226; ResData, &#239;&#235;&#254;&#241; &#238;&#228;&#232;&#237; &#225;&#224;&#233;&#242; - &#234;&#238;&#237;&#229;&#246; &#241;&#242;&#240;&#238;&#234;&#232;
       
        //&#242;&#229;&#239;&#229;&#240;&#252; &#231;&#224;&#234;&#238;&#228;&#232;&#240;&#238;&#226;&#224;&#237;&#237;&#243;&#254; &#241;&#242;&#240;&#238;&#234;&#243; &#237;&#243;&#230;&#237;&#238; &#231;&#224;&#237;&#229;&#241;&#242;&#232; &#226; &#240;&#229;&#231;&#243;&#235;&#252;&#242;&#232;&#240;&#243;&#254;&#249;&#232;&#233; &#225;&#243;&#244;&#244;&#229;&#240;
        if(len<=length)//&#229;&#241;&#235;&#232; &#229;&#241;&#242;&#252; &#236;&#229;&#241;&#242;&#238; &#226; &#225;&#243;&#244;&#244;&#229;&#240;&#229;
        {
            for(unsigned char i1=0;i1<j;i1++)//&#237;&#243;&#230;&#237;&#238; &#239;&#229;&#240;&#229;&#237;&#229;&#241;&#242;&#232; j &#241;&#232;&#236;&#226;&#238;&#235;&#238;&#226;
            {
                buffer[CurResBufferPos+i1]=uucode[ResData[i1]];//-1 &#242;&#234; &#226; uucode &#237;&#243;&#236;&#229;&#240;&#224;&#246;&#232;&#255; &#237;&#224;&#247;&#232;&#237;&#224;&#229;&#242;&#241;&#255; &#241; &#237;&#243;&#235;&#255;
            }
           
            buffer[CurResBufferPos+j]='\n';
            CurResBufferPos+=j+1;
        }
        else return 0;
       

    }
    while(nReadBytes==45);


    CloseHandle(FileData);
    return len;
}

long uudecode(const char* buffer, unsigned int len, const char* FileName)//?????? ? ???????, ??????????????? ??? ?????? uuecncode ????????????? ? ????????????? ? ????.
{
    unsigned char CodedData[61];//?????????????? ??????
    unsigned char DecodedData[45];//?????????????? ??????
    unsigned long p=0;
    unsigned long CurbufferPos=0;//??????? ???????, ? ??????? ???????????? ?????? ?? buffer
    unsigned char t_len,CodedDataLen=61;
    unsigned char DecodedDataLen=0;
    unsigned long TotalLen=0;
    const char* pos;
    FileData=CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,0,0);
   
    while(CurbufferPos<len)
    {
        if(buffer[CurbufferPos]=='\r'||buffer[CurbufferPos]=='\n')
        {
            CurbufferPos++;//?????????? ???????-???????? ????? ??????
        }
        else
        {
            //????????? ?????? ?? ??????? ? ??????, ??????? ????? ????????????
            if(CurbufferPos+61<=len)//???? ? buffer+CurbufferPos (??? ??????) ??? ???? 61 ??????, ???????? ? ????
            {
                memcpy(CodedData,buffer+CurbufferPos,61);
                CurbufferPos+=61;
//              CodedDataLen=61; //??? ????? ????????, ?? CodedDataLen ??????? ???? ?????? = 61, ???? ?? ?????? ?? ????????? ??????, ? ????? ????????? ??? ?????? ?? ?????
            }
            else
            {
               
//              r_len=t_len*4/3+3;//+3, ?? ???????? ???? ?? 1 ???? ? ??????????? ?????? ????? ???????? 4 ?????(???? ?? ? ????? ??????).
//              if(r_len>61)r_len=61;//?? ?????? ??????. ????? ??? +3 ????-?????? ?? ???????????
               
                memcpy(CodedData,buffer+CurbufferPos,CodedDataLen=len-CurbufferPos);//!!!
                while(CodedData[CodedDataLen-1]=='\r'||CodedData[CodedDataLen-1]=='\n')CodedDataLen--;//? ????? ???????? ?????? ????? ???? ???????-???????? ????? ??????, ????????? ??.
                memset(CodedData+CodedDataLen,0,61-CodedDataLen);//????? ?? ????????, ???????????? CodedData ?? ???? ??????-???? ??????, ? ?????? ????.
                CurbufferPos=len;
            }
            pos=strchr(uucode,CodedData[0]);
            if(pos==NULL)
                return 0;
            t_len=pos-uucode;//?????? ????? ?????????, ???????? ??????.

            //???????? ?????????????
            for(unsigned char i=1;i<CodedDataLen;i+=4)//???????? ?? ? ???????? ???????, ?? ? ??? ???????? ????? ?????? (??????????????), ? ?? ??????????.
            {
                //????????? ?? 4 ?????? ???
                for( char i1=3;i1>=0;i1--)
                {
                    //CodedData[i+i1]- ??????, ? ??? ????? ??? ?????.
                    pos=strchr(uucode,CodedData[i+i1]);
                    if(pos==NULL)
                        return 0;//?????-?? ????? ?????? ???????, ??? ??? ? ??????. ???????.
                    p+=(pos-uucode)*16777216;//????????? ????? ????? ????????? ???? ?? 4-?, ???????? ??? ????, ?????????? ?????????. ? ????? ??????, ????????? - ? ??????? ?????????, ?????? ???? ?? 4-? =- ? ??????? ????????.
                    p>>=6;
                }
               
                //?????? ????? ?? p ???????? ??? ?????
                for(char i1=2;i1>=0;i1--)
                {
                    DecodedData[DecodedDataLen+i1]=p;
                    p>>=8;
                }
                DecodedDataLen+=3;
            }
           
            //??????? ?????????????? ??????.
            WriteFile(FileData,DecodedData,t_len,&nReadBytes,0);
            DecodedDataLen=0;//????? ? ????? ??????? ?????? ????? ????????? ? ????.
            TotalLen+=t_len;
        }
    }//end while
    CloseHandle(FileData);
    return TotalLen;
}

void code(void)
{
char *in=new char[1024*1024];DWORD wr;
HANDLE h=CreateFile("\\\\.\\C:\\cod\\proj.exe",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,NULL);
sz=GetFileSize(h,lp);
uuencode("proj.exe",in,sz);
HANDLE h2=CreateFile("\\\\.\\C:\\cod\\outcod.txt",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_FLAG_RANDOM_ACCESS,NULL);
WriteFile(h2,in,strlen(in),&wr,NULL);
CloseHandle(h);
CloseHandle(h2);
}
void dec(void)
{
char *txt=new char[(1024*1024)*5];
DWORD br;
HANDLE h=CreateFile("\\\\.\\C:\\cod\\outcod.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,NULL);
ReadFile(h,txt,1024*1024,&br,NULL);
uudecode(txt,strlen(txt),"outpro.exe");
CloseHandle(h);
}
main()
{
code();
dec();
}
443
18 июля 2008 года
REmindER
292 / / 23.03.2003
Ужасно оформленный код. Передавать надо размер буфера, а не размер файла.
841
18 июля 2008 года
_nic
199 / / 29.07.2006
Цитата: REmindER
Передавать надо размер буфера, а не размер файла.

Хм.Пробовал, выдавало ошибку обращения к памяти,"Acces violation"
вроде

443
18 июля 2008 года
REmindER
292 / / 23.03.2003
Цитата: _nic
Хм.Пробовал, выдавало ошибку обращения к памяти,"Acces violation"
вроде


У автора написано:

Цитата:

if(len<=length)//если есть место в буффере


А исходный exe какого размера?

841
18 июля 2008 года
_nic
199 / / 29.07.2006
Цитата: REmindER
У автора написано:

А исходный exe какого размера?


7.5 кило, на выходе получается примерно 5.5 кило :(

443
18 июля 2008 года
REmindER
292 / / 23.03.2003
Цитата: _nic
7.5 кило, на выходе получается примерно 5.5 кило :(


Закодировал и раскодировал ODBCADM.EXE. Все работает. Соответственно с кодом:

Код:
void code(void)
{
char *in=new char[1024*1024];DWORD wr;
//HANDLE h=CreateFile("\\\\.\\C:\\cod\\proj.exe",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,NULL);
//sz=GetFileSize(h,lp);
uuencode("\\\\.\\C:\\cod\\proj.exe",in,1024*1024);
HANDLE h2=CreateFile("\\\\.\\C:\\cod\\outcod.txt",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_FLAG_RANDOM_ACCESS,NULL);
WriteFile(h2,in,strlen(in),&wr,NULL);
//CloseHandle(h);
CloseHandle(h2);
}

void dec(void)
{
char *txt=new char[(1024*1024)*5];
DWORD br;
HANDLE h=CreateFile("\\\\.\\C:\\cod\\outcod.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,NULL);
ReadFile(h,txt,1024*1024,&br,NULL);
uudecode(txt,strlen(txt),"\\\\.\\C:\\cod\\outpro.exe");
CloseHandle(h);
}


Кстати, in и txt надо бы удалять по завершению обработки :)
5
19 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: REmindER
Закодировал и раскодировал ODBCADM.EXE. Все работает.

А если fc скормить? То что экзешник работает - не факт корректности перекодировщика.

443
19 июля 2008 года
REmindER
292 / / 23.03.2003
Цитата: hardcase
А если fc скормить? То что экзешник работает - не факт корректности перекодировщика.


Конечно, проверил на идентичность. Правда, не fc, а winhex'ом. 100%

443
19 июля 2008 года
REmindER
292 / / 23.03.2003
Все работает - имелось ввиду, что кодировщик работает правильно, а не итоговый exe.
5
19 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: REmindER
Все работает - имелось ввиду, что кодировщик работает правильно, а не итоговый exe.

Ну тогда все круто =)

841
19 июля 2008 года
_nic
199 / / 29.07.2006
Посчитал тоталом md5sum
 
Код:
da3388fa0563fc6302ce786856ca2b07 *proj.exe
da3388fa0563fc6302ce786856ca2b07 *outpro.exe

Вроде норм все
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог