gpt4 book ai didi

.net - 如果没有第三方工具,.bat 文件如何将 'converted' 转换为 .exe?

转载 作者:行者123 更新时间:2023-12-02 04:42:17 29 4
gpt4 key购买 nike

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

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

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

最佳答案

一个非常明显的方法是使用 IEXPRESS - 古老的内置工具,可创建自解压包并能够执行解压后命令。所以这里是IEXPRESS sed-directive/.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将在临时文件夹中创建一个新的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 库足够强大,可以添加隐藏启动、加密等功能。您还可以检查 jsc.exe 编译选项,看看还有什么功能(例如添加资源)。

我保证对 .NET 方法的每一项改进都会投赞成票:-)

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

bat2exejs.bat example.bat example.exe

关于.net - 如果没有第三方工具,.bat 文件如何将 'converted' 转换为 .exe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28174386/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com