我正在访问Vxheaven.org,而我发现此代码提供了一个随机文件名。
tmpname=""
randomize(timer)
namel=int(rnd(1)*20)+1
For lettre = 1 To namel
randomize(timer)
tmpname=tmpname & chr(int(rnd(1)*26)+97)
Next
typext = "execombatbmpjpggifdocxlsppthtmhtthta"
randomize(timer)
tmpext = int(rnd(1)*11)+1
tmpname=tmpname & "." & mid(typext,((tmpext-1)*3)+1,3) & ".vbs"
我对这些随机语句和for循环的用法感到困惑。 谁能解释一下这里到底发生了什么?
答案 0 :(得分:4)
Chr(Int(Rnd(1) * 26) + 97)
的目的是选择范围内的随机字符" a"到" z"。它的工作原理是因为" a"的ascii代码。是97,其余的字母依次排列。因此,For循环构建一个随机小写字符串,其长度介于1到20之间。
typext = "execombatbmpjpggifdocxlsppthtmhtthta"
是一个33 = 3x11个字符的字符串。连续三元组是常见的文件扩展名," exe"," com"," bat"等等。表达式
Mid(typext, ((tmpext - 1) * 3) + 1, 3)
提取其中一个三元组。
此代码存在许多问题。
1)Randomize (Timer)
第一次是不必要的冗长。 Randomize
本身随机数生成器与系统时间一起播种 - 你不需要传递任何东西,除非你希望将来能够重现随机数流,这不是&#39在这里的情况。
2)Randomize (Timer)
第二次和第三次真的毫无意义。由于Timer
具有1毫秒的分辨率,因此再次使用该行可能会将随机数生成器重置为完全相同的种子。因此,该行的重复很可能减少输出中的随机性。
3)在Rnd(1)
中,1
毫无意义。它与Rnd
4)为什么要在11个特定文件扩展名中加入硬连线以及为什么限制自己使用长度为3的文件扩展名?拥有一个文件扩展数组然后选择数组的随机元素更有意义。类似的东西:
typext = Array("exe","com","bat","bmp","jpg", "gif", "doc", "xls","ppt", "htm", "htt", "hta")
r = Int(Rnd * (1+ UBound(typext)))
tmpname=tmpname & "." & typext(r) & ".vbs"
这样,您可以自由地向数组中添加其他条目,包括" c"等等,其余代码也可以使用。
这是一个清理版本,编写为函数:
Function RandFileName()
Dim tmpname, namel, lettre, tmpext, typext, r
Randomize
tmpname = ""
namel = Int(Rnd(1) * 20) + 1
For lettre = 1 To namel
tmpname = tmpname & Chr(Int(Rnd(1) * 26) + 97)
Next
typext = Array("exe", "com", "bat", "bmp", "jpg", "gif", "doc", "xls", "ppt", "htm", "htt", "hta")
r = Int(Rnd * (1 + UBound(typext)))
tmpname = tmpname & "." & typext(r) & ".vbs"
RandFileName = tmpname
End Function
典型输出:bgwkxjvaapr.exe.vbs