强大而又有趣的记事本(续)
上次简单的介绍了一下用记事本可以编写批处理和VBS脚本文件。这次重点介绍一下用记事本怎么生成EXE可执行文件。因为可执行文件比批处理和VBS脚本更加强大,当然了,大部分病毒和木马都是EXE文件。
用记事本生成可执行文件的一种方法是用批处理写汇编,再用debug编译生成com可执行文件。例如以下代码:
@echo off
echo a100> 1.txt
echo db ‘Hello World!$’>> 1.txt
echo mov ah,09>> 1.txt
echo mov dx,0100>> 1.txt
echo int 21>> 1.txt
echo mov ah,01>> 1.txt
echo int 21>> 1.txt
echo int 20>> 1.txt
echo.>> 1.txt
echo rcx>> 1.txt
echo 1a>> 1.txt
echo n hello.com>> 1.txt
echo w>> 1.txt
echo q>> 1.txt
debug < 1.txt
del 1.txt
start hello.com
把上述代码写进记事本,然后保存为filename.bat。双击运行后就生成了一个HELLO.COM的可执行文件。当然了,写这种东西你就就得会汇编。如果你足够强的话,你还可以直接用记事本写机器码来生成可执行文件。例如:
@echo off
echo.a>>hx.txt
echo.db B0 13 CD 10 68 00 A0 07 8C C8 80 C4 10 8E E0 31>>hx.txt
echo.db C9 BA C8 03 89 C8 EE 42 D0 F8 78 07 EE F6 E0 C1>>hx.txt
echo.db E8 06 EE B0 00 EE 79 08 28 C8 D0 E8 EE D0 E8 EE>>hx.txt
echo.db 89 CB 64 88 1F E2 DA 89 CB 01 C8 D3 C0 88 C6 C0>>hx.txt
echo.db FE 05 10 F2 64 12 97 FF 00 D0 EA 64 88 17 F6 D7>>hx.txt
echo.db 64 88 17 E2 E2 DB E3 D9 EE 80 C7 08 BF 04 02 D8>>hx.txt
echo.db 45 F4 57 BA B0 FF BD 60 FF BE FC 01 DF 44 D6 89>>hx.txt
echo.db 2C DF 04 89 14 DF 04 B1 02 D9 C3 D9 FB D9 C2 D8>>hx.txt
echo.db C9 D9 C4 D8 CB DE E9 D9 CB DE CA DE CB DE C2 D9>>hx.txt
echo.db CA E2 E6 D9 C1 DC C8 D9 C1 DC C8 DE C1 D9 FA DE>>hx.txt
echo.db FB D9 F3 DE 4C FC DF 1C DE 4C FC DF 5C 01 8B 34>>hx.txt
echo.db 8D 00 00 E0 24 40 B0 FB 74 0F C1 E6 02 8D 00 28>>hx.txt
echo.db E0 B0 F0 79 04 D1 E6 B0 D0 64 02 00 00 05 47 45>>hx.txt
echo.db 81 FD A0 00 75 93 42 83 FA 50 75 8A 5E BF 00 19>>hx.txt
echo.db B5 64 F3 A5 B5 C8 4E C0 3C 02 E2 FA E4 60 98 48>>hx.txt
echo.db 0F 85 65 FF B0 03 CD 10 29 00 C3 3C 62 61 7A 65>>hx.txt
echo.>>hx.txt
echo.g>>hx.txt
echo.q>>hx.txt
echo.>>hx.txt
echo.debug.exe ^bat.bat
call bat.bat
del /q /f bat.bat>nul
del hx.txt /f /q>nul
还是把上述代码保存为一个批处理文件,双击运行后你就可以看到一个3D画面。
上面介绍的是用记事本生成COM可执行文件,虽然COM文件可以转化成EXE文件,但它还不是真正的EXE可执行文件,下面我就介绍怎么用记事本生成真正的EXE文件。
其实用记事本生成EXE文件并不是用记事本直接写出来的。记事本写的东东是文本文件,而EXE可执行文件是二进制文件。其实EXE文件是事先用其它语言写好了的,然后再想办法把EXE二进制文件转化为文本文件,再然后用脚本文件把字符串逆变换成二进制文件。
具体方法和例子如下:
先准备一个EXE文件,然后用记事本编写编写如下脚本:
on error resume next
set arg=wscript.arguments
if arg.count=0 then wscript.quit
with CreateObject(”ADODB.Stream”)
.type=1:.open:.loadfromfile arg(0):bs=.read:l=.size:.close
end with
if err.number<>0 then wscript.quit
set fso=CreateObject(”Scripting.FileSystemObject”)
with fso.opentextfile(arg(0)&”.bat”,2,true)
if err.number<>0 then wscript.quit
.writeline “@echo bs=_>xx.vbs”
for k=1 to l step 129
.write “@echo “””
.write b64b(midb(bs,k,129))
.writeline “””+_>>xx.vbs”
next
.writeline “@echo “”””:set rs=CreateObject(””ADODB.Recordset””)>>xx.vbs”
.writeline “@echo set ado=CreateObject(””ADODB.Stream””)>>xx.vbs”
.writeline “@echo l=len(bs):ss=””””:for k=1 to l step 4096:ss=ss+ub64(mid(bs,k,4096)):next:l=len(ss)>>xx.vbs”
.writeline “@echo rs.fields.append “”b””,205,l/2:rs.open:rs.addnew:rs(””b””)=ss+chrb(0):rs.update>>xx.vbs”
.writeline “@echo ado.mode=3:ado.type=1:ado.open:ado.write rs(””b””).getchunk(l/2)>>xx.vbs”
.writeline “@echo ado.savetofile “””+fso.getfilename(arg(0))+”””,2:ado.close>>xx.vbs”
.writeline “@echo function ub64(s):dim t(4),b(3):ub64=””””:n=len(s):r=2 >>xx.vbs”
.writeline “@echo if n mod 4^<^>0 then exit function:end if:for i=1 to n step 4:for j=0 to 3 >>xx.vbs”
.writeline “@echo a=asc(mid(s,i+j,1)):if a=43 then:a=62:else if a=47 then:a=63:else if a^>47 and a^<58 then:_>>xx.vbs”
.writeline “@echo a=a+4:else if a=61 then:a=0:if r=2 then r=j-2:end if:else if a^>64 and a^<91 then:_>>xx.vbs”
.writeline “@echo a=a-65:else if a^>96 and a^<123 then:a=a-71:else:exit function:_>>xx.vbs”
.writeline “@echo end if:end if:end if:end if:end if:end if:t(j)=a:next>>xx.vbs”
.writeline “@echo b(0)=t(0)+t(1)*64 mod 256:b(1)=t(1)\4+t(2)*16 mod 256:b(2)=t(2)\16+t(3)*4 >>xx.vbs”
.writeline “@echo for j=0 to r:if b(j)^<16 then ub64=ub64+””0″”:end if:ub64=ub64+hex(b(j))>>xx.vbs”
.writeline “@echo next:next:end function>>xx.vbs&&cscript.exe //nologo xx.vbs&del xx.vbs”
end with
const b64 = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”
function b64b(bin)
b64b=””
n=lenb(bin)
for i=1 to n step 3
a=ascb(midb(bin,i,1))
b64b=b64b+mid(b64,a mod 64+1,1)
if i
b=ascb(midb(bin,i+1,1))
b64b=b64b+mid(b64,(a\64+b*4)mod 64+1,1)
if i+1
c=ascb(midb(bin,i+2,1))
b64b=b64b+mid(b64,(b\16+c*16)mod 64+1,1)
b64b=b64b+mid(b64,c\4+1,1)
else
b64b=b64b+mid(b64,b\16+1,1)
b64b=b64b+”=”
end if
else
b64b=b64b+mid(b64,a\64+1,1)
b64b=b64b+”==”
end if
next
end function
然后把文件保存为Any2Bat.vbs。这个文件不是我原创的,它是由著名的zzzEVAzzz写的。文件的作用是把任意文件转化为批处理文件。Any2Bat.vbs文件支持拖拽,把任意一个文件拖拽到Any2Bat.vbs文件图标上即可完成转换。(文件说明:这个脚本用的是Base64编码方式进行的转化。Base64编码转换出的文本文件是原二进制文件的1.5倍。而用Hex.bin编码出来是原始文件体积的2倍。所以Base64编码转化后的文件更小,但转化速度要慢一些。)然后你只需把准备好的EXE文件拖放到Any2Bat.vbs文件图标上,一个可以释放出EXE文件的批处理文件就生成了。你双击运行批处理就可以生成一个EXE文件。如果你还想双击运行批处理时就直接运行了EXE可执行文件的话,你只需在生成的批处理文件最后加上一行 “start filename.exe”。 filename.exe是你的EXE文件的文件名。
批处理和VBS脚本是可以相互转化的,网上的方法和软件一大堆,这里就不说了。用上文的方法可以把应用程序转换成批处理或VBS脚本,面VBS脚本又大量用于网页上。如果你的EXE文件是个木马或病毒什么的。。。呵呵,我可没教你做坏事。
呵呵,不错,那个幽灵古堡可真让我开眼呀,不过程序很老就是了,就这有点冷!
“程序很老”指的是什么程序?
注意了:上述代码中的引号是英文引号,单引号也是英文的单引号,不然运行会出错。
我是说幽灵古堡的源EXE程序很老,好像是2000年左右就出来了,而且这样的64KB的3D动画出奇地多,在国际上也曾有过比赛。