- 692
- 1,550
Есть очень много утилит для быстрого создания и редактирования скриншотов и каждая из них имеет свои недостатки и преимущества. В дальнейшем речь будет идти о 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) и делаем тестовый скриншот для отправки. Сработал брейкпоинт на обращение к строке "https://api.prntscr.com/v1/". Перейдя к окну дизассемблера и пролистав немного вниз, можно увидеть, как функция формирует POST запрос к серверу оф. сайта.
Примерно запрос выглядит вот так:
Переходим в конец процедуры (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 (первая ссылка) меняем на 0x20 (вторая). Закрываем это окно, и запускаем программу (F9).
Вуаля, получилось! Работает, даже если включить в настройках автоматическое копирование ссылки и закрытие окна. Теперь осталось пропатчить файл "uploader.dll". Перед закрытием отладчика скопируем смещение для дальнейшего патчинга. На инструкции вызываем контексное меню -> Copy -> RVA. От полученого шестнадцатеричнего числа нужно вычесть 0xC00 (например, в стандартном калькуляторе в режиме "Программист"). У меня вышло число 0x19190. Теперь можно закрыть отладчик.
Запускаем HxD, открываем в нём файл. В главном меню жмём "Поиск -> Перейти... (Ctrl+G)". Переходим в сохраненному выше смещению.
Перед патчингом библиотеки делаем бэкап и закрываем LightShot. Меняем 14 на 20, сохраняем файл, запускаем скриншоттер и проверяем работоспособность. Если всё правильно сделали, у вас обезательно должно получится. Если что-то пошло не так, в аттаче лежит пропатченный мною файл.
Вот так вот изменением одного байта в программе можно существенно упростить себе жизнь.
Для решения этой задачи я использовал бесплатные опен-сорс отладчик 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) и делаем тестовый скриншот для отправки. Сработал брейкпоинт на обращение к строке "https://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 (первая ссылка) меняем на 0x20 (вторая). Закрываем это окно, и запускаем программу (F9).
Вуаля, получилось! Работает, даже если включить в настройках автоматическое копирование ссылки и закрытие окна. Теперь осталось пропатчить файл "uploader.dll". Перед закрытием отладчика скопируем смещение для дальнейшего патчинга. На инструкции вызываем контексное меню -> Copy -> RVA. От полученого шестнадцатеричнего числа нужно вычесть 0xC00 (например, в стандартном калькуляторе в режиме "Программист"). У меня вышло число 0x19190. Теперь можно закрыть отладчик.
Запускаем HxD, открываем в нём файл. В главном меню жмём "Поиск -> Перейти... (Ctrl+G)". Переходим в сохраненному выше смещению.
Перед патчингом библиотеки делаем бэкап и закрываем LightShot. Меняем 14 на 20, сохраняем файл, запускаем скриншоттер и проверяем работоспособность. Если всё правильно сделали, у вас обезательно должно получится. Если что-то пошло не так, в аттаче лежит пропатченный мною файл.
Вот так вот изменением одного байта в программе можно существенно упростить себе жизнь.