Как работает односторонняя функция? — КиберПедия 

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Как работает односторонняя функция?

2017-05-23 280
Как работает односторонняя функция? 0.00 из 5.00 0 оценок
Заказать работу

Односторонняя функция, это функция, которая способна превратить из одного значения другое, при этом невозможно (или трудно) проделать обратную операцию. Некоторые люди имеют трудности с пониманием, как это возможно.

Рассмотрим очень простой пример.

У нас есть ряд из 10-и чисел в пределах 0..9, каждое встречается один раз, например:

4 6 0 1 3 5 7 8 9 2

Алгоритм простейшей односторонней функции выглядит так:

• возьми число на нулевой позиции (у нас это 4);

• возьми число на первой позиции (у нас это 6);

• обменяй местами числа на позициях 4 и 6.

Отметим числа на позициях 4 и 6:

4 6 0 1 3 5 7 8 9 2

^ ^

Меняем их местами и получаем результат:

4 6 0 1 7 5 3 8 9 2

Глядя на результат, и даже зная алгоритм функции, мы не можем однозначно восстановить изначальное положение чисел. Ведь первые два числа могли быть 0 и/или 1, и тогда именно они могли бы участвовать в обмене. Это крайне упрощенный пример для демонстрации, настоящие односторонние функции могут быть значительно сложнее.

 

Глава 3. Основная часть

Поиск в коде того, что нужно.

 

В настоящее время программисты пишут очень длинные коды. Длинными программы получаются из-за одной простой вещи: к исполняемым файлам обыкновенно прикомпилируют все подряд библиотеки. Если бы все вспомогательные библиотеки всегда выносили во внешние DLL, то всё было бы проще. Таким образом, очень полезно сразу понимать, какая функция из стандартной библиотеки или более-менее известной (как Boost, libpng), а какая — имеет отношение к тому что мы пытаемся найти в коде.

Переписывать весь код на Си/Си++, чтобы разобраться в нем, безусловно, не имеет никакого смысла.

Одна из важных задач reverse engineer-а это быстрый поиск в коде того что собственно его интересует.

Идентификация исполняемых файлов

Borland:

Вот пример name mangling в Borland Delphi и C++Builder:

 

@TApplication@IdleAction$qv

@TApplication@ProcessMDIAccels$qp6tagMSG

@TModule@$bctr$qpcpvt1

@TModule@$bdtr$qv

@TModule@ValidWindow$qp14TWindowsObject

@TrueColorTo8BitN$qpviiiiiit1iiiiii

@TrueColorTo16BitN$qpviiiiiit1iiiiii

@DIB24BitTo8BitBitmap$qpviiiiiit1iiiii

@TrueBitmap@$bctr$qpcl

@TrueBitmap@$bctr$qpvl

@TrueBitmap@$bctr$qiilll

 

Имена всегда начинаются с символа @ затем следует имя класса, имя метода и закодированные типы аргументов.

Эти имена могут присутствовать с импортах.exe, экспортах.dll, отладочной информации, и тд. Borland Visual Component Libraries (VCL) находятся в файлах.bpl вместо.dll, например, vcl50.dll, rtl60.dll. Другие DLL которые могут импортироваться: BORLNDMM.DLL.

 

 

Delphi

Почти все исполняемые файлы имеют текстовую строку «Boolean» в самом начале сегмента кода, среди остальных имен типов.

 

Вот очень характерное для Delphi начало сегмента CODE, этот блок следует сразу за заголовком win32 PE-файла:

00000400 04 10 40 00 03 07 42 6f 6f 6c 65 61 6e 01 00 00 |[email protected]... |

00000410 00 00 01 00 00 00 00 10 40 00 05 46 61 6c 73 65 |[email protected] |

00000420 04 54 72 75 65 8d 40 00 2c 10 40 00 09 08 57 69 |.True.@.,[email protected] |

00000430 64 65 43 68 61 72 03 00 00 00 00 ff ff 00 00 90 |deChar.......... |

00000440 44 10 40 00 02 04 43 68 61 72 01 00 00 00 00 ff |[email protected]...... |

00000450 00 00 00 90 58 10 40 00 01 08 53 6d 61 6c 6c 69 |[email protected] |

00000460 6e 74 02 00 80 ff ff ff 7f 00 00 90 70 10 40 00 |nt..........p.@. |

00000470 01 07 49 6e 74 65 67 65 72 04 00 00 00 80 ff ff |..Integer....... |

00000480 ff 7f 8b c0 88 10 40 00 01 04 42 79 74 65 01 00 |[email protected].. |

00000490 00 00 00 ff 00 00 00 90 9c 10 40 00 01 04 57 6f |[email protected] |

000004a0 72 64 03 00 00 00 00 ff ff 00 00 90 b0 10 40 00 |rd............@. |

000004b0 01 08 43 61 72 64 69 6e 61 6c 05 00 00 00 00 ff |..Cardinal...... |

000004c0 ff ff ff 90 c8 10 40 00 10 05 49 6e 74 36 34 00 |[email protected]. |

000004d0 00 00 00 00 00 00 80 ff ff ff ff ff ff ff 7f 90 |................ |

000004e0 e4 10 40 00 04 08 45 78 74 65 6e 64 65 64 02 90 |[email protected].. |

000004f0 f4 10 40 00 04 06 44 6f 75 62 6c 65 01 8d 40 00 |[email protected]..@. |

00000500 04 11 40 00 04 08 43 75 72 72 65 6e 63 79 04 90 |[email protected].. |

 

 

Иногда, чтобы понять, что делает та или иная функция, можно её не разбирать, а просто посмотреть на её входы и выходы.

Так можно сэкономить время.

Обращения к файлам и реестру: для самого простого анализа может помочь утилита Process Monitor от SysInternals.

Для анализа обращения программы к сети, может помочь Wireshark.

Затем всё-таки придётся смотреть внутрь.

Первое на что нужно обратить внимание, это какие функции из API ОС и какие функции стандартных библиотек используются. Если программа поделена на главный исполняемый файл и группу DLL-файлов, то имена функций в этих DLL, бывает так, могут помочь.

Если нас интересует, что именно приводит к вызову MessageBox() с определенным текстом, то первое что можно попробовать сделать: найти в сегменте данных этот текст, найти ссылки на него, и найти, откуда может передаться управление к интересующему нас вызову MessageBox().

Если речь идет о компьютерной игре, и нам интересно какие события в ней более-менее случайны, мы можем найти функцию rand() или её заменитель (как алгоритм Mersenne twister), и посмотреть, из каких мест эта функция вызывается и что самое главное: как используется результат этой функции.

Но если это не игра, а rand() используется, то также весьма любопытно, зачем. Бывают неожиданные случаи вроде использования rand() в алгоритме для сжатия данных (для имитации шифрования).

 

 


Поделиться с друзьями:

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.01 с.