Часто виникають ситуації, коли програма, встановлена на одному комп'ютері, повинна неодмінно виявитися на іншій машині. Причому інсталятора немає, простого копіювання файлів не вистачає, а людина, яка ставила програму, кудись пропав разом з дистрибутивом.
Отже, найголовніше питання: що переносити крім папки з програмою? Умовно все необхідне можна розбити на три пункти:
- Файли, до яких звертається програма.
- Гілки реєстру, до яких звертається програма.
- Середовище виконання.
Якщо з розумінням перших двох пунктів проблем немає, то щодо третього варто зробити уточнення. Під середовищем виконання тут розуміються бази даних, драйвера пристроїв (псевдопристроїв), іменовані канали (Named Pipes), мейлслоти, COM / ActiveX компоненти і так далі. Тобто, все, з чим працює програма (і що надано стороннім софтом, а не операційною системою) через стандартні інтерфейси Windows - будь то мережа, IPC чи щось таке.
Середовище є найпроблемнішим компонентом при перенесенні, і саме через середовища доводиться морочитися, щоб ОС на обох машинах збігалися.
Які файли і гілки реєстру переносити?
Панове, давайте дружно піднімемо келихи з кавою, вип'ємо і вшануємо пам'ять передчасно пішли утиліт-моніторів NT Filemon і NT Regmon, які відстежували звернення будь-якого процесу до файлів і ключів реєстру відповідно. Злий геній Марка Руссиновича безжально анігілював їх ... а потім відтворив з попелу в одному потужному і корисному інструменті. Зустрічайте, Process Monitor. Саме ця тулза буде основною зброєю перенесення і допоможе нам розібратися, які файли використовує програма і до яких ключам в реєстрі звертається. Для цього нам знадобляться дві функції: Show Registry Activity і Show File System Activity.
Розібратися в цій смітнику без допомоги парсеру складно. Щоб спростити завдання, я, коли сам займався подібним перенесенням, накидав два Perl-скрипта (шукай їх на диску). Поклади ці скрипти в папку, де був збережений Logfile.csv (або відразу зберігай лог в папку до скриптів). Тепер запускай parse.pl. Цей скрипт отпарсіт log-файл і створить ще два лога: file.log буде містити унікальні звернення до файлів і папок, reg.log Унікальні звернення до гілок реєстру.
Відокремлюємо мух від котлет
- Потрібен програмі;
- Чи не потрібен програмі;
- На додаткове вивчення.
Сортуючи файли, не забувай редагувати абсолютні (повні) шляху до компонентів (DLL-бібліотек, файлів налаштувань та іншого), якщо знайдеш. Так ми отримаємо REG-файли, які необхідно імпортувати на цільовій машині. Тепер з приводу файлів. В папці subdir скрипт відтворив дерево звернень до файлів таким чином:
subdir
C (буква диска)
Program Files
... і так далі, до файлів включно.
безпосередній перенесення
Якщо про захист системних бібліотек Windows хоч якось подбає SFC (System File Checker), то в разі реєстру такої допомоги чекати не доводиться. Тому при імпортуванні гілок реєстру з робочої машини потрібно бути подвійно обережним. Причому, як і у випадку з файлами налаштувань, доведеться коригувати шляху в строкових параметрах. Зареєструй COM-компоненти - їх легко визначити за наявністю декількох експортованих функцій (DllRegisterServer, наприклад).
Тим, хто забув: реєстрація проводиться командою regsvr32 component.dll, де component.dll є COM-сервером (до речі, COM-сервер може знаходитися і всередині exe-файлу). Цінителям Total Commander буде приємно, що для їхнього улюбленця є listerплагін, який на раз визначає COM / ActiveX. Якщо програма використовує якісь специфічні технології, необхідна додаткова настройка. Скажімо, у випадку з використанням BDE (Borland Database Engine) необхідно внести відповідні зміни у DataSource'ов, які використовує програма.
Після цього залишається тільки проинсталлировать і налаштувати середовище, яке потрібна нашому додатку (якщо потрібна). Стандартні компоненти на зразок сервера БД ти встановиш сам. Перенесення середовища повинен бути найлегше, оскільки для серверів БД є нормальні інсталятори. Встановити драйвер можна необхідні інструменти, а зареєструвати COM-сервер ще простіше.
перенесення драйверів
А що робити, якщо програма працює з драйвером, єдиний установник якого втрачено разом з install.exe? Та й як взагалі визначити, що програма працює з драйвером? Якоїсь спеціальної тулзи я не знайшов, тому скористаємося OllyDbg. Щоб працювати через DeviceIoControl (через цю системну функцію драйверу пристроїв відправляються різні команди), спочатку необхідно відкрити створений пристрій через символічне посилання викликами CreateFileA / CreateFileW. Від цього і будемо танцювати.
Дуже ймовірно, що доведеться імітувати її реальне використання, оскільки ми не знаємо, в який момент може статися звернення до драйверу. Відкривай в OllyDbg лог (комбінація клавіш
Настала черга пошуку самого файлу драйвера. Більшість драйверів розташовуються в% SystemRoot% System32Drivers. Перейди в цю папку і шукай UNICODE-рядок імені пристрою (DeviceDevName). Якщо файлу з такою рядком немає, то відкривай «Сервіс Менеджер».
Там шукай все драйвера, які розташовуються по нестандартному шляху - шукана стрічка повинна бути в одному з них. Цей же «Сервіс Менеджер» допоможе тобі перенести драйвер на інший комп'ютер (зроби скріншоти налаштувань, пропиши залежності і так далі).
Підводні камені
Якщо є можливість, то обов'язково проведи всі експерименти тільки на віртуальній машині - так ти будеш впевнений, що система не загиджені і не буде пошкоджено основну операційну систему. Перш ніж мужньо рватися в бій, я тобі пропоную спробувати свої сили на спеціально розробленою програмою. Власне, корисність від програми нульова, але перенести її просто так не вийде.
Bdetest.exe працює з BDE через алиас «testBDE», за якимось чортом звертається до драйверу і просто не може функціонувати без певної інформації в реєстрі і файлової системи. На диску ти зможеш знайти все необхідне: результат роботи скриптів, скрін BDE-аліаса, драйвер, базу і саму програму.
висновок
Перенесення програм без інсталятора - нетривіальне завдання. Необхідно мати знання в багатьох сферах IT - адмініструванні, програмуванні, дизассемблирования, налагодженні, базах даних. Але завжди пам'ятай: нестерпних програм не буває! Адже, як свідчить маніфест хакера, якщо комп'ютер робить помилку, то це ти напартачив.
Покажи цю статтю друзям: