Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> <<Работа с заголовком exe>> 
:(
    Опции темы
kostik_16
Дата 4.9.2003, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



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

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


Я надеюсь вы поможите мне, если что то задавайте вопросы! Всем заранее благодарен!!!!!!!!!!!!!
PM MAIL   Вверх
stab
Дата 4.9.2003, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



интересно что такое "стек очереди процессора " ? smile.gif Все раскажу если только убедишь меня, что пишешь не вирус и не троян smile.gif


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 5.9.2003, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



он пишет защиту типа ASProtect...



--------------------
С уважением, г-н Посол.
PM   Вверх
oleg1973
Дата 5.9.2003, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



ваше не вижу проблемы поднятой в вопросе
разве трудна зачитать N количество байт с начала файла в буффер и разобрать по полочкам
формат РЕ ехе давно уже не секрет


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
kostik_16
  Дата 5.9.2003, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



Цитата(p0s0l @ 5.9.2003, 08:49)
он пишет защиту типа ASProtect...

Пишу я действительно программу типа ASProtect!!!! exclamation.gif
PM MAIL   Вверх
<Spawn>
Дата 6.9.2003, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Все о формате PE можно узнать тут.

Доступ к отдельным полям можно получить, например, используя указатели:
Код

var
ImageBase:DWord;
ImageDosHeader:PImageDosHeader;
ImageFileHeader:PImageFileHeader;
ImageOptionalHeader:PImageOptionalHeader;
ImageImportDescriptor:PImageImportDescriptor;
begin
ImageBase:=GetModuleHandle(nil);// hInstance
ImageDosHeader:=PImageDosHeader(ImageBase);
ImageFileHeader:=PImageFileHeader(ImageBase+ImageDosHeader._lfanew+SizeOf(DWord));
ImageOptionalHeader:=PImageOptionalHeader(DWord(ImageFileHeader)+SizeOf(TImageFileHeader));
ImageImportDescriptor:=PImageImportDescriptor(ImageBase+
                     ImageOptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
ShowMessage(Format('%x',[ImageDosHeader.e_magic]));
//и т.д.



Это сообщение отредактировал(а) <Spawn> - 6.9.2003, 12:04


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
stab
Дата 7.9.2003, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



kostik_16, куда пропал? на чем остановился или в чем конкретно проблема?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
kostik_16
Дата 7.9.2003, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



Цитата(cully @ 7.9.2003, 12:38)
kostik_16, куда пропал? на чем остановился или в чем конкретно проблема?

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

PM MAIL   Вверх
stab
Дата 7.9.2003, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



каким образом ты добавил процедуру в конец? Расширил последнюю секцию или создал новую секцию? От этого зависит что делать дальше.

з.ы. давай далее на форуме общаться, а не почтой.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
kostik_16
  Дата 7.9.2003, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



Цитата(cully @ 7.9.2003, 16:04)
каким образом ты добавил процедуру в конец? Расширил последнюю секцию или создал новую секцию? От этого зависит что делать дальше.

procedure MyProc;
begin
messagebox(0,'','',0)
end;

procedure EndMyProc;
begin
end;

begin
od.Execute;
fn:= od.FileName;
procSize := cardinal(@EndMyProc) - cardinal(@MyProc);
h := CreateFile (PChar(fn), GENERIC_WRITE, FILE_SHARE_READ+FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
getfilesize(h,@tmp);
SetFilePointer (h, 27, nil, FILE_BEGIN);
buf := @MyProc;
WriteFile (h, buf^, procSize, tmp, nil);
CloseHandle (h)
end;
PM MAIL   Вверх
stab
Дата 7.9.2003, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



kostik_16, а почему ты считаешь, что запись происходит в конец файла?
Цитата
SetFilePointer (h, 27, nil, FILE_BEGIN);

это вроде 27-ой байт от начала файла, таких маленьких PE EXE не бывает, в такой объем только заголовок DOS EXE влезет smile.gif

Кроме того при простом дописывании в конец файла ни чего не выйдет, есть такая штука называется секция. В екзешнике их может быть несколько. Все данные и код кроме заголовков должны находится в какой либо секции. Простое дописывание не приведет к попаданию кода в последнюю секцию. Для того что бы это произошло надо подправить размер последней секции или создать еще одну секцию в которой будет твой код. Надеюсь ты читал описание формата PE EXE? Мне кажется, что нет smile.gif


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
kostik_16
  Дата 8.9.2003, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



Цитата(cully @ 7.9.2003, 22:58)
Цитата
это вроде 27-ой байт от начала файла, таких маленьких PE EXE не бывает, в такой объем только заголовок DOS EXE влезет smile.gif



На счет 27 это я просто не то скопировал! Там GetFilesize().
А на счет секций читал, но чет не понял наверное, просто все пишут на своем языке, но он не до всех доходит.

notify.gif Так как найти выход из моей ситуации? notify.gif

Мне надо приписать мою процедуру к экзешнику! Как это сделать?
PM MAIL   Вверх
oleg1973
Дата 8.9.2003, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



взять исходник какогонить виря под w9x и поглядеть как там сделано smile.gif))


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
stab
Дата 8.9.2003, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



kostik_16, буду расказывать, т.к. писать за тебя не собираюсь smile.gif а то, что-то у тебя прям совсем не получается.

Для начала немного о формате PE EXE. Описание формата можно найти в инете, но довольно сложно в нем разобраться. Я после первого прочтения, признаюсь честно, ни фига не понял. Ну дык лана, схематичная структура:

DOS заголовок (нам не нужен)
Stub (заглушка, та прграмма котороя показывает при запуске под DOS'ом сообщение о том, что данный экзешник работает только под windows)
PE заголовок (без коментариев)
Таблица секций (кол-во вхождений N указано в PE заголовке)
Секция 1
Секция 2
...
Секция N

Вот и все..., теперь подробнее о каждой части. Намерено не буду приводить описание структур, их ты должен изучить сам.

DOS заголовок
Содержит в себе информацию о параметрах stub'а. Нам не нужен. После загловка идет выравнивание и информация о программе. И самое интересное -- поле указывающее смещение PE загловка от начала файла. Т.е. для того что бы считать PE заголовок надо читать со смещения равного значению этого поля.

Stub
не важно smile.gif

PE заголовок

Описывает характеристики и структуру экзешника. Отсюда можно подчерпнуть такую информацию:

1. Кол-во записей в таблице секций (Num Objects) .
2. Адрес по которому загружается программа (Image Base). То что указывается в дельфях в опциях проекта. Для exe это обычно 00400000h.
3. Точка входа (Entry point RVA). RVA рашифровывается как Relative Virtual Address. Такого рода адреса указываются относительно Image Base, т.е. для того что бы во время работы программы получить данные по RVA 123456h надо к 123456h прибавить Image Base. Зачем так сделано? Для того что бы у программы не было привязки к конкретному Image Base. Также есть VA, т.е. Virtual Address, это RVA к которым прибавлен Image Base. По VA и происходят все обращения во время работы программы.

Таблица секций

Для каждой секции здесь указаны: имя, физические/виртуальные смещения и размеры. Физичиские смещения и размеры -- это смещения и размеры в файле. Виртуальные -- в памяти, когда программа уже загружена. Следует учесть, что все физические смещения и размеры должны быть кратны полю File Align из PE заголовка, а виртуальные полю Object Align или, как стали называть позднее, Section Align.


Итого

для того что бы дописать свой код в конец последней секции надо:

1. Определить смещение PE заголовка.
2. Считать PE заголовок.
3. Считать данные о последней секции.
4. Модифицировать данные о последней секции с учетом размера нашего кода, File Align и Object Align.
5. Поменять точку входа предварительно сохранив старую для того что бы потом сделать прыжок на начало программы.
6. Записать свой код в конец.
7. Может чего забыл smile.gif

И напоследок огорчу smile.gif Вызовы API функций в твоем коде не будут работать. Почему? Об этом раскажу потом или может быть всезнающий all раскажет. Для начала просто осуществи вызов программы по сохраненому Entry Point RVA.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 8.9.2003, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



К слову: подобная проблема обсуждается здесь: http://pascal.sources.ru/cgi-bin/forum/YaB...;num=1063033050



--------------------
С уважением, г-н Посол.
PM   Вверх
kostik_16
  Дата 8.9.2003, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



Цитата(cully @ 8.9.2003, 22:42)
Описание формата можно найти в инете, но довольно сложно в нем разобраться.

С начала так с начала!

Первое, где можно достать ПОЛЕЗНУЮ информацию про PE, так как вы не подумайте, что я захотел, что-бы вы за меня все сделали, я до этого искал и нашел много чего про PE, но там они думают в своих описаниях, что все все знают и из-за этого получается неразбериха!

Далее про структуру PE мне давно уже известно, у меня сейчас два полных и два неполных исходников вирусов на ASM, только первый не работает, а со вторым я никак не могу разобраться!

Вот и выплывает проблема - много теории и 0 практики, так как я в своей квалифе использую только Delphi и ASM, а описания как работать с заголовком PE и так далее даются на C++!

Вот и получается такая лажа!!!!!!!!!!!!


Отсюда сделайте выводы и посоветуйте мне, что делать дальше?
PM MAIL   Вверх
stab
Дата 8.9.2003, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



kostik_16, приведи пожалуйста структуру описывающую PE загловок на любом языке. Что тебе в ней не понятно выдели жирным. Может быть тебе не понятно как прочитать информацию из файла?

з.ы. все что необходимо для работы есть в windows.pas: _IMAGE_FILE_HEADER, _IMAGE_DOS_HEADER, _IMAGE_OPTIONAL_HEADER,... так что не надо ля-ля smile.gif


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
kostik_16
  Дата 8.9.2003, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



Вот код вируса, который мне практически непонятен!:

Модератор: код удалён. Согласно правилам форума публикация таких кодов запрещена!

Вот пожалуй пока-что все! Что ты мне дальше посоветуешь?
PM MAIL   Вверх
kostik_16
  Дата 8.9.2003, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



Цитата(cully @ 8.9.2003, 23:26)
P.S. все что необходимо для работы есть в windows.pas: _IMAGE_FILE_HEADER, _IMAGE_DOS_HEADER, _IMAGE_OPTIONAL_HEADER,... так что не надо ля-ля smile.gif

Что это за файл? -
Цитата

Цитата

Цитата

windows.pas



PM MAIL   Вверх
stab
Дата 9.9.2003, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Код

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 fs: TFileStream;
 pe_offset: DWORD;
 ifh: _IMAGE_FILE_HEADER;
 ioh: _IMAGE_OPTIONAL_HEADER;
 i: Integer;
 ish: _IMAGE_SECTION_HEADER;
begin
 fs := TFileStream.Create('c:\test.exe', fmOpenRead);
 fs.Position := $3C;
 fs.Read(pe_offset, SizeOf(pe_offset));
 fs.Position := pe_offset;
 fs.Position := fs.Position + 4; // skip PE, 0, 0 signature
 fs.Read(ifh, SizeOf(ifh));
 ShowMessage('Section count: ' + IntToStr(ifh.NumberOfSections));
 fs.Read(ioh, SizeOf(ioh));
 ShowMessage('Image Base: ' + IntToHex(ioh.ImageBase, 8));
 ShowMessage('Entry point RVA: ' + IntToHex(ioh.AddressOfEntryPoint, 8));
 ShowMessage('Object Align: ' + IntToHex(ioh.SectionAlignment, 8));
 ShowMessage('File Align: ' + IntToHex(ioh.FileAlignment, 8));
 for i := 1 to ifh.NumberOfSections do
 begin
   fs.Read(ish, SizeOf(ish));
   ShowMessage('Section #' + IntToStr(i) + ' Name: ' + PChar(@ish.Name));
   ShowMessage('Section #' + IntToStr(i) + ' Virtual Size: ' + IntToHex(ish.Misc.VirtualSize, 8));
   ShowMessage('Section #' + IntToStr(i) + ' RVA: ' + IntToHex(ish.VirtualAddress, 8));
   ShowMessage('Section #' + IntToStr(i) + ' Physical Size: ' + IntToHex(ish.SizeOfRawData, 8));
   ShowMessage('Section #' + IntToStr(i) + ' File Offset: ' + IntToHex(ish.PointerToRawData, 8));
 end;
 fs.Free;
end;

end.


что здесь такого сложно? особенно при наличии документации и примеров...


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
kostik_16
  Дата 9.9.2003, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



Цитата(cully @ 8.9.2003, 22:42)
4. Модифицировать данные о последней секции с учетом размера нашего кода, File Align и Object Align.
5. Поменять точку входа предварительно сохранив старую для того что бы потом сделать прыжок на начало программы.
6. Записать свой код в конец.

Если я не ошибаюсь, то именно до этих пунктов мы дошли!
Итак главной проблемой сейчас (для меня) является:
Цитата

4. Модифицировать данные о последней секции с учетом размера нашего кода, File Align и Object Align.
5. Поменять точку входа предварительно сохранив старую для того что бы потом сделать прыжок на начало программы.


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

Если да, то нам прийдется изменить в заголовке число секций, размер весго файла, точку входа. Может чет и забыл!

Если я не ошибаюсь, то теорию я понял, но как это сделать на практике - это самая главная проблема confused.gifconfused.gifconfused.gif?

Помогите, ведь осталось всего чуть-чуть! Всем заранее спасибо, а особенно cully и p0s0l!
PM MAIL   Вверх
Vit
Дата 10.9.2003, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Модератор: Совершенно явственно идёт обсуждение написания вируса или вредоносной программы. Уже дошло до публикации кодов вирусов. Обсуждение таких тем и публикация таких кодов запрещена на данном форуме, а также нарушает законодательство стран имеющих отношение к данному форуму и его администрации. В связи с этим обсуждение прекращено. Тема закрыта.


У меня личная просьба к cully и p0s0l. Вы очень сильные программисты, особенно в области низкоуровневого программирования, поэтому я хочу обратить Ваше внимание на то ЧТО именно спрашивают на форуме, и каков уровень подготовки тех кто спрашивает. Я не могу прекратить обсуждение пока участник не перешагнёт некую грань, однако предлагаю впредь избегать делиться своими знаниями в таких скользких вопросах. К сожалению примерно раз в 3 месяца всплывает подобный топик, когда совсем слабенький программист пытается выпытать что-то явно относящееся к созданию вредоносного. Если это ясно на 100% я закрываю эту тему сразу, если же она замаскирована под что-то безобидное, то я предлагаю просто игнорировать такие топики.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0804 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.