arm*_*inb 5 binary hex batch-file
在Linux中我们可以做到
echo -n -e '\x66\x6f\x6f' > test.txt
将HEX值写入文件.
如何在Windows批处理中完成此操作?
dbe*_*ham 10
我假设您希望能够在\ x00到\ xFF范围内编写所有可能的二进制字节.不幸的是,纯批次没有提供一种简单的机制来完成这项工作.
但是有很多选择并不太难.
!=ExitCodeASCII!动态变量该!=ExitCodeASCII!动态变量报告最近运行的外部命令的返回码的ASCII值.但它仅限于从\ x20到\ x7E的ASCII码.
我使用延迟扩展,所以我不必担心毒药字符.
返回特定错误代码的最简单机制是使用cmd /c exit N,其中N必须是十进制值.如果要传入十六进制值,则必须先将值转换为十进制.
Windows批处理使用0xNN表示法指定十六进制值.正如其他人所说,您可以set /a val=0x66用来进行转换.另一种选择是使用for /l %%N in (0x66 1 0x66) do ...,优点是您不需要定义中间环境变量来保存值.
@echo off
setlocal enableDelayedExpansion
set "str="
for %%H in (0x66 0x6f 0x6f) do (
  for /l %%N in (%%H 1 %%H) do cmd /c exit %%N
  set "str=!str!!=ExitCodeASCII!"
)
>test.txt echo(!str!
好处:
缺点:
FORFILES命令支持0xNN语法,因此它可以生成大多数字符.但字符串必须通过CMD/C,因此它不能用于生成\ 0x00,\ 0x0A或\ 0x0D.(我没有测试过,但我相信所有其他值都有效,前提是毒性字符被适当引用或转义)
@echo off
forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo(0x660x6f0x6f"
好处:
缺点:
CERTUTIL支持-decodeHex动词,它可以读取十六进制值并直接写入文件
@echo off
>temp.txt echo(66 6f 6f 0d 0a
certutil -f -decodehex temp.txt test.txt >nul
del temp.txt
好处:
缺点:
在批处理脚本中嵌入和执行JScript非常容易.JScript具有解释许多转义序列的本机能力,包括\ xNN.但是,\ xNN转义序列实际上映射到Unicode代码点,因此某些高阶字节代码不会映射到正确的字符值.高阶字节的结果可能会因您的机器默认字符集而异.
下面我定义一个:jWrite子例程,它可以写入带有嵌入转义序列的行.简单地改变WriteLine到Write,如果你想写不换行字符的字符串的JScript代码.
@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment
:: -------- Batch code --------------
@echo off
call :jWrite "\x66\x6f\x6f" >test.txt
exit /b
:jWrite
cscript.exe //E:JScript //nologo "%~f0" %1
exit /b
:: --------- JScript code -----------*/
WScript.StdOut.WriteLine(eval('"'+WScript.Arguments.Unnamed(0)+'"'));
好处:
\\,\t,\r,\n,等.\x22缺点:
只要您的机器默认为Windows-1252,编写一些JScript代码来正确解释所有\ xNN代码以提供正确的字节并不困难.如果您的命令会话的活动代码页也与Windows 1252匹配,那么您可以自由地混合普通文本.
@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment
:: -------- Batch code --------------
@echo off
call :jWrite "\x66\x6f\x6f"
call :jWrite "Hello\nworld\x80"
exit /b
:jWrite
cscript.exe //E:JScript //nologo "%~f0" %1
exit /b
:: --------- JScript code -----------*/
WScript.StdOut.WriteLine(WScript.Arguments.Unnamed(0).replace(
  /\\(\\|b|f|n|r|t|v|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})/g,
  function($0,$1) {
    switch ($1.toLowerCase()) {
      case 'x80': return '\u20AC';
      case 'x82': return '\u201A';
      case 'x83': return '\u0192';
      case 'x84': return '\u201E';
      case 'x85': return '\u2026';
      case 'x86': return '\u2020';
      case 'x87': return '\u2021';
      case 'x88': return '\u02C6';
      case 'x89': return '\u2030';
      case 'x8a': return '\u0160';
      case 'x8b': return '\u2039';
      case 'x8c': return '\u0152';
      case 'x8e': return '\u017D';
      case 'x91': return '\u2018';
      case 'x92': return '\u2019';
      case 'x93': return '\u201C';
      case 'x94': return '\u201D';
      case 'x95': return '\u2022';
      case 'x96': return '\u2013';
      case 'x97': return '\u2014';
      case 'x98': return '\u02DC';
      case 'x99': return '\u2122';
      case 'x9a': return '\u0161';
      case 'x9b': return '\u203A';
      case 'x9c': return '\u0153';
      case 'x9d': return '\u009D';
      case 'x9e': return '\u017E';
      case 'x9f': return '\u0178';
      default:    return eval('"'+$0+'"');
    }
  }
));
好处:
\\,\t,\r,\n,等.\x22缺点:
我的JREPL.BAT实用程序最初设计用于对文本文件执行正则表达式搜索和替换操作.但它有一些选项可以让它轻松编写带有嵌入式转义序列的字符串,并且无论机器使用什么默认字符集,它都可以为所有字节代码提供正确的结果.
如果您的机器默认使用任何单字节字符集,那么您可以安全地使用以下所有可能的转义序列,从\ x00到\ xFF,您可以在正常文本和转义序列中自由混合.
call jrepl $ "\x66\x6f\x6f" /s "=" /x /o test.txt
该/s "="选项将未定义的环境变量指定为输入源,将其解释为空字符串.第一个$参数匹配空字符串的结尾.第二个"\x66\x6f\x6f"参数指定替换值.该/x选项在替换字符串中启用转义序列,该/o test.txt选项指定输出文件.
如果要附加到test.txt,请添加该/APP选项.
如果你想要\n行结束而不是\ r \n,(Unix风格而不是Windows),那么添加/U选项
如果您不想要任何新的行终止符,请添加该/M选项.
最后,如果您的机器没有默认为单字节字符集,您仍然可以通过为输出格式指定单字节字符集(如Windows-1252)来强制所有转义序列的正确结果.但是,如果指定的字符集与命令会话的活动代码页不匹配,则只保证转义序列有效 - 某些正常的文本字符可能会产生错误的结果.
call jrepl $ "\x66\x6f\x6f" /s "=" /x /o "test.txt|Windows-1252"
好处:
\\,\t,\r,\n,等.\x22或\q缺点:
| 归档时间: | 
 | 
| 查看次数: | 8912 次 | 
| 最近记录: |