#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)//âûïîëíÿåò êîäèðîâàíèå â uuencode åñëè ôàéë îòêðûòü íå óäàëîñü, èëè áóôôåð ñëèøêîì ìàëåíüêèé, ÷òîá çàïèõíóòü òóäà çàêîäèðîâàííûé ôàéë - âîçâðàùàåò 0 èíà÷å âîçâðàùàåò ðàçìåð çàêîäèðîâàííîãî ôàéëà
{
unsigned char ReadData[45];//èñõîäíàÿ ñòðîêà
unsigned char ResData[61];//çàêîäèðîâàííàÿ ñòðîêà
unsigned long p=0;
unsigned long len=0;
unsigned long CurResBufferPos=0;//ñ ýòîé ïîçèöèè â ðåçóëüòèðóþùèé áóôåð çàíîñèòüñÿ î÷åðåäíàÿ çàêîäèðîâàííàÿ ñòðîêà
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);//çàïîëíÿåì âñå íóëÿìè, äëÿ òîãî, ÷îáû åñëè â ñòðîêå *** áóäåò ïîïûòêà
//çàëåçòü çà nReadBytes, òàêîå âîçìîæíî, òê i óâåäè÷èâàåòñÿ êàæäûé ðàç íà 3,
//òî ëèøíèå áàéòû íå áóäóò ñîäåðæàòü ìóñîðà, à íóëè íå èñïîðòÿò íóæíûå äàííûå
ReadFile(FileData,ReadData,45,&nReadBytes,NULL);//ïðî÷èòàëè ñòðîêó 45 áàéò
if (nReadBytes==0) return len;//íà òîò ñëó÷àé, åñëè ðàçìåð ôàéëà êðàòåí 45. èíà÷å áû ìû ÷èòàëè 0 áàéò, È ÝÒÎÒ ÍÎËÜ ØÅË ÁÛ ÒÎÆÅ Â ÎÒÑËÛÊÓ.
//çàêîäèðóåì åå.
j=1;//èòåðàòîð äëÿ ResData íà÷ ñ 1 òê â ïåðâîì(ñ èíäåêñîì 0) áàéòå ñîäåðæ äëèíà ñòðîêè
ResData[0]=nReadBytes;//êîëè÷åñòâî áàéòîâ â èñõîäíîé ñòðîêå. -1 íå íàäî, õîòÿ ïîòîì ýòî áóäåò ïðåîáðàçîâàíî â íîìåð ñèìâîëà â ñòðîê uucode. à íóìåðàöèÿ èäåò ñ íóëÿ.
for(unsigned int i=0;i<nReadBytes;i+=3)//êîäèðóåì ïî òðè áàéòà
{
//memcpy(&p,ReadData+i,3);//òåìíîå ìåñòî. Ìàøèííîçàâèñèìî.
//çàñîâûâàåì âñå òðè áàéòà â îäíî ïîëå äàííûõ (ò÷îáû îíè áûëè ðàñïîëîæåíû ïîäðÿä.
//äåëàåì èç 3 áàéòîâ 4.
p=ReadData[i+2]+ReadData[i+1]*256+ReadData*65536;//ñòðîêà ***
for(unsigned char i1=0;i1<3;i1++)
{
tmpchar=p;
tmpchar<<=2;//âûäåëÿåì ïîñëäåíèå 6 áèò
tmpchar>>=2;//
ResData[j+3-i1]=tmpchar;
p>>=6;//ñäâèãàåì íà ýòè 6 áèò
}
ResData[j]=p;//â p îñòàëèñü òîëüêî ïîñëäåíèå 6 áèò. Èõ è çàíåñåì â ðåçóëüòèðóþùóþ ñòðîêó.
j+=4;
}
len+=j+1;//j - ñêîëüêî áàéòîâ â ResData, ïëþñ îäèí áàéò - êîíåö ñòðîêè
//òåïåðü çàêîäèðîâàííóþ ñòðîêó íóæíî çàíåñòè â ðåçóëüòèðóþùèé áóôôåð
if(len<=length)//åñëè åñòü ìåñòî â áóôôåðå
{
for(unsigned char i1=0;i1<j;i1++)//íóæíî ïåðåíåñòè j ñèìâîëîâ
{
buffer[CurResBufferPos+i1]=uucode[ResData[i1]];//-1 òê â uucode íóìåðàöèÿ íà÷èíàåòñÿ ñ íóëÿ
}
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();
}
Перекодировать бинарный файл в текстовый
А то я кроме MIME ничего больше немогк припомнить :(
Ну а чем тебя не устраивает base64 ?
Цитата: Green
Ну а чем тебя не устраивает base64 ?
Хотелось бы попроще :rolleyes:
и так всё просто, а если вопрос в реализации -
http://www.codenet.ru/progr/cpp/UUEncode-Base64.php Там с ней идет интересный исходник.Попытался я использовать из него ф-ции uuencode и uudecode что бы закодировать и раскодировать exe файл.Но только ниче невышло :( Куда то пропадает около 2 кбайт на выходе хотя начало выходного exe идентично с входным.Помогите распутать эту ситуация кому несложно.
Вот статю нашел на эту тему
Код:
Ужасно оформленный код. Передавать надо размер буфера, а не размер файла.
Цитата: REmindER
Передавать надо размер буфера, а не размер файла.
Хм.Пробовал, выдавало ошибку обращения к памяти,"Acces violation"
вроде
Цитата: _nic
Хм.Пробовал, выдавало ошибку обращения к памяти,"Acces violation"
вроде
вроде
У автора написано:
Цитата:
if(len<=length)//если есть место в буффере
А исходный exe какого размера?
Цитата: REmindER
У автора написано:
А исходный exe какого размера?
А исходный exe какого размера?
7.5 кило, на выходе получается примерно 5.5 кило :(
Цитата: _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);
}
{
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 надо бы удалять по завершению обработки :)
Цитата: REmindER
Закодировал и раскодировал ODBCADM.EXE. Все работает.
А если fc скормить? То что экзешник работает - не факт корректности перекодировщика.
Цитата: hardcase
А если fc скормить? То что экзешник работает - не факт корректности перекодировщика.
Конечно, проверил на идентичность. Правда, не fc, а winhex'ом. 100%
Все работает - имелось ввиду, что кодировщик работает правильно, а не итоговый exe.
Цитата: REmindER
Все работает - имелось ввиду, что кодировщик работает правильно, а не итоговый exe.
Ну тогда все круто =)
Код:
da3388fa0563fc6302ce786856ca2b07 *proj.exe
da3388fa0563fc6302ce786856ca2b07 *outpro.exe
da3388fa0563fc6302ce786856ca2b07 *outpro.exe
Вроде норм все