image

Есть очень много утилит для быстрого создания и редактирования скриншотов и каждая из них имеет свои недостатки и преимущества. В дальнейшем речь будет идти о LightShot, которую я использую уже несколько лет и менять её на аналог в ближайшем будущем я не собираюсь. Подробней об этой программе можно узнать на официальном сайте или википедии.

Как исправить главный недостаток программы можно узнать под катом.

Единственный для меня недостаток в этой программе — загрузчик скриншотов в Интернет. Он загружает ваш скриншот на сервера Imgur и возвращает ссылку на поддомен оф. сайта программы: prntscr.com. Это не было бы проблемой для меня, если LightShot выдавал прямой линк на скриншот, но, увы, приходилось каждый раз копировать прямую ссылку через контекстное меню браузера. Мне надоело повторять эту процедуру каждый раз и я решил это исправить.

Для решения этой задачи я использовал бесплатные опен-сорс отладчик x64dbg и шестнадцатеричный редактор HxD. Зайдя в папку программы, можно найти интересную библиотеку «uploader.dll». Именно ёё я и буду разбирать.

Подключив отладчик к процессу Lightshot, первым делом я решил проанализировать строки этого модуля. Чтобы посмотреть, какие же строки используются в конкретном модуле, нужно сначала перейти к библиотеке в окне дизассемблера: в кладке «Memory Map» найти модуль «uploader.dll» и в контекстном меню выбрать «Follow in Disassembler».

image

Переходим к окну «String references» (Контекстное меню -> Search for -> Current Module -> String references). Вбив в поиск «http», наблюдаем картину:

image

Больше всего меня заинтересовали последние 2 строки, ставим брейкпоинт (F2) на обращение к ним:

https://api.prntscr.com/v1/
http://upload.prntscr.com/upload/%I64d/%s/

Продолжаем работу программы (F9) и делаем тестовый скриншот для отправки. Сработал брейкпоинт на обращение к строке «api.prntscr.com/v1». Перейдя к окну дизассемблера и пролистав немного вниз, можно увидеть, как функция формирует POST запрос к серверу оф. сайта.

image

Примерно запрос выглядит вот так:

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]).

image

Далее следует вызов 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 и смотрим результат:

image

Видимо SendMessage отправило окну указание вставить первую ссылку в EditBox. Интересно, зачем вторым параметром передается прямая ссылка на Imgur? Попробуем подменить передачу первой строки на вторую. Ставим брейкпоинт (F2) на инструкцию:

5F529D90 | lea eax,dword ptr ss:[esp+14] | ;[esp+14]:http://prntscr.com/agjn4j

Теперь перезапускаем программу, пробуем загрузить новый скриншот на сервер и идем до последней точки останова (ту, на которой мы остановились впервые, можно удалить/выключить во вкладке «Breakpoints»).

image

Кликаем два раза на инструкцию и в появившемся окне.

image

Смещение 0x14 (первый URL) меняем на 0x20 (второй). Закрываем это окно, и запускаем программу (F9).

image

Вуаля, получилось! Работает, даже если включить в настройках автоматическое копирование ссылки и закрытие окна. Теперь осталось пропатчить файл «uploader.dll». Перед закрытием отладчика скопируем смещение для дальнейшего патчинга. На инструкции вызываем контекстное меню -> Copy -> RVA. От полученого шестнадцатеричнего числа нужно вычесть 0xC00 (например, в стандартном калькуляторе в режиме «Программист»). У меня вышло число 0x19190. Теперь можно закрыть отладчик.

Запускаем HxD, открываем в нём файл. В главном меню жмём «Поиск -> Перейти… (Ctrl+G)». Переходим в сохраненному выше смещению.

image

Перед патчингом библиотеки делаем бэкап и закрываем LightShot. Меняем 14 на 20, сохраняем файл, запускаем скриншоттер и проверяем работоспособность. Если всё правильно сделали, у вас обязательно должно получиться. Если что-то пошло не так, скачать пропатченный мною файл можно тут.

Вот так вот изменением одного байта в программе можно упростить себе жизнь.

Комментарии (13)


  1. EndUser
    18.03.2016 13:29

    Повезло, что нужная строка рядом оказалась.
    Спасибо за .dll (хотя она тремя браузерами не качается как катастрофически опасная).


    1. NarutoUA
      18.03.2016 14:28

      Изначально я собирался писать прокси-библиотеку и ставить хуки в некоторых местах, но, к счастью, мне действительно повезло. Дело в том, что если с оф. сайтом программы что-то случилось, программа подсовывает юзеру второй, прямой линк.
      Файл перезалил на dropbox.


      1. EndUser
        18.03.2016 15:25

        А теперь если с сайтом программы что-то случилось — подсунет третий линк?!


  1. StreetAngel
    18.03.2016 14:28
    +1

    сделал онлайн используя:https://hexed.it/

    поменял 14 на 20 всё отлично работает
    http://i.imgur.com/qNMyHY5.png

    спасибо


    1. kolpeex
      18.03.2016 15:38

      Спасибо за ссылку на такой сервис!


  1. kaimi_ru
    18.03.2016 14:56
    +1

    Под Windows лучше ShareX использовать, вдобавок опенсорс


    1. EndUser
      18.03.2016 15:30
      +1

      Лучше, чем что?
      Не нашёл способа подрисовать стрелочки с текстом перед сохранением/публикацией.


      1. kaimi_ru
        18.03.2016 16:03
        -1

        Лучше чем пользоваться упомянутым в статье софтом


    1. FeNUMe
      18.03.2016 16:39
      +1

      Или кросплатформенный Screencloud


    1. Doomsday_nxt
      19.03.2016 08:11

      Конечно, это пушкой по воробьям, но меня в целом устраивает функционал скриншотов в Яндекс.Диске. Там и стрелочки можно подрисовать :-)


  1. madegg
    18.03.2016 18:06

    отлично, пользуюсь LightShot уже пару лет, теперь все намного удобней


  1. BOOTor
    18.03.2016 18:43

    Подправил WinHex-ом. Там адресация в 10-ричной системе, соответственно адрес 00019190h соответствует 00102800 в десятичной системе.


  1. ZnW
    20.03.2016 00:40

    LightShot, которую я использую уже несколько лет и менять её на аналог в ближайшем будущем я не собираюсь.

    Собираетесь, надеюсь:
    https://vk.com/soft_kiss
    На неё пересел с упомянутого тут LightShot.
    Недостатков перед ним не вижу, функционал тот же и даже больше: можно выбирать сервер (даже на свой!1), на который заливать изображения, и их довольно много.
    И я молчу про автокопирование ссылки в буфер обмена, мега-удобную историю скриншотов, сохранение на диск и многое другое.