Есть очень много утилит для быстрого создания и редактирования скриншотов и каждая из них имеет свои недостатки и преимущества. В дальнейшем речь будет идти о LightShot, которую я использую уже несколько лет и менять её на аналог в ближайшем будущем я не собираюсь. Подробней об этой программе можно узнать на официальном сайте или википедии.
Как исправить главный недостаток программы можно узнать под катом.
Единственный для меня недостаток в этой программе — загрузчик скриншотов в Интернет. Он загружает ваш скриншот на сервера Imgur и возвращает ссылку на поддомен оф. сайта программы: prntscr.com. Это не было бы проблемой для меня, если LightShot выдавал прямой линк на скриншот, но, увы, приходилось каждый раз копировать прямую ссылку через контекстное меню браузера. Мне надоело повторять эту процедуру каждый раз и я решил это исправить.
Для решения этой задачи я использовал бесплатные опен-сорс отладчик x64dbg и шестнадцатеричный редактор HxD. Зайдя в папку программы, можно найти интересную библиотеку «uploader.dll». Именно ёё я и буду разбирать.
Подключив отладчик к процессу Lightshot, первым делом я решил проанализировать строки этого модуля. Чтобы посмотреть, какие же строки используются в конкретном модуле, нужно сначала перейти к библиотеке в окне дизассемблера: в кладке «Memory Map» найти модуль «uploader.dll» и в контекстном меню выбрать «Follow in Disassembler».
Переходим к окну «String references» (Контекстное меню -> Search for -> Current Module -> String references). Вбив в поиск «http», наблюдаем картину:
Больше всего меня заинтересовали последние 2 строки, ставим брейкпоинт (F2) на обращение к ним:
https://api.prntscr.com/v1/
http://upload.prntscr.com/upload/%I64d/%s/
Продолжаем работу программы (F9) и делаем тестовый скриншот для отправки. Сработал брейкпоинт на обращение к строке «api.prntscr.com/v1». Перейдя к окну дизассемблера и пролистав немного вниз, можно увидеть, как функция формирует POST запрос к серверу оф. сайта.
Примерно запрос выглядит вот так:
POST https://api.prntscr.com/v1/ HTTP/1.1
Accept: */*
Content-Type: application/x-www-form-urlencoded
Host: api.prntscr.com
Content-Length: 261
Cache-Control: no-cache
{"jsonrpc":"2.0","method":"save","id":1,"params":{"img_url":"http:\/\/i.imgur.com\/ah58FSY.png","thumb_url":"http:\/\/i.imgur.com\/ah58FSYs.png","delete_hash":"3VYbjevxfJ0qIJw","app_id":"{F1F88C8C-9A9B-45E2-913F-489DF108D86F}","width":450,"height":354,"dpr":1}}
Переходим в конец процедуры (Debug->Execute till return [Ctrl+F9]) и выходим из неё (Step into [F7]).
Далее следует вызов WinAPI функции SendMessageW, которая отравляет окну или окнам некое сообщение. В данном случае некому окну программы отправляются две URL:
5E8A9D90 | lea eax,dword ptr ss:[esp+14] | ;[esp+14]:http://prntscr.com/agjj4l
5E8A9D95 | lea eax,dword ptr ss:[esp+20] | ;[esp+20]:http://i.imgur.com/jMfEuFPs.png
Пропускаем несколько инструкций (F8) вместе с вызовом SendMessageW и смотрим результат:
Видимо SendMessage отправило окну указание вставить первую ссылку в EditBox. Интересно, зачем вторым параметром передается прямая ссылка на Imgur? Попробуем подменить передачу первой строки на вторую. Ставим брейкпоинт (F2) на инструкцию:
5F529D90 | lea eax,dword ptr ss:[esp+14] | ;[esp+14]:http://prntscr.com/agjn4j
Теперь перезапускаем программу, пробуем загрузить новый скриншот на сервер и идем до последней точки останова (ту, на которой мы остановились впервые, можно удалить/выключить во вкладке «Breakpoints»).
Кликаем два раза на инструкцию и в появившемся окне.
Смещение 0x14 (первый URL) меняем на 0x20 (второй). Закрываем это окно, и запускаем программу (F9).
Вуаля, получилось! Работает, даже если включить в настройках автоматическое копирование ссылки и закрытие окна. Теперь осталось пропатчить файл «uploader.dll». Перед закрытием отладчика скопируем смещение для дальнейшего патчинга. На инструкции вызываем контекстное меню -> Copy -> RVA. От полученого шестнадцатеричнего числа нужно вычесть 0xC00 (например, в стандартном калькуляторе в режиме «Программист»). У меня вышло число 0x19190. Теперь можно закрыть отладчик.
Запускаем HxD, открываем в нём файл. В главном меню жмём «Поиск -> Перейти… (Ctrl+G)». Переходим в сохраненному выше смещению.
Перед патчингом библиотеки делаем бэкап и закрываем LightShot. Меняем 14 на 20, сохраняем файл, запускаем скриншоттер и проверяем работоспособность. Если всё правильно сделали, у вас обязательно должно получиться. Если что-то пошло не так, скачать пропатченный мною файл можно тут.
Вот так вот изменением одного байта в программе можно упростить себе жизнь.
Комментарии (13)
StreetAngel
18.03.2016 14:28+1сделал онлайн используя:https://hexed.it/
поменял 14 на 20 всё отлично работает
http://i.imgur.com/qNMyHY5.png
спасибо
kaimi_ru
18.03.2016 14:56+1Под Windows лучше ShareX использовать, вдобавок опенсорс
Doomsday_nxt
19.03.2016 08:11Конечно, это пушкой по воробьям, но меня в целом устраивает функционал скриншотов в Яндекс.Диске. Там и стрелочки можно подрисовать :-)
BOOTor
18.03.2016 18:43Подправил WinHex-ом. Там адресация в 10-ричной системе, соответственно адрес 00019190h соответствует 00102800 в десятичной системе.
ZnW
20.03.2016 00:40LightShot, которую я использую уже несколько лет и менять её на аналог в ближайшем будущем я не собираюсь.
Собираетесь, надеюсь:
https://vk.com/soft_kiss
На неё пересел с упомянутого тут LightShot.
Недостатков перед ним не вижу, функционал тот же и даже больше: можно выбирать сервер (даже на свой!1), на который заливать изображения, и их довольно много.
И я молчу про автокопирование ссылки в буфер обмена, мега-удобную историю скриншотов, сохранение на диск и многое другое.
EndUser
Повезло, что нужная строка рядом оказалась.
Спасибо за .dll (хотя она тремя браузерами не качается как катастрофически опасная).
NarutoUA
Изначально я собирался писать прокси-библиотеку и ставить хуки в некоторых местах, но, к счастью, мне действительно повезло. Дело в том, что если с оф. сайтом программы что-то случилось, программа подсовывает юзеру второй, прямой линк.
Файл перезалил на dropbox.
EndUser
А теперь если с сайтом программы что-то случилось — подсунет третий линк?!