没有第三方工具,如何将.bat文件“转换”为.exe?

恩波科马卡

有很多理由想要“转换”.bat.exe-隐藏/混淆实现,密码,资源路径,从批处理文件创建服务...并且主要是使您的工作看起来比实际的更加复杂和重要。是。

还有很多不想使用第三方工具的原因。

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

恩波科马卡

一种非常明显的方法是使用IEXPRESS-一种古老的内置工具,该工具可以创建自解压软件包并能够执行提取后的命令。因此,这里是IEXPRESS sed指令/.bat文件,该文件创建带有压缩.bat的自解压.exe。它接受两个参数-您要转换的.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编译器(同样应该在几乎所有Win机器上都可用)。我选择了Jscript.net这是一个混合脚本jscript.net/.bat脚本,它将读取.batch文件内容。将使用.bat文件内容创建另一个jscript.net,编译后将在temp文件夹中创建一个新的bat文件并将其调用,并接受命令行参数。(解释可能看起来很复杂,但实际上很简单):

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

我承诺对.NET方法的每项改进都表示赞赏:-)

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

bat2exejs.bat example.bat example.exe

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在没有任何第三方工具的情况下将chrome中的控制台日志保存到本地文件中?

如何将字段注入TypeScript定义文件中的现有(第三方)接口中?

如何将require转换为第三方库的导入声明?

如何将第三方库导入到特定文件夹

PyInstaller / Py2exe-在单个文件编译中包含带有第三方脚本的os.system调用

是否可以在pyinstaller独立可执行文件中包含第三方app.exe文件?

如何将业务逻辑重构为域实体中的第三方服务调用?

如何将第三方js文件添加到Webpack捆绑包中?

如何将第三方Java库编译为我可以使用的jar文件?

如何在Windows中锁定文件而不进行更改或使用第三方工具?

如何在没有d.ts文件的情况下导入第三方软件包?

有没有办法防止第三方exe杀死我在nsis中的进程

如何不使用任何第三方工具或手动将UNC Windows文件路径转换为文件URI?

在Qt中使用第三方dll(没有可用的.lib文件)

密码保护任何没有任何第三方软件的文件夹?

确定没有第三方成分的音频文件的持续时间

如何使用第三方.flow文件?

如何在Spring中自动为带有注释的第三方课程接线?

如何将第三方Javascript文件“导入”到IntelliJ中,以便我可以在Typescript文件中引用它

如何将Steeltoe动态日志记录设置为与第三方记录器一起用作Serilog?

如何在具有批处理文件且没有第三方软件的远程服务器上检查端口是否打开?

如何在没有任何第三方库的情况下使用 Node.js 下载 .gz 文件

Acumatica没有看到我需要包含在定制包中的第三方文件

以编程方式将bat转换为exe

如何在不使用IAM的情况下将第三方文件上传到私有S3存储桶?

如何在Laravel 5.6中将第三方API数据转换为集合资源?

如何使用 AWS Transfer 使用 Node.js 将文件从 AWS 移动到第三方

轻松将第三方错误转换为字符串

将循环结构转换为JSON-第三方API