ivantu |
Отправлено: 04 Июня, 2019 - 14:12:40
|
Эксперт
Покинул форум
Сообщений всего: 732
Дата рег-ции: Нояб. 2013
Репутация: 14
|
Уважаемый друзья, подскажите пожалуйста, есть ли возможность отправлять как то через кибор команды для "Командной строки" извиняюсь за тавтологию, очень нужно, это поможет многим кто пишет ботов по эмуляторы андроид делать ботов скрытими, как это работает?
Есть такая чтука как ADB работает оно через командную строку, скачал архив, извлек три файла, через командную строку windows "win+r" - > cmd открываем скаченный файлик, и нам запускаем эмулятор затем в коммандной строке пишем adb devices , если все хорошо то покапжет список подключенных устройств, дальше все просто, нам открывается практический полный контроль над андроидом, от установки и удалением программ, создание скриншотов (даже если эмулятор СВЕРНУТ), что дает нам 100% работу бота в фоне, если не ошибаюсь даже можо делать тапы(нажатия) по экрану програмно, проще говоря вещь полезная, у меня полукчилось запустить поделать скриншоты, но через командную строку windows, вот я и хотел узнать можно как то это дело подружить с кибор, или как то подавать команды чтоб пользователь не видел командную строку, Спасибо.
Вот ссылка откуда обучался этому делу.
http://xakep.ru/2016/05/12/android-adb/#toc01.(Отредактировано автором: 04 Июня, 2019 - 14:17:10) |
|
|
Zireael |
Отправлено: 04 Июня, 2019 - 14:47:08
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
CODE:#define SW_HIDE 0
#define SW_SHOW 5
external(INT, "ShowWindow", "ShowWindow", "User32.dll");
win cmd=window (-1, "ConsoleWindowClass", -1); // окно cmd
if(cmd)
{
ShowWindow(formatwi(cmd), SW_HIDE); // скрыть окно cmd
// дальше любые команды
command("HELP"); // показать список команд
command("start %SystemRoot%\System32\calc.exe"); // открыть калькулятор
sleep(2000);
ShowWindow(formatwi(cmd), SW_SHOW); // показать окно cmd если надо
}
else messagebox("Окно не найдено");
function command(string s)
{
sendkey(s, cmd);
sendkey(RETURN, cmd);
sleep(200);
} |
|
|
Kibor |
Отправлено: 04 Июня, 2019 - 14:56:17
|
Эксперт
Покинул форум
Сообщений всего: 8224
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
CODE:win cmd;
if (window (-1, "ConsoleWindowClass", -1)!=0)
{
sendmessage(WM_CLOSE, 0, 0, window (-1, "ConsoleWindowClass", -1));
}
start("%SystemRoot%\System32\cmd.exe");
while(window (-1, "ConsoleWindowClass", -1)==0)sleep(1);
cmd=window (-1, "ConsoleWindowClass", -1); // окно cmd
transparency (0, cmd);
// дальше любые команды
//command("HELP"); // показать список команд
command("start %SystemRoot%\System32\calc.exe"); // открыть калькулятор
sendmessage(WM_CLOSE, 0, 0, cmd);
function command(string s)
{
sendkey(s, cmd);
sendkey(RETURN, cmd);
sleep(200);
} |
|
|
Zireael |
Отправлено: 05 Июня, 2019 - 01:31:28
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: а можно как то чтоб побыстрее вводились команды
В настройках уменьшить паузу в нажатии и отпускании кнопок.
Цитата: как то можно из cmd отправить в кибор какую то информацию, или результат выполнения какой то команды?
Разве что через буфер обмена или через txt файл.(Отредактировано автором: 05 Июня, 2019 - 01:39:35) |
|
|
ivantu |
Отправлено: 05 Июня, 2019 - 08:39:57
|
Эксперт
Покинул форум
Сообщений всего: 732
Дата рег-ции: Нояб. 2013
Репутация: 14
|
У меня еще вопрос, этот метод ввода чувствителен к расскладке, если в данный момент раскладка русская в командную строку вводятся русские символы, есть какое то решение?
(Добавление)
еще нашел на просторах интернета, что можно команду вот так отправить, но это С++
CODE:
C++
system( "cls" );
Вот еще одна реализация:
Цитата: Вот реализация функции DosExec, которая позволяет (молча) выполнять любую команду DOS и извлекать сгенерированный вывод в виде строки в Юникоде.
CODE: // Convert an OEM string (8-bit) to a UTF-16 string (16-bit)
#define OEMtoUNICODE(str) CHARtoWCHAR(str, CP_OEMCP)
/* Convert a single/multi-byte string to a UTF-16 string (16-bit). We take advantage of the MultiByteToWideChar function that allows to specify the charset of the input string.
*/
LPWSTR CHARtoWCHAR(LPSTR str, UINT codePage) { size_t len = strlen(str) + 1; int size_needed = MultiByteToWideChar(codePage, 0, str, len, NULL, 0); LPWSTR wstr = (LPWSTR) LocalAlloc(LPTR, sizeof(WCHAR) * size_needed); MultiByteToWideChar(codePage, 0, str, len, wstr, size_needed); return wstr;
}
/* Execute a DOS command. If the function succeeds, the return value is a non-NULL pointer to the output of the invoked command. Command will produce a 8-bit characters stream using OEM code-page. As charset depends on OS config (ex: CP437 [OEM-US/latin-US], CP850 [OEM 850/latin-1]), before being returned, output is converted to a wide-char string with function OEMtoUNICODE. Resulting buffer is allocated with LocalAlloc. It is the caller responsibility to free the memory used by the argument list when it is no longer needed. To free the memory, use a single call to LocalFree function.
*/
LPWSTR DosExec(LPWSTR command){ // Allocate 1Mo to store the output (final buffer will be sized to actual output) // If output exceeds that size, it will be truncated const SIZE_T RESULT_SIZE = sizeof(char)*1024*1024; char* output = (char*) LocalAlloc(LPTR, RESULT_SIZE); HANDLE readPipe, writePipe; SECURITY_ATTRIBUTES security; STARTUPINFOA start; PROCESS_INFORMATION processInfo; security.nLength = sizeof(SECURITY_ATTRIBUTES); security.bInheritHandle = true; security.lpSecurityDescriptor = NULL; if ( CreatePipe( &readPipe, // address of variable for read handle &writePipe, // address of variable for write handle &security, // pointer to security attributes 0 // number of bytes reserved for pipe ) ){ GetStartupInfoA(&start); start.hStdOutput = writePipe; start.hStdError = writePipe; start.hStdInput = readPipe; start.dwFlags = STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; start.wShowWindow = SW_HIDE;
// We have to start the DOS app the same way cmd.exe does (using the current Win32 ANSI code-page).
// So, we use the "ANSI" version of createProcess, to be able to pass a LPSTR (single/multi-byte character string)
// instead of a LPWSTR (wide-character string) and we use the UNICODEtoANSI function to convert the given command if (CreateProcessA(NULL, // pointer to name of executable module UNICODEtoANSI(command), // pointer to command line string &security, // pointer to process security attributes &security, // pointer to thread security attributes TRUE, // handle inheritance flag NORMAL_PRIORITY_CLASS, // creation flags NULL, // pointer to new environment block NULL, // pointer to current directory name &start, // pointer to STARTUPINFO &processInfo // pointer to PROCESS_INFORMATION )){ // wait for the child process to start for(UINT state = WAIT_TIMEOUT; state == WAIT_TIMEOUT; state = WaitForSingleObject(processInfo.hProcess, 100) ); DWORD bytesRead = 0, count = 0; const int BUFF_SIZE = 1024; char* buffer = (char*) malloc(sizeof(char)*BUFF_SIZE+1); strcpy(output, ""); do { DWORD dwAvail = 0; if (!PeekNamedPipe(readPipe, NULL, 0, NULL, &dwAvail, NULL)) { // error, the child process might have ended break; } if (!dwAvail) { // no data available in the pipe break; } ReadFile(readPipe, buffer, BUFF_SIZE, &bytesRead, NULL); buffer[bytesRead] = '\0'; if((count+bytesRead) > RESULT_SIZE) break; strcat(output, buffer); count += bytesRead; } while (bytesRead >= BUFF_SIZE); free(buffer); } } CloseHandle(processInfo.hThread); CloseHandle(processInfo.hProcess); CloseHandle(writePipe); CloseHandle(readPipe); // convert result buffer to a wide-character string LPWSTR result = OEMtoUNICODE(output); LocalFree(output); return result;
}
Помогите как то грамотно отправлять команды, полезная же штука то.
(Добавление)
Еще одна на С#, помогите как то адаптировать под Кибор.
Для начало потребуется подключить пространство имён
C#:
CODE:using System.Diagnostics;
Код для выполнения:
C#:
CODE:ProcessStartInfo psi = new ProcessStartInfo();
//Имя запускаемого приложения
psi.FileName = "cmd";
//команда, которую надо выполнить
psi.Arguments = @"/k ping 127.0.0.1";
// /c - после выполнения команды консоль закроется
// /к - не закрывать консоль после выполнения команды
Process.Start(psi);
В результате Вы увидите всё то же самое, что и на последней картинке выше.
Класс ProcessStartInfo имеет перегруженный конструктор, в который сразу же можно передать имя запускаемого приложения и аргументы.
C#:
CODE:ProcessStartInfo psi;
psi = new ProcessStartInfo("cmd", @"/k ping 127.0.0.1");
Process.Start(psi);
Для запуска приложений может потребоваться указание полного пути к файлу запуска, например: запуск браузера opera.
C#:
CODE:ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"C:\Program Files\Opera\opera.exe";
Process.Start(psi); |
|
|
Zireael |
Отправлено: 05 Июня, 2019 - 11:02:28
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: если в данный момент раскладка русская в командную строку вводятся русские символы, есть какое то решение?
code (Отобразить)CODE:win cmd=window (-1, "ConsoleWindowClass", -1); // окно cmd
if(cmd)
{
send("GjvSF9fd@jg Привет", cmd, 10); // написать текст, от раскладки не зависит
}
else messagebox("Окно не найдено");
// функция принимает: текст, окно, пауза между отправкой символов
function send(string s, win w, int wait);
{
new char c[size(s)+1];
strcpy(#c[0], s);
int size_arr=sizearray(c);
for(int i=0; i<size_arr; i++)
{
int i2=formatci(c[i]);
if(i2>191) sendlanguage("00000419", w);
else sendlanguage("00000409", w);
postmessage(WM_CHAR, i2, 1, w); sleep(wait);
}
delete c;
}
Цитата: system( "cls" );
cls очистит консоль. |
|
|
ivantu |
Отправлено: 05 Июня, 2019 - 11:23:42
|
Эксперт
Покинул форум
Сообщений всего: 732
Дата рег-ции: Нояб. 2013
Репутация: 14
|
Спасибо Уважаемый Zireael, последний вариант уже имеет место на существование, только я заметил что иногда, по не понятным причинам строка полностью не успевает дописатьсяв консоль, и происходит перенос строки вводом Enter, что влечет за сабой непредсказуемые последствия, это можно как то отконтролировать?
Код (Отобразить)
CODE:
#define SW_HIDE 0
#define SW_SHOW 5
external(INT, "ShowWindow", "ShowWindow", "User32.dll");
win cmd;
if (window (-1, "ConsoleWindowClass", -1)!=0)
{
sendmessage(WM_CLOSE, 0, 0, window (-1, "ConsoleWindowClass", -1));
}
start("%SystemRoot%\System32\cmd.exe");
while(window (-1, "ConsoleWindowClass", -1)==0)sleep(1);
cmd=window (-1, "ConsoleWindowClass", -1); // окно cmd
//transparency (0, cmd);
//ShowWindow(formatwi(cmd), SW_HIDE); // скрыть окно cmd
ShowWindow(formatwi(cmd), SW_SHOW); // показать окно cmd если надо
// дальше любые команды
send("cd "+pathfolder()+"adb\", cmd, 100);
send("adb.exe", cmd, 100);
//command("cd "+pathfolder()+"adb\"); // показать список команд
//command("adb.exe");
//command("adb shell screencap \sdcard\screen.png");
//sleep(200);
//command("adb pull /sdcard/screen.png");
//command("adb shell rm -f /sdcard/screen.png");
while(cmd>0){
//sleep(1000);
//command("adb shell input keyevent 4");
send("adb shell screencap /sdcard/screen.png", cmd, 100);
send("adb pull /sdcard/screen.png", cmd, 10);
//command("adb shell screencap /sdcard/screen.png");
//command("adb pull /sdcard/screen.png");
}
//command("start %SystemRoot%\System32\calc.exe"); // открыть калькулятор
//sendmessage(WM_CLOSE, 0, 0, cmd);
// функция принимает: текст, окно, пауза между отправкой символов
function send(string s, win w, int wait);
{
new char c[size(s)+1];
strcpy(#c[0], s);
int size_arr=sizearray(c);
for(int i=0; i<size_arr; i++)
{
int i2=formatci(c[i]);
if(i2>191) sendlanguage("00000419", w);
else sendlanguage("00000409", w);
postmessage(WM_CHAR, i2, 1, w); sleep(wait);
}
sendkey(RETURN, cmd);
delete c;
}
|
|
|
|