关于.net:.bat文件如何在没有第三方工具的情况下“转换”为.exe文件?

How can a .bat file be 'converted' to .exe without third party tools?

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

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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 ;@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=

例子:

1
bat2exeIEXP.bat  myBatFile.bat MyExecutable.exe

实际上,这应该在所有Windows计算机上都有效,但有一个主要限制——不能将参数传递给已创建的.exe文件。

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

2

它相当于一个POC,但是.NET System.Diagnostics和System.IO库足够强大,可以添加隐藏的启动、加密等功能。您还可以检查jsc.exe编译选项,以了解其他功能(如添加资源)。

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

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

1
bat2exejs.bat example.bat example.exe

您还可以开发一个简单的exe,它只调用BAT脚本。

例如,你可以用c(我不是c-pro,这实际上是我的第一个程序,我从另一个stackoverflow帖子中复制了很多程序。):

4

如果将上述代码存储到mysuperapp.cs中mysuperapp.bat旁边,然后用csc.exe /target:winexe MySuperApp.cs编译它(甚至可能添加/win32icon:MySuperApp.ico以添加一个奇特的图标),它将生成mysuperapp.exe。

启动MySuperApp.exe将调用mysuperapp.bat(同名BAT文件)。

(应该吗?)在每台Windows计算机上都存在。


我知道如何手动将bat/cmd转换为exe,确保bat/cmd文件名只包含字母和数字。以管理员身份打开"IExpress向导"。

  • 选择"创建新的自解压指令文件"
  • 选择"提取文件并运行安装命令"
  • 给包命名任何东西
  • "确认提示"的"无提示"
  • "许可协议"的"不显示许可证"
  • 单击"添加"查看"打包文件",从中选择BAT/CMD文件。
  • 然后在"要启动的安装程序"的"安装程序"文本框中,键入cmd /c,然后键入bat/cmd文件的全名(例如:emptyrecyclebin.bat=>cmd /c emptyrecyclebin.bat)。
  • 保持"安装后命令"不变
  • "显示窗口"的"隐藏"
  • "完成消息"的"无消息"
  • 单击"浏览",然后选择要将exe下载到的位置
  • 启用"从用户隐藏文件提取进度动画"
  • 禁用"在包中使用长文件名存储文件"
  • "configure restart"绝对是"no restart"
  • 如果以后要更快地重新编译,请保存sed
  • 然后创建包!命令窗口应迅速出现和消失
  • 导航到您下载exe的地方,然后享受!