Сейчас на форуме: _MBK_, vsv1 (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Вопрос про ГСЧ
Посл.ответ Сообщение

Ранг: 33.6 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 31 марта 2007 14:06
· Личное сообщение · #1

Статьи соответствующие сейчас читать не охота, поэтому по-быстрому здесь спрошу.
Есть ГСЧ например
MOV EDI,DWORD PTR [<&MSVCRT.rand>] ; MSVCRT.rand
call edi;

Простой вопрос, можно ли теоретически предугадать значение?




Ранг: 353.0 (мудрец)
Активность: 0.370
Статус: Участник
resreveR

Создано: 31 марта 2007 16:40
· Личное сообщение · #2

sliderZ
seed надо знать.. состояние гсч.. поищи srand - чем инитализируется

-----
Тут не могла быть ваша реклама




Ранг: 33.6 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 31 марта 2007 21:12
· Личное сообщение · #3

Ну перед этим идет:

0040CA83 |. 6A 00 PUSH 0 ; /timer = NULL
0040CA85 |. FF15 E8854100 CALL DWORD PTR [<&MSVCRT.time>] ; \time
0040CA8B |. 50 PUSH EAX ; /seed
0040CA8C |. FF15 20864100 CALL DWORD PTR [<&MSVCRT.srand>] ; \srand
0040CA92 |. 83C4 08 ADD ESP,8




Ранг: 353.0 (мудрец)
Активность: 0.370
Статус: Участник
resreveR

Создано: 01 апреля 2007 11:29
· Личное сообщение · #4

нуу, если не знаешь время - можешь сбрутить константу-время.. я не сильно понимаю..что ты там делаешь - давай больше инфы

-----
Тут не могла быть ваша реклама




Ранг: 33.6 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 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 —› Вопросы новичков —› Вопрос про ГСЧ
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати