Как заставить LightShot выдавать прямые ссылки? Одним байтом

в 9:58, , рубрики: lightshot, патчинг, реверс-инжиниринг

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, сохраняем файл, запускаем скриншоттер и проверяем работоспособность. Если всё правильно сделали, у вас обезательно должно получится. Если что-то пошло не так, скачать пропатченный мною файл можно тут.

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

Автор: NarutoUA

Источник

Поделиться новостью

* - обязательные к заполнению поля