Як змусити 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, зберігаємо файл, запускаємо скриншоттер і перевіряємо працездатність. Якщо все правильно зробили, у вас обов'язково повинно вийти. Якщо щось пішло не так, скачати пропатченних мною файл можна тут.

Ось так ось зміною одного байта в програмі можна спростити собі життя.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.