如何通过批处理脚本内嵌十六进制代码构建exe程序及相关问题咨询
背景说明
我正在开发可点击运行的批处理文件,目前通过批处理扩展插件实现了目标需求,用到的脚本如下:
for %%b in ( 4D534346000000005A040000000000002C000000000000000301010001000000 000000004700000001000100000800000000000000006546F2B1200062617462 6F782E65786500D7E54E4C0B040008434BB5555F685B55183F499BA06D4DB235 295311EFA4151C23E04A7C2854B2759D8EA51A92B88A14BAFCB9C9BD697A6FB8 B9B19DF32123093223F8361FF6B212F0C597227B98A26C359382B46FC38789FB F7306E9C6011FF14D15E7FDFB9376D26854DD093FCCE39DFEFFBCE777EE7BBE7 26536F55988331D6CB7CCC34190B938116660F6F15C0F3ECE71E76E9F1F5FD97 1D91F5FD09492E09454DCD69C979219D5414551752A2A09515415684A3AFC785 793523069FE81BEEE4884E32167138D8DBAB9B890E779B791DFD0EC731E686E1 B6495F17481D8D4EC66CB9D06F37C1E2477E66ACA77BDD76A46DDAEDC341C6E6 9C8F70D8FFB805B385A48EF190DB16E4B67477B753548AFFB9497D436196B706 692B80EE0F74662083BE7ACD9FFFD50C44FC61D67453D86FB6E1A4E00A0A2A39 CFA27B6F9056E87CC54075D3F4D6AEE224CD202DF1492F913744861978D78A31 62F04FBC3F58F94678D1CC7E36C0C63E3A83286F6D14FC2BB9BB1BED1BA6691A 7B6045CD909B2F4D60E3760B74E58C63D65BF740BB1928205FFDAAB7F6097833 700AD63855CC5BEFE76E225CB8D4ACD940FAF62F506C7C81AEC745A29A2FA3CB 363D486F7CCCD931628F70D6479B863CBCB704BC49028E90AED3085E751D1BB4 DE91264D24DEBDC00B31835DDB4F52E01C02E35D6CF5DA636D468E35ACFBDDF5 1CF2FE05D35BBF8F7EE9A921EB303729E24744B4AF6F61761133E37B32BF26F3 4F7A69703452738988FBA481CE63DCA1199DA17D010EE9F92EF112C28D15F21F A067D7EDCA50A63C655A82FFDC2AAA0A661A7B0C90270A8FE9A2A22CEDD46B69 A748ED6F1190DF67869C3C5B146BAC3BE590F6F25D2C7E067C759C1C78CCEB48 99AD8E93DFE9AD5F81D56A8C0FC13AB7B5F293EFEC3DFA21EAE1E5894E9F940E 76D5CFD73286A0328F4FDC0C14ADEBD43287BF3C81A0AA8B2E706FE3191A1A4F D7BFF3D6E8A56FE5B7EF5FCD7A08FFB8958B569A8E59E166AF196AF08D25CB1C 29B191CC18FFF6EDFE2A7DEA0BB30D60744F985DC03883B10CAC00CBC00DA07F 2F8A877104E35C2E99CECCAB0B52F1B4124CA5788E83819D7CB7F0D334037BD8 BFC3FD002E02BBB78BDB0437E0DF5DD354FCE4442C113C1A89B01393B1D72623 A387B8C1DE884FC63A73BFBDD8BF9D242EA90BD3B2925117C8D2C1D780F3C032 B006DC060C8A87C07DB6E8478DC33B2EEA713DF36A52C91444BE9FA84FA84A49 2D8853F87F789049888BFA615DD7E45459171FF04C94B592AA45D592ACCBAA42 AB626232633B8F2BC5B27E98E20BA258DC65DD7125ABDA5A1EC2772AF101F49F 072E02CBC065E02B600DB80EDC04EE011BF639FF6D3C63454D56F42CCD6673A2 9E96F88CA6F34959496AB9126C7151D6393F9792AC5949D774B5C039B5285221 66173499178BCD6A28098DE9825AB298B45492DF11EDBFBCBF01 ) Do >>t.dat (Echo.For b=1 To len^("%%b"^) Step 2 ECHO WScript.StdOut.Write Chr^(Clng^("&H"^&Mid^("%%b",b,2^)^)^) : Next) Cscript /b /e:vbs t.dat>batbox.ex_ Del /f /q /a t.dat >nul 2>&1 Expand -r batbox.ex_ >nul 2>&1 Del /f /q /a batbox.ex_ >nul 2>&1
以上脚本可构建生成batbox.exe。将上述脚本复制粘贴到批处理文件后,我想要实现自定义批处理脚本构建exe程序的需求,查阅相关开发资料后得知代码中的字符串为十六进制代码,现有如下脚本模板:
For %%A in ( <hex code> ) DO >>t.dat (Echo.For b=1 To len^("%%b"^) Step 2 ECHO WScript.StdOut.Write Chr^(Clng^("&H"^&Mid^("%%b",b,2^)^)^) : Next) Cscript /b /e:vbs t.dat>sample.ex_ Del /f /q /a t.dat >nul 2>&1 Expand -r sample.ex_ >nul 2>&1 Del /f /q /a sample.ex_ >nul 2>&1
问题解答
1. 如何从现有exe程序中提取对应的十六进制代码?
你可以直接用Windows系统自带的certutil工具完成提取,无需安装第三方软件,操作步骤如下:
- 先把你要封装的exe用
makecab命令做CAB压缩,适配模板里的Expand解压逻辑:执行makecab 你的目标程序.exe 压缩后.cab - 再对压缩后的cab文件提取十六进制:执行
certutil -encodehex 压缩后.cab output.hex 4,得到的output.hex里就是连续无额外格式的十六进制字符串 - 把生成的十六进制字符串拆成和示例中长度相近的行(比如每行64个字符),替换掉模板里的
<hex code>即可。
2. 该种通过批处理内嵌十六进制代码构建exe的方案是否通用,是否可以在所有场景下正常运行?
该方案不通用,存在多个限制条件,以下场景无法正常运行:
- 仅支持Win7及以上版本系统,Win XP及更早系统没有预装对应版本的cscript、certutil工具,无法执行
- 企业办公环境如果通过组策略禁用了WSH(Windows脚本宿主,即cscript/wscript)的执行权限,脚本会直接运行失败
- 该方案属于动态释放PE文件的行为,绝大多数杀毒软件都会对该行为做拦截,生成的exe大概率会被直接查杀删除
- 如果要封装的exe体积过大(超过2MB),批处理处理大段字符串的效率极低,会出现长时间卡顿甚至崩溃的情况
- 部分系统环境会限制批处理生成可执行文件的权限,或者对临时目录做读写限制,也会导致生成exe失败。
内容的提问来源于stack exchange,提问作者blur
相关产品推荐
相关产品推荐

