Сейчас на форуме: vasilevradislav, tyns777, zombi-vadim (+3 невидимых) |
eXeL@B —› Программирование —› Перевернуть функцию... |
Посл.ответ | Сообщение |
|
Создано: 25 июня 2008 00:30 · Личное сообщение · #1 Здравствуйте господа! есть функция, в которой в цикле производятся следующие операции над числами: LOOP: IMUL EBX,EBX,15 ROL EBX,2 MOV EAX, [ECX] ;X1,X2,X3..... ADD EBX,EAX INC ECX DEC EDX JNZ LOOP Возможно ли, зная только содержимое EBX на выходе из цикла, вычислить значения (X1, X2, X3...)? Спасибо. |
|
Создано: 25 июня 2008 01:18 · Личное сообщение · #2 |
|
Создано: 25 июня 2008 09:23 · Поправил: Wyfinger · Личное сообщение · #3 Уточните, в MOV EAX, [ECX] в EAX помещается 8,16 или 32 байта. Если идет по 2 или по 4 байта, то получается перекрытие, т.е. каждый байт хешируемых данных учавствует в операции несколько раз. Если это так, то обратить функцию будет сложнее, даже не представляю как сделать это. Если же там побайтовая загрузка, то все просто (в первой программе, которую мне удалось закейгенить было что-то похожее). Имеем Result (EBX). 1. Чтобы определить последний байт хешируемых данных подбираем значение 0..255, чтобы после Result ror 2 / mod 15h равнялось 0, т.е. чтобы после Result ror 2 результат делился нацело на 15h. 2. Отнимаем от Result выбранное число и повторяем операцию №1, пока в Result не останется число, которое после ror 2 / div 15 будет меньше 255, это число - последний полученный символ и первый в искомой строке (символы получаются в обратном порядке). Приблизительный код (писал на коленке):
Полученную последовательность байтов нужно обернуть. Также, если предполагается, что хеш вычисляется от читаемой стоки (printable string) можно вабирать байты не из промежутка 0..255 а только из печатных символов. |
|
Создано: 25 июня 2008 10:05 · Личное сообщение · #4 |
|
Создано: 25 июня 2008 10:29 · Личное сообщение · #5 Rascal пишет: это самопальный хэш. перебором можно вычислить перебором - долгие года будет перебираться Wyfinger пишет: Уточните, в MOV EAX, [ECX] в EAX помещается 8,16 или 32 байта в еах помещается 1 байт (к примеру EAX=00000035) Wyfinger пишет: Приблизительный код (писал на коленке): спасибо. попробую p.s. и еще, забыл сказать,что после всех вычислений выполняется команда AND EBX,7FFFFFF |
|
Создано: 25 июня 2008 10:37 · Личное сообщение · #6 |
|
Создано: 25 июня 2008 10:47 · Личное сообщение · #7 |
|
Создано: 25 июня 2008 13:36 · Поправил: temp · Личное сообщение · #8 Wyfinger пишет: 1. Чтобы определить последний байт хешируемых данных подбираем значение 0..255, чтобы после Result ror 2 / mod 15h равнялось 0, т.е. чтобы после Result ror 2 результат делился нацело на 15h. 2. Отнимаем от Result выбранное число и повторяем операцию №1, пока в Result не останется число, которое после ror 2 / div 15 будет меньше 255, это число - последний полученный символ и первый в искомой строке (символы получаются в обратном порядке). попробовал, не вышло из-за того, что разложить число нужно на определенное количество байт: MOV EDX,32 LOOP: IMUL EBX,EBX,15 ROL EBX,2 MOV EAX, [ECX] ;X1,X2,X3..... [BYTE] ADD EBX,EAX INC ECX DEC EDX JNZ LOOP |
|
Создано: 25 июня 2008 20:21 · Личное сообщение · #9 В общем, как предложил Wyfinger вроде, как не получится, т.к. при работе команды IMUL с отрицательными числами происходит некое "выпадание" битов, т.е. число полученное IMUL не получить обратно командой (I)DIV. Пример: mov ebx,0x53849503 imul ebx,ebx,15 ; =0xD9E0393F mov eax,0xD9E0393F xor edx,edx mov ebx,15 idiv ebx ; =0x0A6002B9 Что делать? полная |
|
Создано: 26 июня 2008 00:57 · Личное сообщение · #10 |
|
Создано: 26 июня 2008 01:38 · Личное сообщение · #11 Rascal пишет: Конкретнее уточни, сколько элементов Х тебе надо получить из хэша temp пишет: MOV EDX,32 LOOP: IMUL EBX,EBX,15 ROL EBX,2 MOV EAX, [ECX] ;X1,X2,X3..... [BYTE] ADD EBX,EAX INC ECX DEC EDX JNZ LOOP 32 байта p.s. для разбора по методу, предложенному Wyfinger, надо использовать числа типа int64, может кто знает реализацию работы с такими числами на ассемблере, особенно интересует команда ROL/ROR для 64-битных чисел |
|
Создано: 26 июня 2008 04:21 · Личное сообщение · #12 temp пишет: Для разбора по методу, предложенному Wyfinger, надо использовать числа типа int64, может кто знает реализацию работы с такими числами на ассемблере, особенно интересует команда ROL/ROR для 64-битных чисел Например так, хотя это и не оптимальный вариант, ROL делается аналогично: // ROR64
|
|
Создано: 26 июня 2008 05:01 · Личное сообщение · #13 temp Возможно ли, зная только содержимое EBX на выходе из цикла, вычислить значения (X1, X2, X3...)? Результат имеет размер 4 байта, а с учетом забыл сказать,что после всех вычислений выполняется команда AND EBX,7FFFFFF еще на 1 бит меньше. Полагаю, всем понятно, что по 4-ём байтам восстановить исходные 32 байта невозможно (во всяком случае, если это произвольные 32 байта без взаимозависимостей). Можно подобрать 32 байта так, чтобы они при преобразовании давали требуемый результат (если в рамках данной задачи такого решения будет достаточно). Поскольку результат имеет размер 31 бит, то в среднем каждая двухмиллиардная комбинация исходных байтов будет давать нужный итог на выходе, а перебрать 2.000.000.000 вариантов - минутное дело, а уж никак не долгие года будет перебираться |
|
Создано: 27 июня 2008 11:21 · Поправил: Модератор · Личное сообщение · #14 |
eXeL@B —› Программирование —› Перевернуть функцию... |