![]() |
eXeL@B —› Вопросы новичков —› Энтропия файлов |
Посл.ответ | Сообщение |
|
Создано: 27 февраля 2009 23:17 · Личное сообщение · #1 Стал разбираться с энтропией. Алго взял из "упаковщиков в последний раз". Рассчитывается энтропия для файла целиком и отдельно для каждой PE-секции. Результаты рассчетов отличаются от результатов PEiD и DiE. Отсюда и вопрос - как считают энтропию эти тулзы? Пример: блокнот из WinXP. Размер 552960 бит; 417510 "полезных" бит -> энтропия файла 1,3244. DiE показывает теже самые биты, но энтропия 75,504. Откуда взялось это число? PEiD говорит, что энтропия 6,07. Энтропия по секциям: моя: .text - 1,28 .data - 6,714 .rsrc - 1,405 PEiD: .text - 6,28 .data - 1,150 .rsrc - 5,710 Энтропию по секциям я считаю просто - беру RawOffset и RawSize секции, читаю эти байты, считаю энропию. Может надо все нули в конце секции откинуть? Интересно, как PEiD рассчитывает энтропию для всего файла и для отдельной секции и как это делает DiE? ![]() |
|
Создано: 27 февраля 2009 23:45 · Личное сообщение · #2 Посмотри этот топик http://www.exelab.ru/f/action=vthread&forum=6&topic=13431. Там есть немного про энтропию ![]() |
|
Создано: 28 февраля 2009 17:37 · Личное сообщение · #3 |
|
Создано: 28 февраля 2009 18:50 · Поправил: SVLab · Личное сообщение · #4 |
|
Создано: 28 февраля 2009 19:19 · Личное сообщение · #5 |
|
Создано: 28 февраля 2009 19:50 · Личное сообщение · #6 SVLab пишет: Если ты просто смотрел реферат, то там нет формул. Нужно качать. Я посмотрел все линки из кряклабовского топика. Не понял, что значит надо качать? Естественно я его скачал и прочитал. Archer пишет: По поводу разных чисел-в топике по линку выше уже написано. В том топике написано: "Учите матчасть. гугл еще не умер." А хелспаун там мало отвечал и шутил больше. Archer пишет: можешь подебажить сами проги... можешь хеллспавна потыкать Для меня это не лучшая затея ![]() ![]() ![]() |
|
Создано: 28 февраля 2009 20:59 · Личное сообщение · #7 user_ пишет: Не понял, что значит надо качать Ну, я имел ввиду, если просто смотреть на сайте, то там криво отображается (без графики, т.е. формул) На wasm'е же кто-то приводил исходник подсчета. А что там замутил hellspawn в die, знает только он. Возможно, его коэффициент соотносится как-то с размером файла. ![]() |
|
Создано: 28 февраля 2009 21:36 · Личное сообщение · #8 SVLab пишет:На wasm'е же кто-то приводил исходник подсчета. А что там замутил hellspawn в die, знает только он. Да все я там видел и исходник этот. Обычный исходник, тоже самое, что и в "упаковщиках" + вывод результатов работы + обработка ошибок (типа файл не найден), которые только глаз замыливают. В истории версий DiE где-то упоминается, что введен некий коэффециент к для подсчета энтропии, но никаких подробностей. Раз мои результаты отличаются от DiE и PEiD, значит алго у них другой. По их числам можно легко судить упакован файл(секция) или нет, а по моим нельзя, но легко судить об "упакованности" на глаз. Т.Е. я стал строить диаграмму из 256 столбцов. Высота столбца пропорциональна количеству байт, соответствующих номеру столбца. Пример. Берем файл, упакованный упх. Энтропия файла моя - 1.0059; UPX1 - 1.0002; .rsrc - 1.5096. PEiD - 8.00 (Packed); UPX1 - 8,0; .rsrc - 5,33. Таким образом из моих чисел можно судить, что файл упакован, секция UPX1 упакована и секция ресурсов тоже упакована ведь коэффециент не 2 не 3 и не 4, а 1.5 Но на диаграмме отлично видно, что секция UPX1 упакована(все столбцы имеют почти одинаковую длину), а ресурсы имеют огромный потенциал для сжатия(6000 нулей - длиннющий столбец). Я запутался. Кто знает какие алго используют топовые тулзы - подскажите. ![]() |
|
Создано: 28 февраля 2009 22:36 · Поправил: Hellspawn · Личное сообщение · #9 user_ в чём вопрос, кроме того как считают другие? ![]() з.ы. я всё читаю, тока не всегда пишу ![]() ----- [nice coder and reverser] ![]() |
|
Создано: 01 марта 2009 00:12 · Поправил: AndreyMust19 · Личное сообщение · #10 user_ Тема твоя мне очень близка. Некоторое время я тоже занимался "подсчетом энтропии". Собственно энтропия в информатике - это сколько бит требуется на кодирование одного байта (поэтому макс. значение = 8). Очень важно - как считать эту энтропию. Если считать ее для всего файла, то чем больше будет файл, тем неточнее выйдет энтропия. Окажется что в все байты встречаются с одинаковой постоянностью, несмотря на фрагменты, в которых эти байты встречаются с разной постоянностью. Чтобы учитывать эти фрагменты (и повысить точность энтропии), надо отдельно подсчитывать энтропию небольших кусочков файла (н-р 1024 байта), а потом находить их среднее арифметическое. Чем меньше файл, тем меньше нужно выбирать выбирать размер кусочка. Вывод: простая энтропия всего файла - это далеко не коэфициент "сжатости" его содержимого. Но это будет уже не энтропия, а среднее арифметическое энтропий отдельных кусочков файла ![]() Истинная энтропия - это энтропия всего файла, а все остальное - это нечто другое. PEiD: .text - 6,28 .data - 1,150 .rsrc - 5,710 - эти цифры являются энтропией этих секций. Для секций надо учитывать не физический размер, а только те байты, к-е попадают в виртуальный образ, но при этом принадлежат секции, а не являются нулевыми или возникают от выравнивания. Ну если phys. size < virt. size, значит в память прочитаются все phys. size байты. А если virt. size < phys. size, то прочитаются все virt. size байты. А если virt. size == 0, то прочитается ALIGN(phys. size, section_align). Но то, что я пытался сделать, -это какую часть займет размер упакованного файла от исходного. Некоторые программы могут показывать не энтропию, а ((entropy / 8) * 100), якобы выдавая это за "энтропию в процентах". Но это кол-во процентов - не соотношение упакованного файла к оригиналу, так как энтропия возрастает не линейно: -= Энтропия =- -= Во сколько раз можно упаковать =- // 7.4 - 7.7 - упаковано максимально // 7.15 - в 1.11 раз // 6.1 - в 1.3 раза // 4.8 - в 4 раза // 4.422 - можно упаковать в 2 раза // 4.420 - можно в 4 раза // 3.5 - в 10 раз Ты пишешь: DiE показывает теже самые биты, но энтропия 75,504 Скорее всего, это и есть энтропия в процентах (= 6,04032). А я пытался сделать алгоритм, узнающий соотношение размера упакованного файла к исходному (для проверки упаковывал RAR'ом). Получилось несколько алгоритмов, но все они были не очень точные (в каждом случае "показания датчиков" сильно разнились). Мои мысли приближалсь к операциям, входящим в алгоритмы сжатия. Как архиватор узнает - в каком месте файла какой алгоритм сжатия применить? Он использует специальные алгоритмы, выясняющие - насколько хорошо этим способом упакуется фрагмент (или прямо упаковывал его разными способами, а потом сравнивал - какой из них сжимал лучше). В итоге я решил что кроме подсчета энтропии нужно во всем файле искать повторяющиеся комбинации. Ведь, например, слово 'Microsoft Windows' может находится в разных фрагментах файла и в этом случае энтропия их не учтет (т. к. они не будут подсчитываться вместе). Еще есть пара идей - подсчитывать энтропию не отдельных фрагментов, а нескольких фрагментов вместе. Н-р, 1и2, 1и3, 1и4, 1и5, ... 1и36, а потом найти среднюю арифметическую этих энтропий. Это и будет энтропией 1-го фрагмента. Потом таким же образом (не исключая из подсчета пары типа 2-4 и 4-2) подсчитать энтропии всех остальных фрагментов и взять их среднее арифметическое. Так что, через некоторое время, может опять засяду за этот алгоритм ![]() ДОБАВИЛ: Ах да, забыл. Твоя "энтропия" (цифры типа 1.402, 1.002) - это "порядочность" данных, то есть обратная энтропии величина. (там, где ты их написал, сумма твоего числа и энтропии почти равна 8). ![]() |
|
Создано: 01 марта 2009 01:16 · Поправил: Hellspawn · Личное сообщение · #11 |
|
Создано: 01 марта 2009 01:18 · Личное сообщение · #12 Hellspawn пишет: в чём вопрос, кроме того как считают другие? Заинтересовался этой темой, думал будет проще, но как всегда открываются подводные камни. Вот и решил на форум написать. Если эти "другие" не расскажут как делают они, то может быть скажут как не надо делать, чтобы я на их же грабли не наступал ![]() AndreyMust19 пишет: Твоя "энтропия" (цифры типа 1.402, 1.002) - это "порядочность" данных, то есть обратная энтропии величина. Значит ли это, что если из 8 вычесть "порядочность", то получится энтропия? Видимо "да". А значит, что мои результаты почти совпадают с PEiD`овскими. Из твоего поста я понял, почему почти совпадают. Я просто проганяю алго, а PEiD очевидно устраивает пляски с обрезанием алигановских нулей, откидывает макс и мин значения и хз что еще. Как я понял, с произвольным файлом все легко и простой прогон через алго достаточно паказателен, а вот с PE много нюансов. Пока я себе представляю дополнительные условия так: 1) не берем в расчет заголовки (DOS, PE, директории) //Но ведь пакер может всунуть свой код и в пустое место в заголовке и джампить на него (если не ошибаюсь FSG так делает) 2) не берем в рассчет секцию ресурсов, т.к. она не может быть запакована, а если пакер и обработал ресурсы, то они лежат в другом месте, а в секции только не упакованная иконка 3) не совсем ясно, что делать с секцией с неинициализированными данными 4) гемор с V.Size и RawSize Отсюда видно, что нужно почти полностью разбирать PE-файл на запчасти. Это скучно и муторно. Скажите кто писал плагины для PE Tools, насколько сложно освоить их SDK? Позволяет ли он каким-либо образом получать файл в "разобранном" виде? или работает только как дампер? Цитата из редми: PTDS - Это интерфейс для написания плагинов для PE Tools версий 1.5++ Он имеет следующие возможности: - Дапм процесса/модуля процесса - Получение списка процессов/модулей процесса - Оптимизация PE файлов (RebuildPE) ![]() AndreyMust19 не мог бы ты показать свои наработки? Исходники не прошу, покажи exe. Масштабы работы видно не малые, хотелось бы увидеть чего ты уже добился. А вообще, то что ты рассказал это уже эвристика и если все грамотно реализовать, то эвристика нехилая. Но масштабы работы немного пугают. ![]() |
|
Создано: 01 марта 2009 17:16 · Поправил: AndreyMust19 · Личное сообщение · #13 Hellspawn зачем столько отсебятины?? В том, что энтропия - это ненадежный признак упакованного файла. Все зависит от того, как программа ее считает и учитывает ли "бесполезные" нули, не несущие в себе данные, а использующиеся только для выравнивания. user_ не берем в рассчет секцию ресурсов, т.к. она не может быть запакована Нет, упаковать ее можно (и она хорошо упаковывается, особенно UNICODE-строки и иконки). Просто не все пакеры это делают, ибо имхо формат Resource Directory - самый сложный из всех. Посмотри - редакторов ресурсов много, но около половины из них меняют их неправильно (что либо гробит ресурсы, либо всю программу). почти полностью разбирать PE-файл на запчасти Не весь. Достаточно заняться только заголовком (между заголовком и первой секцией) и секциями. Лучше взять алгоритм сжатия из архиватора (н-р, bzip) и упаковывать секцию в памяти, а потом сравнить упакованный размер с размером самой секции. Думаю, будет самый надежный способ проверки сжатости секций файла. А "сжатость" образа можно вычислить как среднее арифметическое показателей всех секций. Оверлеи в конце секций и в конце файла учитывать не надо - пакеры их не трогают, так как невозможно узнать - каким образом они используются программой (только если это не отладочная информация). не мог бы ты показать свои наработки? В архиве - все исходники и некоторые exe (релизные и дебагные). Насчет этих примеров я уже ничего не помню. Помоему они тестировочные - так что не удивляйся если программа не откроет файл. Лучше посмотри исходники и скомпилируй их. Может посже выложу версии, которые точно выведут "энтропию" файла, указанного в текстовой строке. ![]() ![]() |
|
Создано: 02 марта 2009 14:02 · Личное сообщение · #14 Hellspawn пишет: зачем столько отсебятины? А вот я бы твою отсебятину послушал с удовольствием ![]() Это одна и таже К? Каково значение К? AndreyMust19 пишет: Лучше взять алгоритм сжатия из архиватора (н-р, bzip) и упаковывать секцию в памяти ИМХО это уж слишком. Какие-то алгоритмы архиваторов... зачем? Тогда уж блаже упаковать архиватором файл и сравнить размеры упакованного и неупакованного ![]() AndreyMust19 пишет: через некоторое время, может опять засяду за этот алгоритм Если засядешь, то лучше реализуй все в виде длл и опиши подробно экспортные функи. Тогда можно будет легко прикрутить к любому проекту. ![]() |
|
Создано: 02 марта 2009 15:04 · Личное сообщение · #15 |
![]() |
eXeL@B —› Вопросы новичков —› Энтропия файлов |