Русский / Russian English / Английский

Сейчас на форуме: (+3 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Софт, инструменты —› PEAnatomist - внутренности PE-файлов
<< . 1 . 2 . 3 . 4 . 5 .
Посл.ответ Сообщение

Ранг: 63.5 (постоянный)
Статус: Участник

Создано: 11 октября 2019 19:56 · Поправил: RamMerlabs New!
Цитата · Личное сообщение · #1

Хочу поделиться небольшой программкой для просмотра внутренностей PE-файлов - PEAnatomist. Да, это очередной просмотрщик PE. Но с некоторыми востребованными (по крайней мере мной ) возможностями, которых мне не удалось найти нигде более.



Помимо обычного набора из базовых заголовков, импорта, экспорта, ресурсов и т.д. PEAnatomist глубоко вонзает "скальпель" в таблицы Base Relocations, LoadConfig и ExceptionsData.
Вскрываются все поля и таблицы из LoadConfig - вплоть до самых свежих из Win SDK 18362 (Enclave и Volatile Metadata). Производится лёгкий анализ содержимого по релоцируемым VA, в т.ч. для специфичных типов релокации архитектур ARM7 Thumb и IA64. И, наконец, полный разбор таблиц ExceptionsData для архитектур x64, ARM7, ARM7 Thumb, ARM64, IA64 и специфичных для языка данных.


Например так отображается таблица Exceptions для x64 и для ARM64 с разбором кодов раскрутки.


На закуску ещё есть декодирование всех элементов из Rich-подписи с указанием всех используемых при создании PE инструментов, отображение многих типов отладочной информации.

Установка программы не требуется, дополнительных зависимостей нет. Административные права программа не требует, но без них не получится добавить ассоциации с файлами в проводнике. Программа никуда кроме файла настроек (рядом с программой или в %appdata% в зависимости от ряда условий) ничего не пишет, не отправляет.

Ознакомиться подробнее с возможностями программы и скачать её можно на сайте программы
Новая версия 0.1.12 (2020-02-13): Скачать

| Сообщение посчитали полезным: mak, Adler, Qbik, Hugo Chaves, HandMill, plutos, MarcElBichon, hors, Bronco, morgot, v00doo, BlackCode, GPcH, DICI BF, ==DJ==[ZLO], CyberGod, TRPD, crypto, DenCoder, UniSoft, exZet, dosprog, -=AkaBOSS=-, SReg, Orlyonok, icerix, topmo3, Jupiter, r_e, Jaa, stnt, ELF_7719116, Bad_guy, WELL


Ранг: 63.5 (постоянный)
Статус: Участник

Создано: 3 февраля 2020 18:34 New!
Цитата · Личное сообщение · #2

r_e
Выкладывали, видел, читал. Иногда подглядываю в основном define'ы всякие. Но там кода в несколько раз больше, чем во всём peanatomist )) Прикрутить целиком получится только линкуя obj, но вместе с тем и получить дополнительные зависимости. Переписывать всё это как есть не хочется, да и нет необходимости все фичи переносить, поэтому пишу с нуля хотя бы до уровня таблицы символов. Но это пока совсем не приоритетная задача.


Ранг: 666.9 (! !)
Статус: Участник
CyberMonk

Создано: 3 февраля 2020 19:28 New!
Цитата · Личное сообщение · #3

MSPDBView

{ Атач доступен только для участников форума } - MSPDBView.zip

| Сообщение посчитали полезным: RamMerlabs, plutos



Ранг: 574.7 (!)
Статус: Участник
_Вечный_Студент_

Создано: 4 февраля 2020 00:00 New!
Цитата · Личное сообщение · #4

Aвтор проэкта не хочет совать в него чужой код и хочет все сделать сам.
Это вполне понятно и заслуживает уважения.
Удачи!

| Сообщение посчитали полезным: dosprog


Ранг: 63.5 (постоянный)
Статус: Участник

Создано: 13 февраля 2020 22:44 · Поправил: RamMerlabs New!
Цитата · Личное сообщение · #5

Обновление программы до версии 0.1.12 (2020-02-13):
[#] Исправлена ошибка интеграции в контекстное меню оболочки
[#] Исправлено поведение программы во время загрузки нового файла при наличии открытых окон свойств ресурсов
[#] Исправлена ошибка отображения описания некоторых символов в таблице Dyn.Value Relocations
[#] Исправлена ошибка разбора таблицы ExceptionsData для ARM Thumb: некорректная информация о сохраняемых регистрах в сжатой форме UnwindInfo
[+] Натуральная сортировка добавлена для ещё нескольких списков
[#] Исправлена ошибка наполнения списка Catch Handlers для UnwindInfo.EHData.CPP_EH4
[#] Устранена ошибка, приводящая к медленному выполнению операции "Выделить всё" на больших списках
[+] Часть списков с большим количеством строк переведены на виртуальный режим
[+] Добавлен переход по связанным элементам UNWIND_INFO списка ExceptionData для x64


Список ExceptionsData теперь переведён на виртуальный режим, что значительно ускорило отображение на большом количестве элементов. Ожидание на таблице в полмиллиона строк - порядка 0.3 секунды.

Пользуясь случаем спрошу совета. В процессе реализации привычных для невиртуального режима плюшек Listview, столкнулся с трудностью сохранения состояния строк после сортировки. Например, 10, 20 и 30 строки списка были выделены (LVIS_SELECTED), далее список сортируется по какой-нибудь колонке, если ничего не предпринимать - выделение строк остаётся для тех же номеров, но из-за сортировки их содержимое уже другое. Для хранения порядка сортировки выделяется отдельный массив dword'ов (собственно он и сортируется) и отображение строк мапится через него. Если списку отправить LVM_SETCALLBACKMASK c LVIS_SELECTED|LVIS_FOCUSED, то худо-бедно хранить состояние получается, но список перестаёт отображать фокус и выделение строки (XP) или показывает выделение только для одной строки даже если реально выделено больше (7+). В сети про LVM_SETCALLBACKMASK нахожу информацию только в контексте применения с LVIS_STATEIMAGEMASK.
Хотелось бы как-то асинхронно наполнять массив для хранения состояния строк и так же асинхронно (через LVN_DISPINFO) это состояние выдавать. Может кто сталкивался с таким поведением? Вариант написать свой listview уже рассматриваю, но это определённо будет не скоро.

Сайт программы # Скачать новую версию

| Сообщение посчитали полезным: SReg, mak



Ранг: 666.9 (! !)
Статус: Участник
CyberMonk

Создано: 14 февраля 2020 01:53 New!
Цитата · Личное сообщение · #6

RamMerlabs пишет:
Хотелось бы как-то асинхронно наполнять массив для хранения состояния строк и так же асинхронно (через LVN_DISPINFO) это состояние выдавать.


How to Use Virtual List-View Controls - --> Link <--
Using virtual lists --> Link <--

В атаче пример на ассемблере ...

{ Атач доступен только для участников форума } - VirtListView.zip

Ранг: 63.5 (постоянный)
Статус: Участник

Создано: 14 февраля 2020 11:41 New!
Цитата · Личное сообщение · #7

mak
Это всё известно, используется и полностью работоспособно:
>>Список ExceptionsData теперь переведён на виртуальный режим

Вопрос в самостоятельном хранении состояния строк - выделено, в фокусе - и переносе этого состояния на строки после сортировки.


Ранг: 666.9 (! !)
Статус: Участник
CyberMonk

Создано: 14 февраля 2020 17:14 · Поправил: mak New!
Цитата · Личное сообщение · #8

RamMerlabs пишет:
Вопрос в самостоятельном хранении состояния строк - выделено, в фокусе - и переносе этого состояния на строки после сортировки.


Selection Problems
After adding advanced features to my virtual list, such as caching and searching capabilities, I felt that it was pretty much "feature complete." One last minor issue was to select an initial entry when the list is first displayed. With normal listviews, this generally isn't a big deal. It's simply a matter of setting a particular item's state to selected. Unfortunately, that didn't turn out to be so simple with a virtual listview. I used the normal listview approach of setting an item's selected state, but much to my dismay the selection never appeared. After much struggle, I eventually came to the conclusion that programmatic selection must not work properly for virtual listviews. But, it was very interesting to note that although selecting an entry through code didn't work properly, selecting it with a mouse always yielded the desired results. Having spent many years developing Windows applications, I immediately thought of a less-than-glamorous workaround.

I theorized that if I could mimic the behavior of a user's mouse click, I might be able to trick the virtual list control into a programmatic selection. I did this by calling the CListCtrl::EnsureVisble() method to make sure the item to select is in the visible area of the list. Next, I called the ClistCtrl::GetItemRect() method to get the rectangle of the item I wanted to select. Then I called CListCtrl::SetItemState() to set the item's state to selected. Finally, I posted a "fake" mouse message to the list control by sending WM_LBUTTONDOWN and WM_LBUTTONUP messages to the virtual list, while supplying the item's rectangle as the location of the mouse clicks. Much to my surprise, this simple solution worked extremely well for programmatically selecting list items. To simplify using this approach, I incorporated the code into the SelectItem() method of my CVListCtrl class (see vlist.cpp).



Code:
  1. void CVListCtrl::SelectItem(int nIndex)
  2.          CRect rc;
  3.  
  4.          EnsureVisible(nIndex,FALSE);
  5.          GetItemRect(nIndex,rc,LVIR_BOUNDS);
  6.          SetItemState(nIndex,LVIS_SELECTED,LVIS_SELECTED);
  7.          PostMessage(WM_LBUTTONDOWN,0,MAKELPARAM(rc.left,rc.top));
  8.          PostMessage(WM_LBUTTONUP,0,MAKELPARAM(rc.left,rc.top));
  9. }
  10.  
  11. void CVListCtrl::SelectItem(LPCTSTR lpszItem)
  12. {
  13.          LV_FINDINFO lvFindInfo;
  14.  
  15.          lvFindInfo.flags = LVFI_PARTIAL;
  16.          lvFindInfo.psz = lpszItem;
  17.          int nIndex = FindItem(&lvFindInfo);
  18.  
  19.          if(nIndex >= 0) 
  20.                  SelectItem(nIndex);
  21. }


--> Link <--
Весь проект - --> Link <--

Ранг: 63.5 (постоянный)
Статус: Участник

Создано: 14 февраля 2020 18:22 · Поправил: RamMerlabs New!
Цитата · Личное сообщение · #9

mak
Блин, и это я читал уже, и это снова совсем не о том.
Здесь речь о выделении конкретной строки с заранее заданным номером. Причём в этом примере процедура излишне усложнена. Все эти примеры кочуют по сайтам и показывают только самое примитивное использование.
Повторюсь в очередной раз - мой вопрос о том, как асинхронно (т.е. в момент возникновения события изменения состояния строки) сохранить состояние себе и так же асинхронно (т.е. в момент запроса ListView на отображение строки - LVN_GETDISPINFO) вернуть его после изменения порядка отображения строк.
Документация оговаривает такую возможность отправкой сообщения LVM_SETCALLBACKMASK, но это прекрасно работает, когда нужно обрабатывать состояние например чекбокса (при его наличии) - wParam=LVIS_STATEIMAGEMASK, но если обрабатывать состояния LVIS_SELECTED | LVIS_FOCUSED, то выходит фигня. По крайней мере у меня. Получить состояние вобщем-то не проблема - LVN_ODSTATECHANGED (хоть и ооочень ограниченно - только выделение строк подряд и отсутствие реакции на программное выделение) и LVN_ITEMCHANGED в помощь. Но выдача этого состояния через LVN_GETDISPINFO оборачивается отсутствием фокусной рамки и самого выделения строки при прорисовке. Если программно запросить состояние - всё ок, как надо. Но прорисовки нет.
Остаётся пока только проходить по всему списку LVM_GETNEXTITEM (LVNI_SELECTED), сохраняя индексы себе, до сортировки списка и отдельно каждую отмеченную строку выделять после сортировки. Оверхед бешеный.
Вот я и интересуюсь - делал ли кто-нибудь что-то подобное и как?
Гугло-яндо-бинго-байда-утко-поиски прочесаны вдоль и поперёк с кучей вариантов запросов.
<< . 1 . 2 . 3 . 4 . 5 .
 eXeL@B —› Софт, инструменты —› PEAnatomist - внутренности PE-файлов

Видеокурс ВЗЛОМ