РЭДЛАЙН
Лучшие решения для Вас и Вашего бизнеса!
На нашем сайте вы можете получить информацию о веб-разработке, обслуживании и продвижении сайта. Интернет-маркетинге. SEO (поисковой оптимизации). Контекстной и медийной рекламе в Интернете. SMM. Регистрации доменов и хостинговых услугах. И современном дизайне сайтов. Вообщем того что касается веб-разработки, а также много другой полезной информации из мира интернета, бизнеса и интернет-технологий...
Создаем доступные и современные сайты, которые работают! Обслуживаем и эффективно продвигаем интернет-проекты с 2006 года!
Главная Блоги Пишем упаковщик по шагам. Шаг седьмой. Релокации.


Пишем упаковщик по шагам. Шаг седьмой. Релокации.

Предыдущий шаг здесь. Там, кстати, имелась ошибка в коде, я ее поправил. Она проявлялась, когда у файла было больше одного TLS-коллбэка.

Появилась новая версия библиотеки для работы с PE-файлами (0.1.7). Перекачайте и пересоберите ее.

Перейдем к следующей немаловажной части многих PE-файлов - релокациям. Они используются, когда невозможно загрузить образ по указанному в заголовке базовому адресу. Преимущественно такое поведение характерно для DLL-файлов (они в принципе без релокаций не могут нормально работать). Представьте, что exe-файл грузится по адресу 0x400000. Этот exe-файл грузит DLL, которая также грузится по этому адресу. Адреса совпадают, и загрузчик будет искать релокации у DLL-файла, потому что он грузится вторым после exe. И если релокаций не будет, то загрузка не пройдет.

Сами релокации - это просто набор таблиц с указателеми на DWORD'ы, которе загрузчик должен пересчитать, если образ загружается по адресу, отличному от базового. Типов релокаций много, но реально в x86 (PE) используются только два: IMAGE_REL_BASED_HIGHLOW = 3 и IMAGE_REL_BASED_ABSOLUTE = 0, причем второй ничего не делает, а нужен только для выравнивания таблиц релокаций.

Сразу скажу, что загрузчик exe-файлы грузит практически всегда по базовому адресу, не применяя релокации. DLL наш упаковщик паковать пока не умеет, поэтому для теста упаковки релокаций мы должны создать exe-файл с некорректным базовым адресом, и тогда загрузчик будет вынужден этот файл в памяти переместить. Я тут не буду приводить исходный код проекта для теста, вы найдете его в солюшене в конце статьи. Базовый адрес загрузки (Linker - Advanced - Base Address) я выбрал 0x7F000000.

Релокации, как и все остальное, нам придется обрабатывать после распаковки файла вручную. Но перед этим необходимо дать понять загрузчику, что релокации у файла есть. Кроме того, нам нужно будет узнать новый адрес, на который загрузчик переместил файл.

Чтобы дать загрузчику знать о том, что у нашего файла есть релокации, делать ничего и не надо - у нас еще от оригинального файла остались нужные флаги, выставленные в заголовках PE-файла. Однако, нам нужно знать, по какому адресу файл загрузился.

Начнем с кода распаковщика (проект unpacker). Чтобы знать, по какому адресу файл должен был загрузиться, и по какому он реально загрузился, мы можем сделать так:

//Адрес загрузки образа (оригинальный, к нему не применяются релокации)unsignedint original_image_base_no_fixup;
 
//...
 
  //Эти инструкции нужны только для того, чтобы//заменить в билдере распаковщика адреса на реальные
  __asm
  {
    mov original_image_base, 0x11111111;
    mov rva_of_first_section, 0x22222222;
    mov original_image_base_no_fixup, 0x33333333;}

Мы добавили переменную, смысл которой полностью аналогичен добавленной в каком-то из предыдущих шагов переменной original_image_base. Отличие будет в том, что к переменной original_image_base мы применим релокации, узнав таким образом, по какому реальному адресу загрузился образ. При этом все последующие действия в распаковщике, которые мы производим с использованием этой переменной, править будет не нужно. А вот содержимое переменной original_image_base_no_fixup мы не будем модифицировать, запомнив тем самым, по какому адресу образ должен был загрузиться. Эту переменную, как и две другие, будет записывать упаковщик для распаковщика.

Модифицируем в распаковщике файл parameters.h, обновив смещения к этим трем переменным:

#pragma once
 
staticconstunsignedint original_image_base_offset =0x11;staticconstunsignedint rva_of_first_section_offset =0x1B;staticconstunsignedint original_image_base_no_fixup_offset =0x22;staticconstunsignedint empty_tls_callback_offset =0x2;

Теперь, как всегда, модифицируем структуру packed_file_info упаковщика (проект simple_pe_packer), добавив в нее два поля:

  DWORD original_relocation_directory_rva;//Относительный адрес оригинальной директории релокаций
  DWORD original_relocation_directory_size;//Размер оригинальной директории релокаций

Далее, аналогично тому, как мы делали с импортами и ресурсами:

//Запоминаем относительный адрес и размер//оригинальной директории релокаций упаковываемого файла
    basic_info.original_relocation_directory_rva= image.get_directory_rva(IMAGE_DIRECTORY_ENTRY_BASERELOC);
    basic_info.original_relocation_directory_size= image.get_directory_size(IMAGE_DIRECTORY_ENTRY_BASERELOC);

После строки:

//Записываем по нужным смещениям адрес//загрузки образа*reinterpret_cast<DWORD*>(&unpacker_section_data[original_image_base_offset])= image.get_image_base_32();

допишем следующую:

*reinterpret_cast<DWORD*>(&unpacker_section_data[original_image_base_no_fixup_offset])= image.get_image_base_32();

которая в свежедобавленную в распаковщик переменную запишет значение базового адреса загрузки образа. На этом этапе после упаковки любого файла переменные original_image_base и original_image_base_no_fixup будут содержать одинаковые значения. Нужно натравить загрузчик на содержимое original_image_base, чтобы он при условии перемещения образа в памяти пофиксил ее. Добавим таблицу релокаций для этого. Код будем писать после следующих строк:

//...//Выставляем новую точку входа - теперь она указывает//на распаковщик, на самое его начало
      image.set_ep(image.rva_from_section_offset(unpacker_added_section, 0));}

Итак,

//Если у файла есть релокацииif(image.has_reloc()){
      std::cout<<"Creating relocations..."<< std::endl;
 
      //Создаем список таблиц релокаций и единственную таблицу
      pe_base::relocation_table_list reloc_tables;
      pe_base::relocation_table table;
 
      pe_base::section& unpacker_section = image.get_image_sections().at(1);
 
      //Устанавливаем виртуальный адрес таблицы релокаций//Он будет равен относительному виртуальному адресу второй добавленной//секции, так как именно в ней находится код распаковщика//с переменной, которую мы будем фиксить
      table.set_rva(unpacker_section.get_virtual_address());
 
      //Добавляем релокацию по смещению original_image_base_offset из//файла parameters.h распаковщика
      table.add_relocation(pe_base::relocation_entry(original_image_base_offset, IMAGE_REL_BASED_HIGHLOW));
 
      //Добавляем таблицу в список таблиц
      reloc_tables.push_back(table);
 
      //Пересобираем релокации, располагая их в конце//секции с кодом распаковщика
      image.rebuild_relocations(reloc_tables, unpacker_section, unpacker_section.get_raw_data().size());}

Тут все просто - мы просто создали таблицу релокаций из единственного элемента и добавили ее в PE-файл.

Кроме того, необходимо заменить строки:

//Наконец, обрежем уже ненужные нулевые байты с конца секции
        pe_base::strip_nullbytes(unpacker_added_section.get_raw_data());

на:

//Наконец, обрежем уже ненужные нулевые байты с конца секцииif(!image.has_reloc())
          pe_base::strip_nullbytes(unpacker_added_section.get_raw_data());

дабы последние байты данных, используемых для инициализации локальной памяти потока, не налезли на релокации, которые мы размещаем прямо за ними.

Осталось убрать ранее добавленную строку:

    image.remove_directory(IMAGE_DIRECTORY_ENTRY_BASERELOC);

чтобы директория релокаций не убиралась из файла (вызов image.rebuild_relocations заполняет ее таким образом, чтобы она указывала на новую директорию релокаций).

Все, что осталось сделать - обработать релокации оригинального файла в распаковщике (проект unpacker):

//Если у файла были релокации//и файл был перемещен загрузчикомif(info_copy.original_relocation_directory_rva&& original_image_base_no_fixup != original_image_base){//Указатель на первую структуру IMAGE_BASE_RELOCATIONconst IMAGE_BASE_RELOCATION* reloc =reinterpret_cast<const IMAGE_BASE_RELOCATION*>(info_copy.original_relocation_directory_rva+ original_image_base);
 
    //Размер директории перемещаемых элементов (релокаций)unsignedlong reloc_size = info_copy.original_relocation_directory_size;//Количество обработанных байтов в директорииunsignedlong read_size =0;
 
    //Перечисляем таблицы перемещаемых элементовwhile(reloc->SizeOfBlock && read_size < reloc_size){//Перечисляем все элементы в таблицеfor(unsignedlong i =sizeof(IMAGE_BASE_RELOCATION); i < reloc->SizeOfBlock; i +=sizeof(WORD)){//Значение перемещаемого элемента
        WORD elem =*reinterpret_cast<const WORD*>(reinterpret_cast<constchar*>(reloc)+ i);//Если это релокация IMAGE_REL_BASED_HIGHLOW (других не бывает в PE x86)if((elem >>12)== IMAGE_REL_BASED_HIGHLOW){//Получаем DWORD по адресу релокации
          DWORD* value =reinterpret_cast<DWORD*>(original_image_base + reloc->VirtualAddress +(elem &((1<<12)-1)));//Фиксим его, как PE-загрузчик*value =*value - original_image_base_no_fixup + original_image_base;}}
 
      //Просчитываем количество обработанных байтов//в директории релокаций
      read_size += reloc->SizeOfBlock;//Переходим к следующей таблице релокаций
      reloc =reinterpret_cast<const IMAGE_BASE_RELOCATION*>(reinterpret_cast<constchar*>(reloc)+ reloc->SizeOfBlock);}}

Этот код я разместил в распаковщике прямо перед кодом, который производит обработку TLS. Мы действуем как загрузчик. Убедившись в том, что файл был перемещен и что он имеет таблицу релокаций, осуществляем перебор всех таблиц релокаций (или перемещаемых элементов, другими словами) и всех релокаций в пределах таблицы. Просчитываем значения по каждому адресу, на которые указывают перемещаемые элементы. Если, например, DWORD по адресу, который должен быть пересчитан, содержал значение 0x800000, базовый адрес загрузки PE-файла 0x400000, а реально он загрузился по адресу 0x500000, то мы высчитываем новое значение по формуле [0x800000 - 0x400000 + 0x500000] = 0x900000.

Забавно кстати, чуть раньше я писал о том, что в naked-функциях MSVC++ не позволяет одновременно объявлять и инициализировать переменные. Оказалось, что это так только в общей области видимости функции. Если мы сделаем новую вложенную область видимости, то все работает. То есть, код

void __declspec(naked) func(){int a =0;}

не соберется, а

void __declspec(naked) func(){{int a =0;}}

отлично сработает.

На этом работа с релокациями завершена, и любой файл, имеющий релокации и даже некорректный базовый адрес загрузки, как в солюшене, запустится. Но есть еще кое-что: если файл помимо релокаций имеет TLS, то нас ждет неудача. В директории TLS (структуре IMAGE_TLS_DIRECTORY32) адреса используются абсолютные, а не относительные, поэтому нам необходимо их перемещать, если загрузчик разместил образ по адресу, отличному от базового адреса загрузки, указанного в заголовке PE-файла. Кроме того, адреса TLS-коллбэков, если они есть, также абсолютные, и их тоже нужно править.

Перед началом работы над релокациями TLS я задался вопросом, как это все протестировать. Собирать руками бинарники, которые бы имели релокации и TLS, не было никакого желания. Поэтому я модифицировал пример для тестирования релокаций (reloc_test), о котором я говорил выше, и слинковал его с помощью бесплатного линкера UniLink. Это, пожалуй, единственный линкер, который умеет собирать TLS с коллбэками. Исходный код примера теперь такой:

#include <iostream>#include <Windows.h>//Файл из комплекта линкера UniLink#include "ulnfeat.h"
 
//Несколько TLS-переменных
__declspec(thread)int a =123;
__declspec(thread)int b =456;
__declspec(thread)char c[128];
 
//Пара TLS-коллбэковvoid __stdcall tls_callback(void*, unsignedlong reason, void*){if(reason == DLL_PROCESS_ATTACH)
    MessageBoxA(0, "Process Callback!", "Process Callback!", 0);elseif(reason == DLL_THREAD_ATTACH)
    MessageBoxA(0, "Thread Callback!", "Thread Callback!", 0);}
 
void __stdcall tls_callback2(void*, unsignedlong reason, void*){if(reason == DLL_PROCESS_ATTACH)
    MessageBoxA(0, "Process Callback 2!", "Process Callback 2!", 0);elseif(reason == DLL_THREAD_ATTACH)
    MessageBoxA(0, "Thread Callback 2!", "Thread Callback 2!", 0);}
 
//Процедура потока (пустая, просто, чтобы коллбэки вызвались)
DWORD __stdcall thread(void*){
  ExitThread(0);}
 
//Два TLS-коллбэка//Это объявление для линкера UniLink
TLS_CALLBACK(1, tls_callback);
TLS_CALLBACK(2, tls_callback2);
 
int main(){//Выводим переменные из TLS
  std::cout<<"Relocation test "<< a <<", "<< b << std::endl;
  c[126]='x';
  c[127]=0;
  std::cout<<&c[126]<< std::endl;
 
  //Спим 2 секунды
  Sleep(2000);
 
  //Запускаем поток и сразу закрываем его хендл
  CloseHandle(CreateThread(0, 0, &thread, 0, 0, 0));
 
  //Спим 2 секунды
  Sleep(2000);return0;}

Поясню, что делает этот пример. При запуске будут вызваны два TLS-коллбэка - tls_callback и tls_callback2. Будут отображены два мессаджбокса с текстами "Process Callback!" и "Process Callback 2!". После этого в консоль будет выведено следующее:

Relocation test 123, 456
x

Наконец, через 2 секунды создастся новый поток, и TLS-коллбэки будут вызваны снова, но выдадут мессаджбоксы уже с текстами "Thread Callback!" и "Thread Callback 2!", и через 2 секунды программа завершится. Тут мы протестируем по полной программе обработку нашим упаковщиком и TLS, и релокаций. Чтобы собрать эту программу, для начала скомпилируем этот исходник (правой кнопкой мышки на файле main.cpp - Compile). Получим файл main.obj, который и скормим линкеру UniLink, набрав в консоли такую строку:

ulink.exe -B- -b:0x7F000000 main.obj, main.exe

Эта команда говорит линкеру ulink.exe о том, что из файла main.obj нужно сделать файл main.exe, установив ему базовый адрес загрузки 0x7F000000 (чтобы наверняка применились релокации) и добавив сами релокации (опция -B-). После выполнения команды у нас будет файл с недопустимым базовым адресом загрузки, TLS с коллбэками и релокациями. Идеально для тестирования!

Переходим к проекту упаковщика (simple_pe_packer). Вынесем переменную first_callback_offset в более широкую область видимости, заменив строки

//Необходимо зарезервировать место//под оригинальные TLS-коллбэки//Плюс 1 ячейка под нулевой DWORD
          DWORD first_callback_offset = data.size();

на

//Необходимо зарезервировать место//под оригинальные TLS-коллбэки//Плюс 1 ячейка под нулевой DWORD
          first_callback_offset = data.size();

и дописав строки

//Смещение относительно начала второй секции//к абсолютному адресу TLS-коллбэка
    DWORD first_callback_offset =0;

перед

{//Новая секция
      pe_base::section unpacker_section;
 
//...

Далее, после строк

//Добавляем релокацию по смещению original_image_base_offset из//файла parameters.h распаковщика
      table.add_relocation(pe_base::relocation_entry(original_image_base_offset, IMAGE_REL_BASED_HIGHLOW));

Дописываем код релокаций TLS:

//Если у файла был TLSif(tls.get()){//Просчитаем смещение к структуре TLS//относительно начала второй секции
        DWORD tls_directory_offset = image.get_directory_rva(IMAGE_DIRECTORY_ENTRY_TLS)- image.section_from_directory(IMAGE_DIRECTORY_ENTRY_TLS).get_virtual_address();
 
        //Добавим релокации для полей StartAddressOfRawData,//EndAddressOfRawData и AddressOfIndex//Эти поля у нас всегда ненулевые
        table.add_relocation(pe_base::relocation_entry(static_cast<WORD>(tls_directory_offset +offsetof(IMAGE_TLS_DIRECTORY32, StartAddressOfRawData)), IMAGE_REL_BASED_HIGHLOW));
        table.add_relocation(pe_base::relocation_entry(static_cast<WORD>(tls_directory_offset +offsetof(IMAGE_TLS_DIRECTORY32, EndAddressOfRawData)), IMAGE_REL_BASED_HIGHLOW));
        table.add_relocation(pe_base::relocation_entry(static_cast<WORD>(tls_directory_offset +offsetof(IMAGE_TLS_DIRECTORY32, AddressOfIndex)), IMAGE_REL_BASED_HIGHLOW));
 
        //Если имеются TLS-коллбэкиif(first_callback_offset){//То добавим еще релокации для поля AddressOfCallBacks//и для адреса нашего пустого коллбэка
          table.add_relocation(pe_base::relocation_entry(static_cast<WORD>(tls_directory_offset +offsetof(IMAGE_TLS_DIRECTORY32, AddressOfCallBacks)), IMAGE_REL_BASED_HIGHLOW));
          table.add_relocation(pe_base::relocation_entry(static_cast<WORD>(first_callback_offset), IMAGE_REL_BASED_HIGHLOW));}}

Мы добавили перемещаемые элементы для всех ненулевых полей структуры IMAGE_TLS_DIRECTORY32, содержащих абсолютные адреса. Если у нас есть TLS-коллбэки, то мы добавляем релокацию и для нашего абсолютного адреса пустого TLS-коллбэка. Самое интересное - в распаковщике ничего править не нужно, потому что он обработает релокации оригинального файла, пересчитав тем самым оригинальные адреса TLS-коллбэков, и лишь после этого будет их вызывать. Единственное, что я сделал - это в очередной раз увеличил объем выделяемой распаковщиком на стеке памяти, так как ее уже начало не хватать. (Я заменил команду sub esp, 256 на sub esp, 4096, чтобы уже наверняка).

Протестировав упаковщик на созданном нами ядреном примере main.exe убеждаемся, что все прекрасно работает.

К этому моменту я уже проверил текущую версию упаковщика на главных exe-файлах следующих приложений: IrfanView, HM NIS Edit, Firefox, Notepad++, NSIS, Opera (ее нужно переименовывать в opera.exe после упаковки), Winamp, WinDjView, ResEd, Quake3, CatMario, Media Player Classic, Windows Media Player. После упаковки они работают!

Замечу напоследок, что в комментариях к исходникам UPX есть пометка о том, что если релокации и TLS находятся в одной секции, то загрузчик не будет фиксить адреса в TLS. Я, как видно, сделал именно так, и, как ни странно, все работает на Windows XP и 7 (на других не проверял).

Полный солюшен для этого шага: Own PE Packer Step 7

Также рекомендую почитать

Пишем упаковщик по шагам. Шаг седьмой. Релокации. Обсудить на форуме


Источник: http://feedproxy.google.com/~r/kaimi/dev/~3/lD2ivbkBtwE/

Пишем упаковщик по шагам. Шаг седьмой. Релокации. | | 2012-09-25 21:38:46 | | Блоги и всяко-разно | | Предыдущий шаг здесь. Там, кстати, имелась ошибка в коде, я ее поправил. Она проявлялась, когда у файла было больше одного TLS-коллбэка.Появилась новая версия библиотеки для работы с PE-файлами (0.1 | РэдЛайн, создание сайта, заказать сайт, разработка сайтов, реклама в Интернете, продвижение, маркетинговые исследования, дизайн студия, веб дизайн, раскрутка сайта, создать сайт компании, сделать сайт, создание сайтов, изготовление сайта, обслуживание сайтов, изготовление сайтов, заказать интернет сайт, создать сайт, изготовить сайт, разработка сайта, web студия, создание веб сайта, поддержка сайта, сайт на заказ, сопровождение сайта, дизайн сайта, сайт под ключ, заказ сайта, реклама сайта, хостинг, регистрация доменов, хабаровск, краснодар, москва, комсомольск |
 
Дайджест новых статей по интернет-маркетингу на ваш email
Подписаться

Продающие сайты "под ключ"!

Наши сайты зарабытывают вам деньги. Landing-page. Эффективные продающие сайты точно в срок и под ключ! Всего от 14700 рублей
Подробнее...

Интернет-магазины и каталоги "под ключ"!

Эффективные и удобные инструменты торговли (электронной торговли) "под ключ". Продают, даже когда вы спите! Всего от 33800 рублей
Подробнее...

Комплексный интернет-маркетинг и продвижение сайтов

Максимальную эффективность дает не какой-то конкретный метод, а их комбинация. Комбинация таких методов и называется комплексным интернет-маркетингом. Всего от 8000 рублей в месяц
Подробнее...

Реклама в Yandex и Google

Контекстная реклама нацелена лишь на тех пользователей, которые непосредственно заинтересованы в рекламе Ваших услуг или товаров. Всего от 8000 рублей в месяц
Подробнее...

Social media marketing (SMM) — продвижение в социальных медиа

Реклама в Однокласcниках и на Mail.ru Создание, ведение и раскрутка групп и реклама ВКонтакте и Facebook. Всего от 8000 рублей в месяц
Подробнее...

Приглашаем к сотрудничеству рекламные агентства и веб-студии!

Внимание Акция! Приглашаем к сотрудничеству рекламные агентства и различные веб-студии России! Индивидуальные и взаимовыгодные условия сотрудничества.
Подробнее...

Ускоренная разработка любого сайта от 5 дней!

Внимание Акция! Ускоренная разработка любого сайта! Ваш сайт будет готов за 5-10 дней. Вы можете заказать разработку любого сайта "под ключ" за 5-10 рабочих дней, с доплатой всего 30% от его стоимости!
Подробнее...

Ждем новых друзей!

Внимание Акция! Ждем новых друзей! Скидка 10% на услуги по созданию и(или) обслуживанию вашего сайта при переходе к нам от другого разработчика.
Подробнее...

Приведи друга и получи скидку!

Внимание Акция! Приведи друга и получи скидку! Скидка 10% на услуги по созданию и(или) обслуживанию вашего сайта, если клиент заказавший наши услуги, пришел по Вашей рекомендации.
Подробнее...

1 2 3 4 5 6 7 8 9

Новые статьи и публикации



Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!

Качественное и объемное представление своего бизнеса в Сети требуется любой растущей коммерческой структуре, стремящейся увеличить продажи, именно по этой причине среди наших клиентов как крупные так и небольшие компании во многих городах России и ближнего зарубежья.
Как мы работаем

Заявка
Позвоните или оставьте заявку на сайте.


Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!


Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.


Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.


Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.

Остались еще вопросы? Просто позвоните и задайте их специалистам
с 2:30 до 11:30 по Мск, звонок бесплатный
Или напишите нам в WhatsApp
с 9:30 до 18:30 по Хабаровску
Или напишите нам в WhatsApp
Веб-студия и агентство комплексного интернет-маркетинга «РЭДЛАЙН» © 2006 - 2024

Профессиональная Веб-разработка. Создание сайтов и магазинов "под ключ" , а также по всей России и зарубежью. Продвижение и реклама. Веб-дизайн. Приложения. Сопровождение. Модернизация. Интеграции. Консалтинг. Продвижение и реклама. Комплексный Интернет-маркетинг.

Оставьте заявку / Задайте вопрос

Нажимая на кнопку ОТПРАВИТЬ, я даю согласие на обработку персональных данных
×

Заказать услугу

Нажимая на кнопку ОТПРАВИТЬ, я даю согласие на обработку персональных данных
×

Обратный звонок

Нажимая на кнопку ОТПРАВИТЬ, я даю согласие на обработку персональных данных
×

Подписка на дайджест новостей

Нажимая на кнопку ОТПРАВИТЬ, я даю согласие на обработку персональных данных
×

Заказать услуги со скидкой \ Бесплатная консультация







КАКИЕ УСЛУГИ ВАС ИНТЕРЕСУЮТ?

КАКИЕ ДОПОЛНИТЕЛЬНЫЕ УСЛУГИ ПОТРЕБУЮТСЯ?

Нажимая на кнопку ОТПРАВИТЬ, я даю согласие на обработку персональных данных
×

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

Что нужно сделать, чтобы заказать создание сайта у нас?

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

Быстрый заказ \ Консультация

Для всех тарифных планов на создание и размещение сайтов включено:

Комплексная раскрутка сайтов и продвижение сайта Комплексный подход это не просто продвижение сайта, это целый комплекс мероприятий, который определяется целями и задачами поставленными перед сайтом и организацией, которая за этим стоит. Время однобоких методов в продвижении сайтов уже прошло, конкуренция слишком высока, чтобы была возможность расслабиться и получать \ удерживать клиентов из Интернета, просто сделав сайт и не занимаясь им...

Комплексная раскрутка работает в рамках стратегии развития вашего бизнеса в сети и направлена

Быстрый заказ \ Консультация

ЭФФЕКТИВНОЕ СОПРОВОЖДЕНИЕ (ПОДДЕРЖКА, ОБСЛУЖИВАНИЕ) САЙТОВ

Полный комплекс услуг по сопровождению сайтаМы оказываем полный комплекс услуг по сопровождению сайта: информационному и техническому обслуживанию и развитию Интернет сайтов.

Передав свой сайт для поддержки в руки наших специалистов, Вы избавитесь от проблем, связанных с обновлением информации и контролем за работой ресурса.

Наша компания осуществляет техническую и информационную поддержку уже имеющихся сайтов. В понятие «поддержка сайтов» также входят услуги администрирования сайтов, обновления сайтов и их модернизация.

Быстрый заказ \ Консультация

Редизайн сайта и Адаптивный веб дизайн

Современный, технологичный, кроссбраузерный ... Профессиональный дизайн сайтов и веб-приложений

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

Адаптивный дизайн сайтов и веб-приложений

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

На сегодняшний день адаптивный дизайн является стандартным подходом при разработке новых сайтов (или веб-приложений) и в идеале ваш сайт должен смотреться и функционировать так, как вы задумывали, на всём разнообразии устройств.

Быстрый заказ \ Консультация

Контекстная реклама в Яндекс и GoogleКонтекстная реклама - это эффективный инструмент в интернет маркетинге, целью которого является увеличение продаж. Главный плюс контекстной рекламы заключается в том, что она работает избирательно.

Реклама в поисковых системах Яндекс и Google. Профессиональная настройка рекламы и отслеживание эффективности!

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

Быстрый заказ \ Консультация

Скидка

1500 руб.
Заинтересовались услугами создания, обслуживания или продвижения вашей компании в Интернете?!
Получите 1500 руб.
за он-лайн заявку
Предложение ограничено.

После получения заявки с Вами свяжутся наши специалисты и уточнят все детали по интересующей вас услуге.
«Нажимая на кнопку "Получить скидку", я даю согласие на обработку персональных данных»
×
Получите 1500 рублей!
×
×