У меня возникли проблемы с записью WString в STDIN дочернего процесса. Если у меня есть только строка символов acii (например: @ WSX3edc), код работает нормально, но если он содержит символ не ascii (например: @ WSX3edcß), он терпит неудачу.Как отправить буфер wstring в stdin дочернего процесса?
Детский процесс - 7zr.exe (версия 7Zip cmd). Вход, который я пишу в STDIN, является паролем для извлечения файла.
// inject password
wPassword.append(password);
wPassword.append(L"\n"); \\For carriage return
...
DWORD dwBytesToWrite = wPassword.length()*sizeof(wchar_t);
DWORD dwBytesWritten = 0;
char szBuffer[1024] = "\0";
wcstombs(szBuffer, wPassword.c_str(),wcslen(wPassword.c_str())+1);
dwBytesToWrite = strlen(szBuffer);
if (!WriteFile(hInput, szBuffer, dwBytesToWrite, &dwBytesWritten, NULL)) {
std::cout<<"write file failed"<<GetLastError()<<std::endl;
goto Cleanup;
}
Файл записи всегда преуспевает, но некоторые из них, как извлечение файла не удается из-за неправильного ввода пароля.
CreateProcess для этого выглядит следующим образом: (объект си имеет STDIN и STDOUT потоков с использованием набора CreatePipe ранее)
if(!CreateProcess((LPWSTR)cmd, (LPWSTR)cmdArgs, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS,
NULL, NULL, &si, &pi)) {
std::cout<<"7zr.exe process creation failed "<<GetLastError()<<std::endl;
goto Cleanup;
}
Примечание: 7zr.exe прекрасно работает с этим конкретным паролем, если мы запустим в командной строке и вставьте этот пароль. Добыча отлично работает.
Если добавить пароль к команде самостоятельно, используя -p, этот пароль можно увидеть на процесс проводниковых инструментов. Это проблема безопасности. следовательно, непосредственно отдавая предпочтение stdin. 7zr.exe отлично работает с этим конкретным паролем, если мы запустим его в командной строке и вставим этот пароль. Добыча отлично работает. – gkns
Проблема безопасности должна быть отдельным вопросом. Пожалуйста, не аннулируйте текущие ответы, добавив это требование к вопросу. Но я отвечу на него здесь, так как это так просто: если кто-то контролирует доступ к компьютеру, все ставки не действуют. злоумышленника. Остается только защититься от обычных пользователей, которые спотыкаются о пароле и ненадлежащим образом используют его. Вы можете защититься от этого с суровым предупреждением. Да, это один хороший ответ. Потому что это не проблема безопасности. Точно так же, как Microsoft UAC - это раздражение, а не безопасность, а маркетинг. –
Ох. Обратите внимание, что в командной строке кодируется UTF-16. Обычно стандартный поток ввода, по заявлению, считается кодировкой Windows ANSI. Где Windows ANSI - это кодовая страница, заданная API-интерфейсом GetACP. –