Подтвердить что ты не робот

Как файл .bat может быть "преобразован" в .exe без сторонних инструментов?

Есть много причин, чтобы "преобразовать" .bat в .exe - скрыть/обфускать реализацию, пароли, путь к ресурсам, создать службу из пакетного файла... и главным образом сделать вашу работу выглядеть более сложным и важным, чем есть на самом деле.

Есть также много причин не хотеть использовать сторонние инструменты.

Итак, что, если вы хотите "конвертировать" пакетный файл в .exe без внешнего программного обеспечения? (конвертировать в кавычки, потому что я не думаю, что есть действительно способ скомпилировать пакетный файл для исполняемого файла. Существует слишком много злоупотребляющих твистских методов и ошибок, которые широко используются, и все инструменты, которые я знаю, фактически создают временный файл .bat и затем назовите его)

4b9b3361

Ответ 1

Один очень очевидный подход заключается в использовании IEXPRESS - древнего встроенного инструмента, который создает самораспаковывающиеся пакеты и способен выполнять команды после извлечения. Итак, вот IEXPRESS sed-directive/.bat файл, который создает самораспаковывающийся .exe с упакованным .bat. Он принимает два аргумента - файл .bat, который вы хотите преобразовать, и целевой исполняемый файл:

 ;@echo off
; rem https://github.com/npocmaka/batch.scripts/edit/master/hybrids/iexpress/bat2exeIEXP.bat
;if "%~2" equ "" (
; echo usage: %~nx0 batFile.bat target.Exe
;)
;set "target.exe=%__cd__%%~2"
;set "batch_file=%~f1"
;set "bat_name=%~nx1"
;set "bat_dir=%~dp1"

;copy /y "%~f0" "%temp%\2exe.sed" >nul

;(echo()>>"%temp%\2exe.sed"
;(echo(AppLaunched=cmd.exe /c "%bat_name%")>>"%temp%\2exe.sed"
;(echo(TargetName=%target.exe%)>>"%temp%\2exe.sed"
;(echo(FILE0="%bat_name%")>>"%temp%\2exe.sed"
;(echo([SourceFiles])>>"%temp%\2exe.sed"
;(echo(SourceFiles0=%bat_dir%)>>"%temp%\2exe.sed"
;(echo([SourceFiles0])>>"%temp%\2exe.sed"
;(echo(%%FILE0%%=)>>"%temp%\2exe.sed"


;iexpress /n /q /m %temp%\2exe.sed

;del /q /f "%temp%\2exe.sed"
;exit /b 0

[Version]
Class=IEXPRESS
SEDVersion=3
[Options]
PackagePurpose=InstallApp
ShowInstallProgramWindow=0
HideExtractAnimation=1
UseLongFileName=1
InsideCompressed=0
CAB_FixedSize=0
CAB_ResvCodeSigning=0
RebootMode=N
InstallPrompt=%InstallPrompt%
DisplayLicense=%DisplayLicense%
FinishMessage=%FinishMessage%
TargetName=%TargetName%
FriendlyName=%FriendlyName%
AppLaunched=%AppLaunched%
PostInstallCmd=%PostInstallCmd%
AdminQuietInstCmd=%AdminQuietInstCmd%
UserQuietInstCmd=%UserQuietInstCmd%
SourceFiles=SourceFiles

[Strings]
InstallPrompt=
DisplayLicense=
FinishMessage=
FriendlyName=-
PostInstallCmd=<None>
AdminQuietInstCmd=
UserQuietInstCmd=

пример:

bat2exeIEXP.bat  myBatFile.bat MyExecutable.exe

Это должно работать практически на каждой машине с Windows, но имеет одно важное ограничение - вы не можете передавать аргументы в созданный файл .exe

Так что еще один возможный подход - посмотреть на .NET-компиляторы (опять же, они должны быть доступны почти на каждой выигрышной машине). Я выбрал Jscript.net Это гибридный jscript.net/.bat который будет читать содержимое файла .batch. Создаст еще один jscript.net с содержимым файла .bat, а после компиляции создаст новый файл bat в папке temp и вызовет его..A будет принимать аргументы командной строки. (Объяснение может показаться сложным, но на самом деле это просто):

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal

del %~n0.exe /q /s >nul 2>nul

for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
)

%~n0.exe  "%jsc%" %*
del /q /f %~n0.exe 1>nul 2>nul 
endlocal & exit /b %errorlevel%
*/

//https://github.com/npocmaka/batch.scripts/blob/master/hybrids/.net/bat2exe.bat
import System;
import System;
import System.IO;
import  System.Diagnostics;


var arguments:String[] = Environment.GetCommandLineArgs();
if (arguments.length<3){
    Console.WriteLine("Path to cmd\bat file not given");
    Environment.Exit(1);
}

var binName=Path.GetFileName(arguments[2])+".exe";
if(arguments.length>3){
    binName=Path.GetFileName(arguments[3]);
}
var batchContent:byte[]= File.ReadAllBytes(arguments[2]);
var compilerLoc=arguments[1];

var content="["

for (var i=0;i<batchContent.length-1;i++){
    content=content+batchContent[i]+","
}
content=content+batchContent[batchContent.length-1]+"]";
var temp=Path.GetTempPath();
var dt=(new Date()).getTime();
var tempJS=temp+"\\2exe"+dt+".js";


var toCompile="\r\n\
import System;\r\n\
import System.IO;\r\n\
import  System.Diagnostics;\r\n\
var batCommandLine:String='';\r\n\
//Remove the executable name from the command line\r\n\
try{\r\n\
var arguments:String[] = Environment.GetCommandLineArgs();\r\n\
batCommandLine=Environment.CommandLine.substring(arguments[0].length,Environment.CommandLine.length);\r\n\
}catch(e){}\r\n\
var content2:byte[]="+content+";\r\n\
var dt=(new Date()).getTime();\r\n\
var temp=Path.GetTempPath();\r\n\
var nm=Process.GetCurrentProcess().ProcessName.substring(0,Process.GetCurrentProcess().ProcessName.length-3);\r\n\
var tempBatPath=Path.Combine(temp,nm+dt+'.bat');\r\n\
File.WriteAllBytes(tempBatPath,content2);\r\n\
var pr=System.Diagnostics.Process.Start('cmd.exe','/c '+' '+tempBatPath+' '+batCommandLine);\r\n\
pr.WaitForExit();\r\n\
File.Delete(tempBatPath);\r\n\
";

File.WriteAllText(tempJS,toCompile);
var pr=System.Diagnostics.Process.Start(compilerLoc,'/nologo /out:"'+binName+'" "'+tempJS+'"');
pr.WaitForExit();
File.Delete(tempJS);

Это скорее POC, но библиотеки .NET System.Diagnostics и System.IO достаточно мощные, чтобы добавлять такие функции, как скрытый запуск, шифрование и т.д. Вы также можете проверить параметры компиляции jsc.exe, чтобы увидеть, на что еще способен (например, добавить ресурсы).).

Я обещаю приветствовать каждое улучшение по сравнению с методом .NET :-)

ОБНОВЛЕНИЕ: второй скрипт был изменен, и теперь исполняемый файл из преобразованного файла bat может быть запущен двойным щелчком. Он использует тот же интерфейс, что и предыдущий скрипт:

bat2exejs.bat example.bat example.exe

Ответ 2

Я знаю, как конвертировать bat/cmd в exe вручную, убедитесь, что имя файла bat/cmd содержит только буквы и цифры. Откройте " Мастер IExpress " в качестве администратора.

  1. Выберите "Создать новый файл директивы самоизвлечения"
  2. Выберите "Извлечь файлы и запустить команду установки".
  3. Назовите пакет что-нибудь
  4. "Нет запроса" для "Подтверждение запроса"
  5. "Не отображать лицензию" для "Лицензионного соглашения"
  6. Нажмите "Добавить" для "Упакованных файлов", оттуда выберите файл bat/cmd
  7. Затем в текстовом поле "Установить программу" для "Установить программу для запуска" введите cmd/c, а затем полное имя файла bat/cmd (пример: emptyrecyclebin.bat => cmd/c emptyrecyclebin.bat)
  8. Оставьте "Команду после установки" как есть
  9. "Скрыто" для "Показать окно"
  10. "Нет сообщения" для "Готового сообщения"
  11. Нажмите "Обзор" и выберите, куда загрузить файл
  12. Включить "Скрыть файл извлечения анимации прогресса от пользователя"
  13. Отключить "Хранить файлы, используя длинное имя файла внутри пакета"
  14. Определенно "Нет перезагрузки" для "Настроить перезагрузку"
  15. Затем сохраните SED, если вы хотите перекомпилировать его позже
  16. Тогда создайте пакет! Окно команд должно быстро появиться и исчезнуть
  17. Перейдите к месту, где вы скачали исполняемый файл, и наслаждайтесь !