如何在没有第三方工具的情况下将 .bat 文件“转换"为 .exe? [英] How can a .bat file be 'converted' to .exe without third party tools?

查看:26
本文介绍了如何在没有第三方工具的情况下将 .bat 文件“转换"为 .exe?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

想要将 .bat '转换' 为 .exe 的原因有很多 - 隐藏/混淆实现、密码、资源路径,以创建服务来自批处理文件......主要是为了让您的工作看起来比实际情况更复杂和重要.

There are many reasons to want to 'convert' a .bat to .exe - to hide/obfuscate implementation, passwords, path to resources , to create a service from batch file ... and mainly to make your work to look more complicated and important than it really is.

不想使用第三方工具的原因也有很多.

There are also many reasons to not want to use third party tools.

如果您想在没有外部软件的情况下将批处理文件转换"为 .exe 怎么办?(convert 用引号引起来,因为我认为没有真正的方法可以将批处理文件编译为可执行文件.有太多滥用的扭曲技术和错误被广泛使用,我知道的所有工具实际上都创建了一个临时 .bat 文件然后调用它 )

So what if you want to 'convert' a batch file to .exe without external software? (convert is in quotes because I don't think there's really way to compile a batch file to executable. There are too many abusive twisty techniques and bugs used extensively and all the tools that I know in fact create a temporary .bat file and then call it )

推荐答案

一个非常明显的方法是使用 IEXPRESS - 创建自解压包并能够执行解压后命令的古老内置工具.所以这里是 IEXPRESS sed-directive/.bat 文件,用于创建带有打包 .bat 的自解压 .exe.它接受两个参数 - 要转换的 .bat 文件和目标可执行文件:

One very obvious approach is to use IEXPRESS - the ancient built-in tool that creates self-extracting packages and is capable to execute post extraction commands. So here's IEXPRESS sed-directive/.bat file that creates a self-extracting .exe with packed .bat. It accepts two arguments - the .bat file you want to convert and the target executable:

 ;@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 文件

This should work practically on every Windows machine out there but has one major limitation - you cannot pass arguments to the created .exe file

所以另一种可能的方法是查看 .NET 编译器(同样应该在几乎每台 win 机器上都可用).我选择了 Jscript.net .这是一个混合 jscript.net/.bat 脚本,它将读取 .batch 文件内容.将在编译后使用 .bat 文件内容创建另一个 jscript.net将在临时文件夹中创建一个新的 bat 文件并调用它.并将接受命令行参数.(解释可能看起来很复杂,但实际上很简单):

So one other possible approach is to look at the .NET compilers (again should be available on almost every win machine).I've choose Jscript.net . This is a hybrid jscript.net/.bat script that will read the .batch file content.Will create another jscript.net with the .bat file content and after the compilation will create a new bat file int the temp folder and will call it.And will accept command line arguments.(explained might look complex but in fact it's simple):

@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.NETFramework*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 cmdat 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="

import System;

import System.IO;

import  System.Diagnostics;

var batCommandLine:String='';

//Remove the executable name from the command line

try{

var arguments:String[] = Environment.GetCommandLineArgs();

batCommandLine=Environment.CommandLine.substring(arguments[0].length,Environment.CommandLine.length);

}catch(e){}

var content2:byte[]="+content+";

var dt=(new Date()).getTime();

var temp=Path.GetTempPath();

var nm=Process.GetCurrentProcess().ProcessName.substring(0,Process.GetCurrentProcess().ProcessName.length-3);

var tempBatPath=Path.Combine(temp,nm+dt+'.bat');

File.WriteAllBytes(tempBatPath,content2);

var pr=System.Diagnostics.Process.Start('cmd.exe','/c '+' '+tempBatPath+' '+batCommandLine);

pr.WaitForExit();

File.Delete(tempBatPath);

";

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 库足够强大,可以添加隐藏启动、enctiption 等功能.您还可以检查 jsc.exe 编译选项以查看其他功能(比如添加资源).

It's rather a POC , but .NET System.Diagnostics and System.IO libraries are powerful enough to add features like hidden start , enctiption and etc.You can check also jsc.exe compiling options to see what else is capable of (like adding resources).

我保证对 .NET 方法的每一项改进都给予支持 :-)

I promise an upvote to every improvement over the .NET method :-)

更新:第二个脚本已更改,现在可以双击启动转换后的bat文件中的exe.它使用与以前脚本相同的界面:

UPDATE: the second script has been changed and now the exe from the converted bat file can be started with double click.It uses the same interface as previous script:

bat2exejs.bat example.bat example.exe

这篇关于如何在没有第三方工具的情况下将 .bat 文件“转换"为 .exe?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆