![]() |
eXeL@B —› Вопросы новичков —› Преобразование алгоритма в формулу |
Посл.ответ | Сообщение |
|
Создано: 06 февраля 2007 07:33 · Личное сообщение · #1 Есть к примеру такой код: 00465944 |> 33C0 XOR EAX,EAX 00465946 |. 66:8B46 56 MOV AX,WORD PTR [ESI+56] 0046594A |. 8D58 FF LEA EBX,DWORD PTR [EAX-1] 0046594D |. B8 67666666 MOV EAX,66666667 00465952 |. 8BCB MOV ECX,EBX 00465954 |. 0FAFDD IMUL EBX,EBP 00465957 |. 0FAFCF IMUL ECX,EDI 0046595A |. F7E9 IMUL ECX 0046595C |. 8BCA MOV ECX,EDX 0046595E |. B8 67666666 MOV EAX,66666667 00465963 |. C1F9 02 SAR ECX,2 00465966 |. 8BD1 MOV EDX,ECX 00465968 |. C1EA 1F SHR EDX,1F 0046596B |. 03CA ADD ECX,EDX 0046596D |. F7EB IMUL EBX 0046596F |. C1FA 02 SAR EDX,2 00465972 |. 8BC2 MOV EAX,EDX 00465974 |. 03F9 ADD EDI,ECX 00465976 |. C1E8 1F SHR EAX,1F 00465979 |. 03D0 ADD EDX,EAX 0046597B |. 03D7 ADD EDX,EDI 0046597D |. 03D5 ADD EDX,EBP 0046597F |. 895424 14 MOV DWORD PTR [ESP+14],EDX 00465983 |. DB4424 14 FILD DWORD PTR [ESP+14] ------ тут получилось нужное число Если алгоритм простой (этот для меня пока сложноват хотя кейгенщики наверно посмеются) то нет проблем, но тут такие дела... shr.. sar...66666667. Я так понимаю конечная формула будет иметь какой-то вид с корнями логарифмами или производными. Как такие дела научиться расшифровывать? ![]() ![]() |
|
Создано: 06 февраля 2007 08:53 · Личное сообщение · #2 |
|
Создано: 06 февраля 2007 10:00 · Личное сообщение · #3 В твоем коде используются только LEA EBX,DWORD PTR [EAX-1] <= > ebx = eax-1 IMUL EBX,EBP <= > ebx = ebx * ebp SAR ECX,2 - Сдвиг через флаг CF (подробности в любом справочнике) SHR EDX,1F сдвиг вправо на 01Fh битов FILD DWORD PTR [ESP+14] - загрузка в стек сопроцессора числа DWORD PTR [ESP+14] После у тебя видимо идет работа с этим числом с пом. ММХ. sliderZ пишет: или производными ![]() ![]() ![]() Производная - грубо говоря скорость изменения функции. Насколько я знаю, еще ни один процессор не умеет исследовать такие вещи. Если нужен просто справочник по коммандам, качай с сайта интела том 3 - описание всех команд. Или в виде справки - http://exelab.ru/f/action=vthread&forum=3&topic=7717 А вообще советую держать и бумажный вариант, мой выбор - справочник Виктора Юрова, весь стандарт присутствует. ![]() |
|
Создано: 06 февраля 2007 21:18 · Личное сообщение · #4 |
|
Создано: 06 февраля 2007 21:54 · Личное сообщение · #5 sliderZ Про конкретную функцию узнать просто : задаем на входе число, для которого знаем ответ. Для корня 4 9 и т.д. для логарифма тоже ясно, да и редко эти вещи в ключах используются. А формулу строят тоже редко, обычно все-таки программу. Если есть формула - значит автор лох. Построение формул давно пройденный этап. Криптографы давно уже знают : надо использовать необратимый или трудно обратимый алгоритм. Ну знаем мы формулу для пароля в RAR и что - 10-15 паролей в секунду перебор. И формула там обратима, но все так же медленно. ![]() |
|
Создано: 07 февраля 2007 02:23 · Личное сообщение · #6 |
|
Создано: 07 февраля 2007 04:06 · Личное сообщение · #7 |
|
Создано: 07 февраля 2007 22:40 · Личное сообщение · #8 HoBleen пишет: Без сопроцессора ты ЛЕГКО корень не посчитаешь. Немного OFFTOP. Недавно занимался поиском "блох" - логарифм в разных компиляторах в последнем бите не сходился. После этого посмотрел, как Интел его реализует. Каково же было мое удивление, когда вместо одной команды сопроцессора, я увидел 30 конвеерных команд. Чуть-чуть подумал, посмотрел время выполнения и понял, что так быстрее. Синус и косинус, начиная с версии 8.1(в 8.0 был сопроцессор), тоже хрен разберешь. Т.ч. компилируйте мат. формулы на Интеле - хрен кто расшифрует. ![]() |
|
Создано: 09 февраля 2007 03:09 · Личное сообщение · #9 Попытка не пытка, вот такое есть дело: 00524650 /$ B8 D34D6210 MOV EAX,10624DD3 00524655 |. F7A1 0C570000 MUL DWORD PTR [ECX+570C] там переменное большое число 0052465B |. 8BC2 MOV EAX,EDX 0052465D |. C1E8 06 SHR EAX,6 делим что свыше 4 байт на 64 006345BB . 8BC8 MOV ECX,EAX 006345BD . B8 89888888 MOV EAX,88888889 006345C2 . F7E1 MUL ECX 006345C4 . C1EA 05 SHR EDX,5 006345C9 . 895424 14 MOV DWORD PTR [ESP+14],EDX 006345D6 . DF6C24 18 FILD DWORD PTR [ESP+14] пошло Дальше идет FPU там точно по формуле. Просто вопрос никто с экспертным глазом не видит тут какой математики? Подозрительны эти 88888889, не верится что это просто алгоритм. ![]() |
|
Создано: 09 февраля 2007 03:14 · Личное сообщение · #10 |
|
Создано: 09 февраля 2007 03:28 · Личное сообщение · #11 |
|
Создано: 09 февраля 2007 04:03 · Личное сообщение · #12 |
|
Создано: 16 марта 2007 19:55 · Личное сообщение · #13 Вот в еще одной проге на vsc++ обнаружил почти тоже самое: 004346F3 |. B8 89888888 MOV EAX,88888889 004346F8 |. F7E6 MUL ESI 004346FA |. C1EA 03 SHR EDX,3 004346FD |. B8 CDCCCCCC MOV EAX,CCCCCCCD 00434702 |. 8BFA MOV EDI,EDX 00434704 |. F7E6 MUL ESI 00434706 |. C1EA 03 SHR EDX,3 00434709 |. 0FAFFA IMUL EDI,EDX Cпецы, не договариваете вы чего-то ![]() ![]() ![]() |
|
Создано: 16 марта 2007 23:16 · Личное сообщение · #14 sliderZ пишет: Cпецы, не договариваете вы чего-то Почти очевидно что компилятор какое-то арифметическое действие в такой хитрый вид преобразует Нет проблем. Произведи проверку с большим массивом чисел, и ты увидишь, действие ли это, или же алгоритм. Арифметические действия - это операции сложения, вычитания, деления и умножения, все остальное - уже другая песня. Тут точность выражения словоформ нужна. Я понимаю, например, сложение по модулю, логарифм, интегрирование... Для таких операций компилятор выдает соответствующий код (реверсни MathCad или Mathematica, или Maple =). Даже возведение в степень целых сводится к cmp/jnz or loop, о чем тут речь можно вести? ----- Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей. ![]() |
|
Создано: 26 марта 2007 10:07 · Поправил: tundra37 · Личное сообщение · #15 sliderZ пишет: Cпецы, не договариваете вы чего-то 1) 88888889=800000007/15 СССССССD=C00000003/15 Что-то типа "оптимального" деления на 15. 2) Натрави IDA с сигнатурами. Я в молодости тоже ковырял "шифроалгоритм" с константами 81010100 и 7EFEFEFF , а это оказалась стандартная функция strlen ![]() =========================== В поисковиках этих констант маловато, но один результат навел на размышление - текст бота и сообщение про время. 60=15*4 Т.е. для перевода таймера в минуты и часы надо делить на 15 ![]() ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Преобразование алгоритма в формулу |