【发布时间】:2013-05-01 18:30:47
【问题描述】:
有什么方法可以在 Visual Basic 6.0 中生成从 0 到 &HFFFFFFFF 的随机数?
我正在使用以下功能
Function RandomNumberLong(Lowerbound As Long, Upperbound As Long) As Long
RandomNumberLong = Clng((Upperbound - Lowerbound + 1) * Rnd + Lowerbound)
End Function
如果我使用
x = RandomNumberLong(0,&HFFFFFFFF)
它总是返回 0
这里的问题是long可以容纳的最大值是十进制的7FFFFFFF或2147483647 那么我应该如何解决这个问题呢?即使我使用单一数据类型,它也总是返回没有无符号数字的负数。
根据 MSDN 长类型
Long(长整数)变量存储为带符号的 32 位(4 字节) 数值范围从 -2,147,483,648 到 2,147,483,647。 Long 的类型声明字符是和号 (&)。
但是FFFFFFFF的值等于-1或者4294967294溢出了。
我想我对此感到困惑。
已编辑:
由于这似乎有点复杂,我编写了一个小的 Shell 代码来使用 RDTSC 指令来生成一个随机长数,包括有符号和无符号。
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Option Explicit
Private Sub Form_Load()
Dim x(1 To 10) As Byte, VAL As Long
CopyMemory x(1), &H60, 1 'PUSHAD
CopyMemory x(2), &H310F, 2 'RDTSC EAX holds a random value
CopyMemory x(4), &HA3, 1 'MOV EAX
CopyMemory x(5), VarPtr(VAL), 4 'Pointer of variable // MOV DWORD [VAL],EAX
CopyMemory x(9), &H61, 1 'POPAD
CopyMemory x(10), &HC3, 1 'RET
CallWindowProc VarPtr(x(1)), 0, 0, 0, 0 'Call the shellcode
MsgBox VAL
End Sub
【问题讨论】:
-
只需使用适当的 PRNG 并读取 4 个字节。
-
请注意,这种调用机器码的方法不安全!它会在带有data execution protection 的现代 Windows 系统上失败,使其在现代系统上变得脆弱或彻底崩溃。您必须使用
VirtualProtectWinAPI 函数预先将此类内存标记为可执行。 Here’s an example code – 尽管是德国 cmets。 -
是的,差点忘了,谢谢你的提醒。