Сейчас на форуме: -Sanchez- (+8 невидимых) |
eXeL@B —› Основной форум —› Восстановление деления при реверсе кода |
Посл.ответ | Сообщение |
|
Создано: 27 марта 2017 11:06 · Поправил: Vamit · Личное сообщение · #1 При реверсе кода часто встречаются операции деления замененные компилятором на умножение. Имеется ли какой универсальный алгоритм восстановления деления? В математике я не силен, а искать результат методом подбора утомительно, да и неправильно, всё таки декомпилятор должен иметь алгоритм восстановления деления. Пара примеров: Code:
----- Everything is relative... |
|
Создано: 27 марта 2017 11:27 · Личное сообщение · #2 |
|
Создано: 27 марта 2017 11:28 · Поправил: dosprog · Личное сообщение · #3 Алгоритм существует, есть такая программа - d47a_27.03.2017_EXELAB.rU.tgz - MagicDiv (c)TheSvin. Только там в обратном направлении - div->mul. Подозреваю, что можно было бы все часто встречающиеся подобные конструкции пооформлять в виде шаблонов, и "примерять" их все последовательно на предмет совпадения, встретив инстркцию mul/imul. Другое тут вряд ли что-то придумаешь. Сложно это.. | Сообщение посчитали полезным: Vamit, v00doo |
|
Создано: 27 марта 2017 11:35 · Личное сообщение · #4 |
|
Создано: 27 марта 2017 11:58 · Личное сообщение · #5 r_e пишет: Лучи не берут этот участок? Да, в принципе, и не должны.. Пример: Code:
Результат: Code:
|
|
Создано: 27 марта 2017 12:04 · Поправил: Vamit · Личное сообщение · #6 r_e пишет: Лучи не берут этот участок? Если вы ими пользовались, то должны знать, что им ещё далеко до такого. А вот непонятную хрень сделать из этого могут dosprog За программку спасибо, посмотрю... Алгоритм замены деления на умножение есть, он же используется во многих компиляторах, но он не подходит для обращения, тут нужно что-то другое. dsrabot1 пишет: восстанавливать данный блок в менее быстрый При реверсе быстрота не нужна, а нужен исходный код, программист не станет писать такой код для деления, а просто напишет, как во втором примере value / 100, а результат первого расшифруйте сами... ----- Everything is relative... |
|
Создано: 27 марта 2017 12:11 · Поправил: dosprog · Личное сообщение · #7 |
|
Создано: 27 марта 2017 12:11 · Личное сообщение · #8 |
|
Создано: 27 марта 2017 12:24 · Поправил: dosprog · Личное сообщение · #9 r_e пишет: Вообще-то они это умеют. Но не во всех случаях, да. Попробовал в примере .ASM, который в прошлом посте, (процедура <ttt>) заменить переменные <nnn> и <mmm> константами - после этого декомпилятор вообще отказывается такое декомпилить, с сообщением об ошибке. Значит, наверное, таки что-то они там мудрят в этом направлении, но ничего путного не получается.. dsrabot1 пишет: После нормального компиля у меня всегда выдавало норм выхлоп Какой такой "нормальный конпиль"? - Не было там вообше никакого конпиля. Транслировалось MASM'ом. |
|
Создано: 27 марта 2017 13:19 · Личное сообщение · #10 Вот прям свежак Code:
выдает Code:
----- старый пень |
|
Создано: 27 марта 2017 14:07 · Поправил: Vamit · Личное сообщение · #11 Я не отрицаю, иногда рей может что-то и полезное выдать, но к сожалению, только иногда... Вот нашел интересную табличку по теме А здесь ----- Everything is relative... | Сообщение посчитали полезным: v00doo |
|
Создано: 27 марта 2017 14:15 · Личное сообщение · #12 dosprog Не то ты декомпилишь ) После нормального компиля у меня всегда выдавало норм выхлоп, сколько помню таких моментов. Vamit Вот по теме: https://habrahabr.ru/post/256827/ | Сообщение посчитали полезным: Vamit |
|
Создано: 27 марта 2017 14:41 · Поправил: reversecode · Личное сообщение · #13 у юрчева в его книге ре для начинающих есть одна страница посвящена магическому делению еще здесь чуток в целом алгоритм расширенный алго евклида вот у менхантера там ссылки чуть чуть мертвые можно погуглить Добавлено спустя 5 минут Добавлено спустя 2 часа 52 минуты вот вам пример когда рейс декомпилит а когда стопорится вот и думайте что там нужно поменять в двух почти идентичных версиях кода, что бы второй тоже декомпильнулся может кто скрипт на питоне или идс забабахает для таких случаев)) Code:
Code:
Code:
Code:
| Сообщение посчитали полезным: Vamit |
|
Создано: 28 марта 2017 02:33 · Личное сообщение · #14 Посмотрите это Это хорошая обучалка по мат алгосам. В целом же деление сводится к сдвигу и сложению, псевдокод целочисленного деления: Code:
----- vx |
|
Создано: 28 марта 2017 08:03 · Поправил: VodoleY · Личное сообщение · #15 difexacaw пишет: Посмотрите это --> Link <-- ЖЕСТЬ ) это 1ая книга которую я читал)) правда немного в другом виде, и в переводе. (знакомые сделали на заводе копию, матречный принтер.. куплено было за безумные деньги.. распечатка на овсетной бумаге.. ) гдето 90ый год был.. я попутно.. по этой распечатке.. еще и ассемблер спектрума учил.. ибо книжки по асму то не было))) ЗЫ.. кстати.. буквально в прошлом году выкинул, ибо чернила выцвели, до состояния не читабельности.. ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... | Сообщение посчитали полезным: difexacaw |
|
Создано: 28 марта 2017 09:55 · Поправил: Vamit · Личное сообщение · #16 Вот простые формулы по которым возможно получить делитель, зная магическое число (множитель), кол-во сдвигов и юстировку (+- к старшему дворду после умножения): без юстировки divirer = 2 ^ (32 + shift) / magic + 1; с юстировкой divirer = 2 ^ (32 + shift) / (magic + 2 ^ (32 + adjust)) + 1; где: ^ - обозначение степени числа, shift - кол-во сдвигов после умножения и юстировки magic - магический множитель adjust - знаковое юстировочное значение (= 1, если присутствует) Справедливы для знакового и беззнакового деления. PS: Для + юстировки формула не верна, правильный результат получается в этом случае по формуле 1 при игнорировании юстировки, но тогда возникает вопрос, а зачем нужно прибавлять множимое к старшему дворду после умножения? ----- Everything is relative... |
|
Создано: 28 марта 2017 11:03 · Личное сообщение · #17 Разве, зная делимое и частное, нельзя вычислить делитель? Пусть, например, у нас есть делимое 100 и в результате умножения, заменяющего деление, мы получаем частное 2. Тогда делитель лежит в диапазоне от 34 до 50. Подавая на вход функции умножения делители из этого дипазона, двоичным поиском находим нужный делитель. |
|
Создано: 28 марта 2017 12:35 · Поправил: Vamit · Личное сообщение · #18 spinz Частное мы не знаем и делимое тоже, посмотрите примеры в начале темы, известен только магический множитель, дальнейшие сдвиги и юстировка. Но с двумя неизвестными задача не решаема, поэтому предполагаем, что частное = 1, следовательно делимое будет = делителю. Ничего поиском искать не нужно. Формула 1 работает правильно, формула 2 для отрицательной юстировки так же работает. Причем отрицательную юстировку можно убрать изменив магический множитель magic = 2 ^ 32 - magic; и использовать формулу 1, но тогда мы будем получать только положительный делитель (например, вместо -110, будет 110). Остается вопрос для чего нужна положительная юстировка или я что-то упустил. ----- Everything is relative... |
|
Создано: 28 марта 2017 14:17 · Личное сообщение · #19 |
|
Создано: 20 апреля 2017 15:06 · Личное сообщение · #20 |
|
Создано: 20 апреля 2017 15:36 · Личное сообщение · #21 |
|
Создано: 22 апреля 2017 15:14 · Поправил: difexacaw · Личное сообщение · #22 При попытке портировать ряды чебышева(алгосы со спекки) на контроллеры оказалось что коэффициенты не паблик. Приведены они для всего малого числа итераций, посему эти вычисления можно считать приват. Вероятно современные процессоры используют эти же алгоритмы, это обьясняет отсутствие по ним инфы, так как она закрыта. ----- vx |
eXeL@B —› Основной форум —› Восстановление деления при реверсе кода |