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

 eXeL@B —› Вопросы новичков —› Преобразование алгоритма в формулу
Посл.ответ Сообщение

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

Создано: 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. Я так понимаю конечная формула будет иметь какой-то вид с корнями логарифмами или производными. Как такие дела научиться расшифровывать?



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

Создано: 06 февраля 2007 08:53
· Личное сообщение · #2

shr это сдвиг вправо
shr eax, 1 - eax разделицо на 2
sar это арифметический сдвиг вправо
если al = 10001000b
sar al, 1
al = 11000100b




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 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
А вообще советую держать и бумажный вариант, мой выбор - справочник Виктора Юрова, весь стандарт присутствует.



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

Создано: 06 февраля 2007 21:18
· Личное сообщение · #4

Да нет, команды я в общем понимаю. Просто интересует научиться строить нормальную формулу глядя на команды. Как к приимеру понять что тут использован корень или логарифм (если это возможно без fpu с ним все понятно)?



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 06 февраля 2007 21:54
· Личное сообщение · #5

sliderZ
Про конкретную функцию узнать просто : задаем на входе число, для которого знаем ответ. Для корня 4 9 и т.д. для логарифма тоже ясно, да и редко эти вещи в ключах используются.
А формулу строят тоже редко, обычно все-таки программу. Если есть формула - значит автор лох.
Построение формул давно пройденный этап. Криптографы давно уже знают : надо использовать необратимый или трудно обратимый алгоритм. Ну знаем мы формулу для пароля в RAR и что - 10-15 паролей в секунду перебор. И формула там обратима, но все так же медленно.




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 07 февраля 2007 02:23
· Личное сообщение · #6

sliderZ
Без сопроцессора ты ЛЕГКО корень не посчитаешь. С челочисленной арифметикой возможны только простые операции + - * / % сдвиг и различные битовые. Остальное только построением из такой "базы".

ЗЫ Для определения смысла кода метод единственный - опыт.




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

Создано: 07 февраля 2007 04:06
· Личное сообщение · #7

кури opcodes.hlp
sar - знаковое деление на 2 (сдвиг с сохранением знака)

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




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 07 февраля 2007 22:40
· Личное сообщение · #8

HoBleen пишет:
Без сопроцессора ты ЛЕГКО корень не посчитаешь.

Немного OFFTOP. Недавно занимался поиском "блох" - логарифм в разных компиляторах в последнем бите не сходился. После этого посмотрел, как Интел его реализует. Каково же было мое удивление, когда вместо одной команды сопроцессора, я увидел 30 конвеерных команд. Чуть-чуть подумал, посмотрел время выполнения и понял, что так быстрее. Синус и косинус, начиная с версии 8.1(в 8.0 был сопроцессор), тоже хрен разберешь. Т.ч. компилируйте мат. формулы на Интеле - хрен кто расшифрует.



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

Создано: 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, не верится что это просто алгоритм.




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

Создано: 09 февраля 2007 03:14
· Личное сообщение · #10

sliderZ пишет:
88888889

ага ) 10001000100010001000100010001001 ;)
это просто алгоритм, с магическим числом =)

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




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

Создано: 09 февраля 2007 03:28
· Личное сообщение · #11

Добавить можно что по адресу [ECX+570C] там вроде таймер мотается во время работы проги...



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

Создано: 09 февраля 2007 04:03
· Личное сообщение · #12

Вопрос снимается, все понял.



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

Создано: 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пецы, не договариваете вы чего-то Почти очевидно что компилятор какое-то арифметическое действие в такой хитрый вид преобразует




Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

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

sliderZ пишет:
Cпецы, не договариваете вы чего-то Почти очевидно что компилятор какое-то арифметическое действие в такой хитрый вид преобразует


Нет проблем. Произведи проверку с большим массивом чисел, и ты увидишь, действие ли это, или же алгоритм.


Арифметические действия - это операции сложения, вычитания, деления и умножения, все остальное - уже другая песня. Тут точность выражения словоформ нужна.

Я понимаю, например, сложение по модулю, логарифм, интегрирование... Для таких операций компилятор выдает соответствующий код (реверсни MathCad или Mathematica, или Maple =).

Даже возведение в степень целых сводится к cmp/jnz or loop, о чем тут речь можно вести?

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

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


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