powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передать массив байт через cmd без ошибок в общем случае как-то могу?
10 сообщений из 35, страница 2 из 2
Передать массив байт через cmd без ошибок в общем случае как-то могу?
    #39493637
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODEИзопропил,
Я вернусь домой, сброшу тестовое приложение по перехвату ввода/вывода телнета.
Сам запустишь и увидишь.
зачем мне какое-то приложение, мне Wireshark достаточно

PS надеюсь речь идёт о telnet в смысле RFC 854/5198
...
Рейтинг: 0 / 0
Передать массив байт через cmd без ошибок в общем случае как-то могу?
    #39493640
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Да всё равно потоки лучше, передавать сертификат в base64 в командной строки, совсем убогий костыль.
...
Рейтинг: 0 / 0
Передать массив байт через cmd без ошибок в общем случае как-то могу?
    #39493642
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttИзопропил,

Да всё равно потоки лучше, передавать сертификат в base64 в командной строки, совсем убогий костыль.
с этим я полностью согласен,

меня интересует мифическая "защита в телнете"
...
Рейтинг: 0 / 0
Передать массив байт через cmd без ошибок в общем случае как-то могу?
    #39493686
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODEКомандная строка легко перехватывается -
Террористами, вирусами. Госп..., как тяжело жить то стало.
А файл воруется. Да плевать.

Маслица подлить вам в костерок?
Никто еще не смотрел мой код (мы ж писатели) в котором устанавлен пароль на серт. "12345", а я и в продакшн так оставил, гы.
Счас начнется, пароль ненадежный, да и раздебажить .Net-exe-шник наверно можно.
Ну не надоело?
...
Рейтинг: 0 / 0
Передать массив байт через cmd без ошибок в общем случае как-то могу?
    #39493719
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 ,
ok, я Вас понял. Как хотите.
---
Отвечу для Изопропил
Все мои эксперименты с telnet.exe были в 2005 году.
Тогда я обнаружил, что ее поведение отличается от поведения обычных консольных программ,
таких как ftp.exe и cmd.exe
Но внешне - ее поведение такое же.
Я предположил, что используется некий механизм разрганичения прав на доступ к потокам программы.
Далее не углублялся.

А сейчас, пока писал - подумал, что раз ею можно управлять через отправку клавиатурных команд типа SendMessage,
то потоки могут вообще не использоваться как способ ввода.

эксперимент (C++Builder - консольное с vcl):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
 #include <vcl.h>
#include <windows.h>

#pragma hdrstop
#pragma argsused

#include <tchar.h>
#include <stdio.h>
#include <conio.h>



bool IsWinNT()  //проверка запуска под NT
{
  OSVERSIONINFO osv;
  osv.dwOSVersionInfoSize = sizeof(osv);
  GetVersionEx(&osv);
  return (osv.dwPlatformId == VER_PLATFORM_WIN32_NT);
}

void  Log(AnsiString LogMessage)
{
OemToChar(LogMessage.c_str(),LogMessage.c_str());
  FILE * F;
  AnsiString LogFileName=ExtractFileName(Application->ExeName)+".log";

		 if((F=fopen(LogFileName.c_str(),"a+"))==NULL) return;
		 fwrite(LogMessage.c_str(),LogMessage.Length(),1,F);

         fclose(F);
}

void ErrorMessage(char *str)  //вывод подробной информации об ошибке
{

  LPVOID msg;

  FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // язык по умолчанию
    (LPTSTR) &msg,
    0,
	NULL
  );
  Log(String ((LPTSTR) &msg));
  printf("%s: %s\n",str,msg);
  LocalFree(msg);

}



#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{

//------------ CreateProcess и Anonymous Pipes------
#define bzero(a) memset(a,0,sizeof(a))

  char buf[1024];           //буфер ввода/вывода

  STARTUPINFO si;
  ZeroMemory(&si,sizeof(STARTUPINFO));
  SECURITY_ATTRIBUTES sa;
  SECURITY_DESCRIPTOR sd;        //структура security для пайпов
  PROCESS_INFORMATION pi;

  HANDLE newstdin,newstdout,read_stdout,write_stdin;  //дескрипторы
                                                      // пайпов


  if (IsWinNT())        //инициализация security для Windows NT
  {
    InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(&sd, true, NULL, false);
    sa.lpSecurityDescriptor = &sd;
  }

  else sa.lpSecurityDescriptor = NULL;

  sa.nLength = sizeof(SECURITY_ATTRIBUTES);
  sa.bInheritHandle = true;       //разрешаем наследование дескрипторов


  if (!CreatePipe(&newstdin,&write_stdin,&sa,0))   //создаем пайп
                                                   // для stdin
  {
    ErrorMessage("CreatePipe");
    getch();
    return 0;
  }

  if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) //создаем пайп
                                                  // для stdout
  {
    ErrorMessage("CreatePipe");
    getch();
    CloseHandle(newstdin);
    CloseHandle(write_stdin);
    return 0;
  }



  GetStartupInfo(&si);      //создаем startupinfo для
                            // дочернего процесса

  /*

  Параметр dwFlags сообщает функции CreateProcess
  как именно надо создать процесс.

  STARTF_USESTDHANDLES управляет полями hStd*.
  STARTF_USESHOWWINDOW управляет полем wShowWindow.

  */
  si.cb = sizeof (si);                                      //  STARTF_USESTDHANDLES|
  si.dwFlags =STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
  si.wShowWindow =SW_HIDE;  // SW_SHOW   ;
  si.hStdOutput = newstdout;
  si.hStdError = newstdout;   //подменяем дескрипторы для
  si.hStdInput = newstdin;    // дочернего процесса
  si.lpDesktop=NULL;
  si.lpTitle = NULL;


  char app_spawn[] = "C:\\WINDOWS\\system32\\cmd.exe";

  //создаем дочерний процесс

  if (!CreateProcess(app_spawn,NULL,NULL,NULL,TRUE, NULL,
                      NULL ,NULL,&si,&pi))
 {
    ErrorMessage("CreateProcess");
    getch();
    CloseHandle(newstdin);
    CloseHandle(newstdout);
    CloseHandle(read_stdout);
    CloseHandle(write_stdin);
    return 0;
  }

  Log("\r\n__START__\r\n");

  unsigned long exit=0;  //код завершения процесса
  unsigned long bread;   //кол-во прочитанных байт
  unsigned long avail;   //кол-во доступных байт



  bzero(buf);

  for(;;)      //основной цикл программы
  {
    GetExitCodeProcess(pi.hProcess,&exit); //пока дочерний процесс
                                           // не закрыт
    if (exit != STILL_ACTIVE)
     break;

    PeekNamedPipe(read_stdout,buf,1023,&bread,&avail,NULL);

    //Проверяем, есть ли данные для чтения в stdout

    if (bread != 0)
    {
      bzero(buf);
      if (avail > 1023)
      {
        while (bread >= 1023)
        {
          ReadFile(read_stdout,buf,1023,&bread,NULL);  //читаем из
          Log(String ( buf));                                            // пайпа stdout
          printf("%s",buf);
          bzero(buf);
        }
      }

      else {
        ReadFile(read_stdout,buf,1023,&bread,NULL);
        Log(String ( buf));
        printf("%s",buf);
      }
    }

    if (kbhit())      //проверяем, введено ли что-нибудь с клавиатуры
    {
      bzero(buf);
      *buf = (char)getche();

      //printf("%c",*buf);
     Log(String ( buf));
      WriteFile(write_stdin,buf,1,&bread,NULL); //отправляем это
                                                // в stdin

     if (*buf == '\r' ||*buf == '\n' )
        {
        *buf = '\n';
        printf("%c",*buf);
        WriteFile(write_stdin,buf,1,&bread,NULL); //формирум конец
        Log(String ( buf));
         }                                          //строки, если нужно


    }
    Sleep(250);
  }

  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
  CloseHandle(newstdin);            //небольшая уборка за собой
  CloseHandle(newstdout);
  CloseHandle(read_stdout);
  CloseHandle(write_stdin);


  printf("PRESS ANY KEY TO EXIT - PIPE CATCHER PROCESS STOPPED");
  getch();
}


В этом коде жестко зашит вызов CMD.EXE, а наша программа перехватывает весь ее ввод/вывод
и пишет все в лог.
Не выключая программы - вызовите FTP.EXE и увидите, что теперь общаетесь с ней, можете передавать файлы на сервер и обратно, и все будет записано в лог.
А теперь выйдите из ftp.exe и запустите telnet.exe - облом.
Телнет стартовал, но связь с ним отсутствует по стандартным каналам ввода/вывода.
Либо он вообще не использует их, либо принудительно ограничивает доступ.
...
Рейтинг: 0 / 0
Передать массив байт через cmd без ошибок в общем случае как-то могу?
    #39493723
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODE,
бодался я когда-то с французами на тему неработающего перехвата, который как раз был очень нужен, но не работал:

Чтение результатов работы "упрямого" консольного приложения

Чтение результатов работы консольного приложения

Так, поностальгировал, возможно не в кассу.
...
Рейтинг: 0 / 0
Передать массив байт через cmd без ошибок в общем случае как-то могу?
    #39493757
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Маслица подлить вам в костерок?
Никто еще не смотрел мой код (мы ж писатели) в котором устанавлен пароль на серт. "12345", а я и в продакшн так оставил, гы.

Какие пароли ты ставишь на серт, к разработке не относится. Дело твоё.


Дмитрий77Счас начнется, пароль ненадежный, да и раздебажить .Net-exe-шник наверно можно.
Ну не надоело?

Не начнётся. Сказано было про убогость решения передачи серта через параметры командной строки.
...
Рейтинг: 0 / 0
Передать массив байт через cmd без ошибок в общем случае как-то могу?
    #39493838
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODEТелнет стартовал, но связь с ним отсутствует по стандартным каналам ввода/вывода.
Либо он вообще не использует их, либо принудительно ограничивает доступ.
это очевидно - ему ж терминал нужно эмулировать, на "доступ" насрать,
поэтому и использует консольные функции https://docs.microsoft.com/en-us/windows/console/console-functions
...
Рейтинг: 0 / 0
Передать массив байт через cmd без ошибок в общем случае как-то могу?
    #39493999
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
Ваша правда.
Я ожидал такое поведение от какого-нибудь НортонКоммандера,
а про терминал, что-то не подумал, что может быть так.
...
Рейтинг: 0 / 0
Передать массив байт через cmd без ошибок в общем случае как-то могу?
    #39494002
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опечатка: про телнет имелось в виду.
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передать массив байт через cmd без ошибок в общем случае как-то могу?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]