![]() |
eXeL@B —› Вопросы новичков —› Вопрос про ГСЧ |
Посл.ответ | Сообщение |
|
Создано: 31 марта 2007 14:06 · Личное сообщение · #1 |
|
Создано: 31 марта 2007 16:40 · Личное сообщение · #2 |
|
Создано: 31 марта 2007 21:12 · Личное сообщение · #3 |
|
Создано: 01 апреля 2007 11:29 · Личное сообщение · #4 |
|
Создано: 01 апреля 2007 17:49 · Личное сообщение · #5 В предыдущем посте ошибся малость, seed устанавливается равным GetTickCount, а не time. Устанавливается один раз. Потом происходит непосредственно MSVCRT.rand. Там вроде все легко: 77C271D3 > E8 4D2D0000 CALL MSVCRT.77C29F25 77C271D8 8B48 14 MOV ECX,DWORD PTR [EAX+14] (берем seed) 77C271DB 69C9 FD430300 IMUL ECX,ECX,343FD 77C271E1 81C1 C39E2600 ADD ECX,269EC3 77C271E7 8948 14 MOV DWORD PTR [EAX+14],ECX (обновляем seed) 77C271EA 8BC1 MOV EAX,ECX 77C271EC C1E8 10 SHR EAX,10 77C271EF 25 FF7F0000 AND EAX,7FFF (получаем рандомное число) Потом идет как обычно: CDQ MOV ECX,3E8 IDIV ECX В edx получаем наше число, дальше если число от 0 до 250 то происзодит действие A, если 250-500 - B, 500-750 - C, 750-999 - D. Ну так вот если бы Seed устанавливался равным GetTickCount каждый раз, то тут вроде никак, но он устанавливается только один раз в самом начале а потом при вызове этой процедуры используется обновленный seed. Задача - после определенного количества прогона этой процедуры зная какое действие в результате произошло A,B,C или D узнать Seed и соответственно знать какое рандомное число будет следующим ![]() Может я чего-то пока упустил, но пока логика кажется такой: Числа от 0 до 250 в EDX получаться в 250*33 = 8250 случаев. Т.е после первого прогона рандома у нас есть 8250 вариантов seeda (правда если учесть AND EAX,7FFF то наверно больше), прогоняем еще раз получаем действие A,B,C или D и значит 8250/4 = 2062.5 варианта seeda и т.д пока не найдем seed. Реально или чушь несу? ![]() ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Вопрос про ГСЧ |