以下是一个前辈反汇编的供参考,但Randomize的[eax+4]从哪里来的他自己说没有弄清楚,另外Rnd(-n)他也没做出反汇编 ----------------- 我电脑上装的是VB6,所以拿MSVBVM60.dll来分析。去掉部分次要的代码后,核心代码如下: RandomNext: ... mov ecx,[ebp+8] //将上一次的随机数传入ecx imul ecx,ecx,2BC03 mov eax,FFC39EC3 sub eax,ecx //此时,eax的值就是产生的下一个随机数了 ...Randomize: ... mov ecx,[esp+8] //将Randomize后的参数传入ecx mov edx,ecx and edx,FFFF shr ecx,8 shl,edx,8 and ecx,FFFF00 xor edx,ecx mov ecx,[eax+4] //将旧的种子数传入ecx and ecx,FF0000FF or edx, ecx //此时,edx的值就是新的种子数
我写的不明白吗? 所有的不是我分析的,都是网上现成的。 你说的什么因变量?是Rnd(+n)的算法吗?那就是x = ( x * a + c ) MOD (2^24),我这是VB写法。标准写法应该是y = ( x * a + c ) MOD (2^24),y是第一个随机数;然后y又带入x得到下一个随机数...如此循环不断
-----------------
我电脑上装的是VB6,所以拿MSVBVM60.dll来分析。去掉部分次要的代码后,核心代码如下:
RandomNext:
...
mov ecx,[ebp+8] //将上一次的随机数传入ecx
imul ecx,ecx,2BC03
mov eax,FFC39EC3
sub eax,ecx //此时,eax的值就是产生的下一个随机数了
...Randomize:
...
mov ecx,[esp+8] //将Randomize后的参数传入ecx
mov edx,ecx
and edx,FFFF
shr ecx,8
shl,edx,8
and ecx,FFFF00
xor edx,ecx
mov ecx,[eax+4] //将旧的种子数传入ecx
and ecx,FF0000FF
or edx, ecx //此时,edx的值就是新的种子数
所有的不是我分析的,都是网上现成的。
你说的什么因变量?是Rnd(+n)的算法吗?那就是x = ( x * a + c ) MOD (2^24),我这是VB写法。标准写法应该是y = ( x * a + c ) MOD (2^24),y是第一个随机数;然后y又带入x得到下一个随机数...如此循环不断
[eax+4]很可能和当前时钟计数有关。