多语言混编脚本
0x00 前言
通常一个脚本都是使用某一种语言编写,使用固定的解释器执行。例如以下这段vbs脚本:
1 | WScript.echo("Hello World!") |
可以使用wscript或cscript执行,但肯定不能使用cmd或其他程序执行。
是否可以构造这样一种脚本,能同时被多种解释器执行呢?
0x01 小试牛刀
下面是一段神奇的脚本:
1 | :On Error Resume Next |
这段代码即可以当做bat来执行,也可以当做vbs来执行,主要是利用了以下几个特性:
:在bat中可用作注释,而在vbs中可以用于连接多条语句'在vbs中是注释符;&在bat中是命令连接符scsript命令可以将文件当做vbs脚本执行
从上面这个例子可以看出:
要实现一个多语言混编脚本,可以充分利用语言本身的特点,如:注释符、连接符等,特别是那些在多语言中都是合法的语法。
0x02 bat与shell混编
当命令行需要跨平台时,就需要进行bat和shell的混编。
1 | : ' |
上面这段代码可以同时作为shell脚本和bat脚本执行,不过执行的代码是不同的。这里主要是利用了以下几点特性:
: '是bash中的多行注释,也可以作为bat中的注释利用bat的
goto语句跳过bash代码区域
0x03 shell与python混编
这种方式可以将本来需要两个文件实现的功能压缩到一个文件中。
将下面的内容保存到文件py.sh:
1 |
|
1 | $ ./py.sh |
这里主要是利用了"""在python中可以用作多行注释的作用,将bash脚本包含在其中,最后通过exec跳转到python程序,避免了后面代码的执行。
" 2> /dev/null这行主要是为了闭合前面一行的最后一个",以及捕获产生的错误。
0x04 bat与python混编
1 | rem = ''' |
bat与python的混编方法与上面的方法基本一致:
bat使用rem作为注释,python将rem与’’’形成赋值表达式,并且避免了由于bat命令导致的语法错误
bat使用goto语法跳过了python代码
:'''通过前面的:避免了'''执行报错
这段代码唯一有缺陷的就是第一行会导致以下无用输出:
1 | C:\>rem = ''' |
尝试了很多办法都不能将其移除掉。
0x05 bat、shell和python混编
三种语言的混编需要把前面的几种方法综合起来。
1 | '''' 2>NUL |
原理基本上就是前面用到的,这里就不细说了。
0x06 总结
多语言代码混编在实际生产中并一定派的上用场,毕竟这样的代码基本跟天书没有什么差异。但作为一种折腾的乐趣,倒是可以尝试一下。