VEG’s Blog
Есть у меня папка со старыми картинками, которые я собирал в нулевых. Переношу с компьютера на компьютер вместе со всеми моими файлами при каждом апгрейде, изредка захожу поностальгировать. Но каждый раз меня немного смущало то, что стандартный просмотрщик Windows 7 не показывал GIF-анимацию, хотя память мне подсказывала, что во времена XP анимация показывалась без проблем. При очередном приступе ностальгии я всё же решил запустить просмотрщик из XP на Windows 7. После преодоления ряда препятствий, я теперь уверен — GIF-анимация там действительно поддерживалась! А главное — теперь я могу смотреть свою старую папку с картинками в аутентичном интерфейсе просмотрщика картинок Windows XP, что создаёт более подходящую атмосферу =)
Скачать: shimgvw_xp32.7z (включает бинарник и исходный код лаунчера, плюс shimgvw.dll из англоязычной Windows XP SP3).
Как это было сделано?
Стандартный просмотрщик картинок в Windows XP — это не обычное приложение. Он находится в библиотеке shimgvw.dll, и запустить его напрямую нельзя — нужен как минимум rundll32 (указание пути к существующему файлу картинки обязательно):
Но этот трюк не срабатывает при попытке запуска shimgvw.dll из Windows XP на Windows 7 и новее — shimgvw.dll не может загрузиться, ему для корректной работы нужен режим совместимости с Windows XP. Этого можно добиться, установив соответствующий режим совместимости для копии rundll32, но совместимость с XP подразумевает под собой повышение прав приложения до максимальных, что вызывает появление диалога UAC при каждом запуске, чего хотелось бы избежать.
Небольшой танец с отладчиком позволил выяснить причину — в процессе загрузки shimgvw.dll впоследствии пытается импортировать несколько функций из shunimpl.dll, где хранятся устаревшие функции оболочки, и последняя по умолчанию отказывается загружаться, если ATOM «FailObsoleteShellAPIs» отсутствует (наличие этого ATOM разрешает загрузку библиотеки, но тогда все устаревшие функции просто возвращают код с ошибкой). Режим совместимости с XP, помимо прочего, устанавливает этот ATOM, поэтому просмотрщик и запускается.
Было решено написать небольшой лоадер, который добавляет ATOM «FailObsoleteShellAPIs», спрашивает какую картинку открыть (если в параметрах не был передан путь), и дальше передаёт управление в shimgvw.dll. Просмотрщик работает нормально (т.е. изначальная задача была выполнена), так что я не стал исследовать, что же за устаревшие функции импортируются из shunimpl.dll и в каких случаях они используются — видимо, ничего критичного для работы просмотрщика они не делают.
Поскольку для реализации лоадера не нужно ничего кроме небольшого числа функций WinAPI, я решил в качестве эксперимента собрать проект при помощи Clang без использования рантайма (ранее я всегда использовал MSVC для таких танцев). Таким образом, получился исполняемый файл размером 14 килобайт, из которых 9 килобайт ушло на иконку. Если кому-то также нравится делать мини-приложения без зависимостей от нестандартных библиотек — данный проект может послужить небольшим примером, как это делается при помощи Clang.
Очень интересно, Евгений. Всегда с интересом читаю ваши статьи на тему реверсинга и здесь и на «хабре». Даже сам стал немного приобщаться к этому делу. Некоторое время я просто компилировал на СИ, СИ++ свои простенькие примеры и изучал как они устроены в дизассемблере. А тут думаю, а не попробовать ли мне усложнить задачу. Захотелось в каком-нибудь чужом коде найти какую-нибудь интересующую меня функцию и проанализировать её. Хочу взять обычный калькулятор из Win7-32bit и найти там интересующую меня функцию. Но вот пока не могу сообразить как мне это пограмотнее или правилнее сделать. Может посоветуете что-нибудь, Жень? Мы же когда нажимаем кнопку функции, то запускаем определенный участок кода, который по окончании работы записывает в память данные. Как можно опираясь на эти события (запись в память и нажатие кнопки) найти нужный участок кода. Или в таких случаях долго и упорно анализируют дизассемблированый код и только после этого уже находят нужный участок. Как тут можно облегчить себе задачу, чтобы не делать двойную работу? Спасибо вам заранее за ответ.
Argo, стандартный калькулятор вероятно написан с использованием достаточно низкоуровневого кода, так что нужно искать типичный код работы с окнами на голом Win32 API. Найдите код, который создаёт окно, посмотрите какая там указана процедура для обработки сообщений от окна, изучите её код. Если нужно — можно на помощь призвать отладчик, посмотреть как выполняется тот или иной код в реальных условиях. Как правило, изучать вообще весь код не нужно. Но чтобы двигаться в правильном направлении, нужно представлять, как то приложение, которое вы исследуете, могло бы быть написано.
Блиин… а проперло все таки..
Заметил только что подсказки на английском. с английской версии выдрали?)
И вопрос а ассоциировать его можно?
Хочу свою голубую мечту рассказать.. как то я попробывал вин8.1 и мне она не особо понравилась.. 7ка была и стабильней и привычней.. но диспетчер задач не давал мне спокойно спать.. очень уж мне он понравился. Сейчас уже сижу на 10ке.. и приятно представлять что все таки кто нибудь таки сможет портировать диспетчер из 10ки на 7ку.
Почитал вашу статью, понял что это нереальная задача) Видимо пришло время проститься с 7кой)
shikulja, в статье указано, что файл shimgvw.dll взят из англоязычной Windows XP SP3. Если вам нужен русский язык — можете сами взять этот же файл из русскоязычной версии XP, и запускать его при помощи shimgvw.exe из статьи.
Что касается диспетчера задач из Windows 10, то в нём нет ничего такого, чего нельзя было бы сделать на Windows 7. Но Process Explorer, который можно скачать с сайта Microsoft, всё равно лучше.
Найдите код, который создаёт окно, посмотрите какая там указана процедура для обработки сообщений от окна, изучите её код.
VEG, т.е. нужно сначала мысленно в голове на основе знаний, опыта и логики локализовать примерный участок программы. Затем для выяснения каких-нибудь сомнений, просмотреть это место под отладчиком. Только так? А если не получается вычислить в голове примерное место в программе — можно ли воспользоваться какими-то косвенными ориентирами? Как я уже писал выше — по записи данных в память или по нажатию на кнопки интерфейса? Затем локализовать примерное место, а потом попробовать разобраться на этом участке кода. Ведь есть же программы, которые мониторят обращения к API-функциям. Может и с памятью и обработчиками событий(кнопками) можно такой-же финт провернуть? Хотя интуиция мне подсказывает, что VEG ответит что-то наподобие: ну вы и размечтались. :).
Argo, ну так вызовы импортируемых функций и есть те самые косвенные ориентиры. Если там программа выводит какие-то сообщения — то указатели на соответствующие строки тоже будут ориентиром.
VEG, что-то вы совсем забыли о своих читателях. Пора, видимо, вспомнить о таком понятии как совесть и цитате «мы в ответе за тех кого приручили». 🙂 Может вам открыть небольшую рубрику «Реверсинг» и «замутить» там для начала какую-нибудь статью. Для начала вполне бы подошло что-нибудь про Гидру (GHIDRA). Кстати, как вам она понравилась, непонравилась?
C windows system32 shimgvw dll что это
Сообщения: 51908
Благодарности: 14931
Конфигурация компьютера |
Материнская плата: ASUS P8Z77-V LE PLUS |
HDD: Samsung SSD 850 PRO 256 Гб, WD Green WD20EZRX 2 Тб |
Звук: Realtek ALC889 HD Audio |
CD/DVD: ASUS DRW-24B5ST |
ОС: Windows 8.1 Pro x64 |
Прочее: корпус: Fractal Design Define R4 |
Не запускаются изображения/фото |
Что значит «не запускаются»? Ошибка? Какая?
«shimgvw.dll» загружен, но точка входа dllregisterserver не найдена |
Если в конце проверки выйдет сообщение, что не все файлы удалось восстановить, выложите C:\windows\Logs\CBS\CBS.log в архиве. Если файлы будут восстановлены, перезагрузитесь и проверьте наличие проблемы. |
Paint что ли? Другими вьюерами нормально? |
Что значит «не запускаются»? Ошибка? Какая? |
Конфигурация компьютера |
Материнская плата: ASUS P8Z77-V LE PLUS |
HDD: Samsung SSD 850 PRO 256 Гб, WD Green WD20EZRX 2 Тб |
Звук: Realtek ALC889 HD Audio |
CD/DVD: ASUS DRW-24B5ST |
ОС: Windows 8.1 Pro x64 |
Прочее: корпус: Fractal Design Define R4 |
Конфигурация компьютера |
Материнская плата: MSI H61M-P21 (MS-7680) (B3.0) |
HDD: WDC Caviar Green WD10EARS-22Y5B1 ATA Device 1Т (1000 Gb), WDC Caviar Blue WD10EZEX-08M2NA0 ATA Device 1Т (1000 Gb) |
Звук: VIA VT1708S VIA High Definition Audio |
CD/DVD: ATAPI iHAS122 ATA Device |
ОС: Microsoft Windows 7 Home Basic x86, Microsoft Windows 10 Home x64 . |
Прочее: Multi Flash Reader USB Device, Logitech HD Webcam C310 |
Не восстановлено:
C:\Windows\System32\ shimgvw.dll
C:\Windows\WinSxS\amd64_microsoft-windows-shimgvw_31bf3856ad364e35_6.1.7601.17514_none_754be820df4777a8\ shimgvw.dll
Можете восстановить вручную:
1. Взять файлы, например из дистрибутива в образе \Sources\install.wim (извлечь архиватором или смонтировать образ)
2. Получить доступ и скопировать.
3. После замены вернуть владельца TrustedInstaller
Или взять файл из здоровой аналогичной системы.
Для корректной работы системы, хватит восстановления файла в первом расположении C:\Windows\System32
——-
Будь джентльменом, если есть удача. А нет удачи, джентльменов нет . Нажми .
Последний раз редактировалось ruslan. 18-07-2014 в 16:50 .
сделайте лог Process Monitor следующим образом: запустите Process Monitor; попытайтесь открыть изображение в Проводнике, чтобы получилась ошибка; сохраните лог: меню File -> Save -> PML-формат; заархивируйте и выложите на любой файлообменник, например http://rghost.ru |
Не восстановлено: C:\Windows\System32\shimgvw.dll C:\Windows\WinSxS\amd64_microsoft-windows-shimgvw_31bf3856ad364e35_6.1.7601.17514_none_754be820df4777a8\shimgvw.dll |
Можете восстановить вручную:
1. Взять файлы, например из дистрибутива в образе \Sources\install.wim (извлечь архиватором или смонтировать образ)
2. Получить доступ и скопировать.
3. После замены вернуть владельца TrustedInstaller
Или взять файл из здоровой аналогичной системы.
Для корректной работы системы, хватит восстановления файла в первом расположении C:\Windows\System32
Так как у меня уже поздно, попробую ваш способ завтра.
Уделил всё таки пару минут. И да, тема решена, за это огромное спасибо Руслану. Можно закрывать.