Сейчас на форуме: jinoweb (+6 невидимых)

 [email protected] —› Программирование —› Библиотека импорта из DEF-файла
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 14 августа 2017 12:49 · Поправил: FalseMaster
· Личное сообщение · #1

Дело в следующем. Пытаюсь перелинковать msvcrt.lib. Порядок действий был таков: выковырял из оригинальной либы объектники, и состряпал из выхлопа DumpBin DEF-файл, на основе которого собрал свою либу и скомпоновал её с выдранными объектниками. Процесс проходит без ошибок и ворнингов, при подключении созданной либы к проекту (DLL) тоже всё нормуль, но трабла в том, что в секцию импорта DLL'ки попадает имя [email protected], тогда как msvcrt.dll экспортирует _CxxThrowException. Вот тут описан аналогичный "эксперимент". Добавляя в DEF-файл строки:
Code:
  1. _CxxThrowException
  2. [email protected] = _CxxThrowException
аффтар якобы получает годную либу. Так вот, это всё х**ня. Линкер игнорит алиасы и пихает в LIB-файл оба имени, а при сборке DLL естественно выбирает то, которое сгенерил компилер, т.е. stdcall-ное. Между тем в оригинальной мелкомягкой либе присутствует только ОДНО определение – [email protected] (с префиксом "__imp_" и без оного) и при этом каким-то загадочным образом в импорте DLL оказывается _CxxThrowException. Собственно вопрос: как это делается?



Ранг: 25.2 (посетитель), 8thx
Активность: 0.030.01
Статус: Участник

Создано: 14 августа 2017 13:36
· Личное сообщение · #2

Попробуй вместо тех двух строк написать:
Code:
  1. _CxxThrowException = [email protected]




Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 14 августа 2017 14:02
· Личное сообщение · #3

jinoweb

Да я уж все возможные комбинации перебрал, иначе стал бы тему создавать. На текст после "=" линкер попросту кладёт. Предложенный тобой вариант приводит к "unresolved external symbol [email protected]" при сборке DLL, потому как в либе оседает только _CxxThrowException.




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 14 августа 2017 14:27 · Поправил: Vamit
· Личное сообщение · #4

Я делал вот так и проблем не было:
def
Code:
  1.  
  2. LIBRARY  "mspdb140"
  3.  
  4. EXPORTS
  5.          SigForPbCb
  6.          PDBExportValidateInterface
  7.          PDBOpenEx2W
  8.          ?[email protected]@@[email protected]@[email protected]@Z
  9.          ?[email protected]@@[email protected]@@[email protected]

.h
Code:
  1.  
  2. #pragma once
  3.  
  4. #ifdef MSPDB140_EXPORTS
  5. #define MSPDB140_API __declspec(dllexport)
  6. #else
  7. #define MSPDB140_API __declspec(dllimport)
  8. #endif
  9.  
  10. MSPDB140_API DWORD SigForPbCb(char* pStr, size_t nSize, DWORD crc);
  11. extern "C" MSPDB140_API BOOL _cdecl PDBExportValidateInterface(DWORD intv);
  12. extern "C" MSPDB140_API int _cdecl PDBOpenEx2W(const wchar_t* wszPDB, const char* szMode, int cbPage, int* pec, wchar_t* wszError,
  13.                               DWORD cchErrMax, struct PDB** pppdb);

Всё зависит от calling convention, если правильно задать, то не нужно никаких алиасов

Добавлено спустя 37 минут
Имена в .lib
Code:
  1. __imp_?[email protected]@[email protected]
  2. __imp__PDBExportValidateInterface

а в .dll как и в .def

-----
Everything is relative...




Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 14 августа 2017 15:06
· Личное сообщение · #5

Vamit
>Я делал вот так и проблем не было:
Ну так с cdecl и ++нутым манглингом у меня тоже проблем нет, беда только с stdcall.




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 14 августа 2017 15:20 · Поправил: Vamit
· Личное сообщение · #6

Да какая разница, всё должно нормально конвертироваться:
в деф _CxxThrowException
в либ [email protected]
значит декларация должна быть
extern "C" бла бла не помню что возвращает __stdcall CxxThrowException(бла бла);

-----
Everything is relative...




Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 14 августа 2017 15:36
· Личное сообщение · #7

Vamit
>в деф _CxxThrowException
>в либ [email protected]
ВОТ. В этом-то и корень злополучия. Я не знаю способа получить [email protected] в LIB, объявив _CxxThrowException в DEF.




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 14 августа 2017 16:34 · Поправил: Vamit
· Личное сообщение · #8

def к lib почти отношения не имеет (для lib он может только задать алиасы), def для dll задает импортируемое имя при линковке оной.
А имя в lib создает компилятор из декларации. Ты lib как получаешь?
FalseMaster пишет:
Я не знаю способа получить [email protected] в LIB

Дак это имя там и есть.
FalseMaster пишет:
что в секцию импорта DLL'ки попадает имя [email protected]

А попадает оно откуда? Конечно же из либ. Def подключают при линковке dll, a не lib.

-----
Everything is relative...





Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

Создано: 14 августа 2017 16:43 · Поправил: mysterio
· Личное сообщение · #9

мысли в слух: А если так ?
Code:
  1. [email protected] proc near
  2.                 jmp  __imp___CxxThrowException
  3. [email protected] endp

или
Code:
  1. LIBRARY "blabla.dll"
  2. EXPORTS
  3. [email protected]      @здесь_номер_функции_в_blabla.dll
  4.  
  5. и с подчеркиваниями поиграться - одно или оба не нужны:
  6. [email protected]      @здесь_номер_функции_в_blabla.dll
  7. [email protected]      @здесь_номер_функции_в_blabla.dll


Code:
  1. [email protected]      @578

где 578 - номер твоей функции в "blabla.dll"

Смысл? Когда я пишу в DEF:
EXPORTS
[email protected]

Смысл в том что при такой записи твой экспорт "указывает" в никуда - "потому как в msvcrt.dll такой функции нет"!

и возможно имеет смысл записать это все так (учитывая подчеркивания и вариации имени конечно - на вкус и цвет):
Code:
  1. __CxxThrowException @1551 ; 060Fh // если LIBRARY = COREDLL.dll
  2. __CxxThrowException @73 ; 0049h // если LIBRARY = msvcrt.dll


-----
Don_t hate the cracker - hate the code.




Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 14 августа 2017 17:01 · Поправил: FalseMaster
· Личное сообщение · #10

Vamit

>def к lib почти отношения не имеет
Вообще-то DEF-файл – это самый оптимальный (по части писанины) способ создания LIB.
>Ты lib как получаешь?
Lib.exe /DEF:deffile.def /OUT:libname.lib
>Дак это имя там и есть.
Да, есть. И в оригинальном файле от MS и в моём, только при включении моего творения в проект, собранная DLL'ка импортирует [email protected] вместо _CxxThrowException.
>А попадает оно откуда? Конечно же из либ.
Только у меня LIB кривая получается. А почему, ума не приложу.

mysterio

>мысли в слух: А если так ?
>или
Смысл? Когда я пишу в DEF:
Code:
, в дальнейшем линкер при сборке целевой DLL видит [email protected] и не ругается, но бинарь выходит нерабочий, потому как в msvcrt.dll такой функции нет.

>и с подчеркиваниями поиграться - одно или оба не нужны
Одно нужно (недекорированное имя функции – _CxxThrowException), второе добавляет линкер.

>и возможно имеет смысл записать это все так
Не понял, в чём прикол? Ну объявил я дважды имя, которое компоновщику не всралось – он-то ищет [email protected] и не находит.




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 14 августа 2017 17:31 · Поправил: Vamit
· Личное сообщение · #11

Давай сначала, при линковке dll создаются 2 файла lib и dll (остальные побоку), либ нужна для статического подключения длл в свой проект, а длл ну понятно для чего. либ может быть вообще пустой и содержать только декларации (этого достаточно чтобы проект понял что ему нужно импортировать). длл же содержит весь код obj файлов. Имена в obj файле и lib одинаковые, а в dll могут отличаться в пределах декорации или вообще отсутствовать (экспорт по ординалу). либ может содержать сколь угодно алиасов имен (в длл же только одно экспортиремое имя на единицу трансляции), проект берет любой из алиасов в либе попадающий под свою декларацию.
Поэтому чтоб всё состыковать нужно знать что хочешь, т.к. можно оставить в dll [email protected] и задекларировать её в проекте под это определение или линковать длл сразу с нужным именем.
Теперь как ты получаешь длл? Или длл ты используешь оригинальную?
FalseMaster пишет:
Только у меня LIB кривая получается.

У тебя не либ кривая, а длл кривая.

Добавлено спустя 8 минут
А вообще-то цель всего этого какая?

-----
Everything is relative...




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 14 августа 2017 17:45
· Личное сообщение · #12

FalseMaster пишет:
а, есть. И в оригинальном файле от MS и в моём, только при включении моего творения в проект, собранная DLL'ка импортирует [email protected] вместо _CxxThrowException.

А если crt-шный код выкинуть вообще?? В смысле точку входа на свою поменять и запретить cpp-исключения в опциях. Или это уже сделано было??!



Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 14 августа 2017 18:10
· Личное сообщение · #13

Vamit

>Давай сначала, при линковке dll создаются 2 файла lib и dll
Давай. Но ты почему-то начал с конца. А с начала будет так. При генерации LIB создаются 2 файла: собственно LIB и EXP, который удаляется за ненадобностью. LIB же объединяется с ранее выдранными объектниками. Затем сие детище подрубается к проекту DLL вместо оригинальной msvcrt.lib и получается вышеописанная жопа.

>проект берет любой из алиасов в либе попадающий под свою декларацию.
Так он и берёт [email protected], но и импортирует в декорированном виде из-за кривизны LIB.

>задекларировать её в проекте под это определение
Нельзя ничего задекларировать. Эта функция из сишного рантайма и имеет тип вызова stdcall (выход по ret 8).

>Теперь как ты получаешь длл?
Компилирую из овердохуа сурса, а вот слинковать не получается.

>У тебя не либ кривая, а длл кривая.
DLL никак не может быть кривой, ибо с родной MS'овоской msvcrt.lib собирается на ура и с импортом всё в порядке.

>А вообще-то цель всего этого какая?
Забабахать "полноприводную" (со всеми импортами из msvcrt.dll) msvcrt.lib и собрать проект (чужой).

ELF_7719116

>А если crt-шный код выкинуть вообще?
Невозможно. Проект состоит из нескольких DLL и EXE, и все они плотно завязаны на CRT (задействовано множество API'шек).




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 14 августа 2017 18:28 · Поправил: Vamit
· Личное сообщение · #14

Забабахать "полноприводную" (со всеми импортами из msvcrt.dll) msvcrt.lib и собрать проект (чужой).
Нихрена не понял, проект после компиляции какую длл будет использовать? Слинкованную тобой, оригинальную или вообще без оной - статическая линковка. А создание либ это не цель, это прослойка)

DLL никак не может быть кривой, ибо с родной MS'овоской msvcrt.lib собирается на ура и с импортом всё в порядке.
Опять не в ту сторону пошел, понятно что оригинальные либ и длл стыкуются, или тут либ оригинальная а длл твоя. Но чуть выше отвечаешь на вопрос как слинковать длл - а вот слинковать не получается , значит своей длл ты не получил.

Добавлено спустя 4 минуты
ЗЫ: И ник у тебя под стать написанному, надо было назваться TrueMaster, тогда бы всё получилось Шутка конечно.

-----
Everything is relative...




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 14 августа 2017 18:45
· Личное сообщение · #15

FalseMaster пишет:
Невозможно. Проект состоит из нескольких DLL и EXE, и все они плотно завязаны на CRT (задействовано множество API'шек).

А если все функи сделать как static linked, и выкинуть оригинальную msvcrt. Просто, я тож не совсем понял как и Vamit, если Ваша dll это враппер, который пихается между оригинальной msvcrt - exe'шник, а-ля "мостик", зачем обязательно вязать всё жестко вязать через LIB & MAP & crt, а просто взять и сделать обычный враппер или хуки.
В конце концов, можно и таблицу импорта самому поправить :/



Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 14 августа 2017 18:59 · Поправил: FalseMaster
· Личное сообщение · #16

Vamit

>проект после компиляции какую длл будет использовать?
Виндовую, ту что в "System32" проживает.

>А создание либ это не цель, это прослойка
Так-то да, но необходимая, поэтому можно сказать, часть цели. Да и в будущем бы пригодилась.

>или тут либ оригинальная а длл твоя
Наоборот же. Я перелинковываю библиотеку импорта, т.к. она неполноценная. Но оно, сцуко, сопротивляетсо.

>значит своей длл ты не получил.
Той, что является частью проекта, само собой не получил (с валидным импортом), т.к. не могу создать LIB, такой же как у MS. Тут определённо есть какая-то тайна.

>надо было назваться TrueMaster
Ну, теперь уж поздно пить Боржоми

ELF_7719116

>А если все функи сделать как static linked
Тогда всё заработает, но это не мой метод, я всегда использую динамичесое связывание.

>если Ваша dll это враппер, который пихается между оригинальной msvcrt
Моя DLL – это часть большого проекта. Между ней и msvcrt.dll никаких прослоек нет, просто у меня не получается импортировать функцию из msvcrt.dll, потому что по неясным причинам создаётся корявый LIB-файл.

>В конце концов, можно и таблицу импорта самому поправить
Хм, а это вариант. Костыль конечно, но если не найду решения, то придётся видимо пойти этим путём.




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 14 августа 2017 19:16 · Поправил: difexacaw
· Личное сообщение · #17

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

При запуске апп с кучей этого дерьма в импорте выводится загрузочный фейл. Иногда есчо нужно это говно регистрировать regsvr. Это хорошо что оно не запускается.

Так как такое апп никуда не годится, скорее всего оно вредоносно.

-----
vx




Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 14 августа 2017 19:46 · Поправил: FalseMaster
· Личное сообщение · #18

difexacaw

>Рантайм пытаются обычно выпилить, а не использовать.
Проект не мой. Он опенсорсный, скачанный c GitHub'а. Написан так, как написан, я ничего с этим поделать не могу, хочу лишь его скомпилить (внеся некоторые поправки).

>Иногда есчо нужно это говно регистрировать regsvr.
Отвязка от реестра для меня давно уже не представляет сложности. Инжектим DLL'ку, сплайсим NtCreateKey, вызываем DllRegisterServer и всего делов.




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 14 августа 2017 19:52 · Поправил: difexacaw
· Личное сообщение · #19

FalseMaster

> Инжектим DLL'ку, сплайсим NtCreateKey, вызываем DllRegisterServer и всего делов.

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

-----
vx





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 14 августа 2017 19:56
· Личное сообщение · #20

FalseMaster пишет:
Виндовую, ту что в "System32" проживает.

Тогда вообще непонятно, зачем вам нужна самопальная либа, больше чем есть в экспорте оригинальной длл всё равно через неё не достать, а оригинальный .lib файл есть - вот и используйте его.
Самопальные либы нужны только в одном случае, если нужно к своему приложению прицепить чужую длл, для которой отсутствует либ файл.
Что-то вы тут темните и не раскрываете цель.

-----
Everything is relative...




Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 14 августа 2017 20:28 · Поправил: FalseMaster
· Личное сообщение · #21

difexacaw

>И получаем результат блокировку системой/проактивкой/анализером
У меня ничего такого не наблюдается… ну бывает авер изредка ругнётся на инжектируемый бинарь (пара прецедентов на пару сотен ущученных прог). Но я его включаю только при выходе в и-нет, а в это время как правило софт массированно не юзаю.

>ставить 20 гб студию что бы ваши окна запустить..
Не знаю, что ты там себе напридумывал… У меня VC весит всего 60 метров вкупе с рантаймом сразу от нескольких версий – по нынешним меркам это совсем немного.

Vamit

>больше чем есть в экспорте оригинальной длл всё равно через неё не достать
Так в том-то и дело, что msvcrt.lib предоставляет не весь экспорт соответствующего бинарника. Я потому и затеял это всё.

>Что-то вы тут темните и не раскрываете цель.
Мля, я могу выложить LIB и DLL msvcrt, сам сравнишь. Да и на своей машине можешь глянуть: к примеру _resetstkoflw в LIB-файле отсутствует, и она не единственная.




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 14 августа 2017 21:11
· Личное сообщение · #22

FalseMaster пишет:
msvcrt.lib предоставляет не весь экспорт соответствующего бинарника

Тогда сделай только враппер на недостающие функции, создаешь .h файл с декларациями, .cpp с пустыми телами фунок, .def с экспортом имен из оригинальной dll, компилишь либу, подключаешь в проект, ссылаешься на оригинальную длл и усё.

-----
Everything is relative...




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 14 августа 2017 21:28 · Поправил: dosprog
· Личное сообщение · #23

В DEF-файле аргменты не описаны.
А ччч@8 это имнно описание аргументов. Два двойных слова.
Поэтому с помощью DEF-файла тут ничего не получится, надо мантулить "фиктивную" DLL.

Vamit пишет:
Что-то вы тут темните и не раскрываете цель.

Хочет сделать враппер, что тут такого

Это нормально. В смысле хотеть.




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 15 августа 2017 20:15
· Личное сообщение · #24

FalseMaster

Я когда ксед линковал, то заколхозил его сишный импорт. Забил пустые стабы. Иначе пришлось бы руками фиксить компилятор и его модуля. И по дефолту там тоже крэп линкуется, который киляется через /nodefaultlib.

Процесс компиляции закрытый и это всё цепочка извратов с не своими модулями. Это врядле можно ровным способом решить. Или собирать целый исходный проект или фиксить вручную конечный бинарь.

-----
vx




Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 16 августа 2017 13:40 · Поправил: FalseMaster
· Личное сообщение · #25

Итак, раз уж народ дёрнул, было бы дурным тоном не отчитаться. В общем, когда я ломал голову над сабжем, из глубин моей дырявой памяти всплыло некое смутное воспоминание. Полез я в дистриб VC и да, оно было там – сурсы рантайма. Заглянул в образец DEF-файла; все три наших барана (_CxxThrowException, __CxxLongjmpUnwind, _seh_longjmp_unwind) объявлены без "собаки" и размера аргументов. Чудеса да и только (в теле либы-то они заманглены). Думал я думал и не придумал ничего лучше, чем подцепить объектник с алиасами к своей кастомной либе. Свершилось! DLL'ка из проекта собралась с валидным импортом. Что в итоге: гланды удалены через задницу текущая задача кое-как решена, но вопрос остался открытым.




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 16 августа 2017 15:38
· Личное сообщение · #26

текущая задача кое-как решена, но вопрос остался открытым.
Я тебе дал решение, которое 100% рабочее и не раз уже применялось на практике.

-----
Everything is relative...




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 16 августа 2017 21:24 · Поправил: dosprog
· Личное сообщение · #27

FalseMaster пишет:
DLL'ка из проекта собралась с валидным импортом

О чём и писалось выше. Приходится делать объявления в asm-файле (PROTO).

Vamit, кстати, писал о том же самом.





Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 17 августа 2017 06:15
· Личное сообщение · #28

Vamit

>Я тебе дал решение, которое 100% рабочее
Возможно, хотя есть сомнения, т.к. я пробовал оформлять экспорт через директиву /EXPORT (а компиль сишный именно это и делает, преобразуя __declspec(dllexport) в опцию линкера) – результат был такой же как и через DEF-файл, т.е. никакой. В любом случае, моё-то чем хуже? Сработало ведь.

dosprog

>Приходится делать объявления в asm-файле
А вот кренделям из мелкософта не приходится. И мне бы хотелось знать их секрет.

>Vamit, кстати, писал о том же самом.
Не совсем.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 10 января 2018 13:10 · Поправил: dosprog
· Личное сообщение · #29

FalseMaster пишет:
А вот кренделям из мелкософта не приходится. И мне бы хотелось знать их секрет.

Так у них не фиктивные LIB'ы, а реальные, от линковки реальных библиотек. Ото и весь секрет.
Те PROTO нужны для получения нормального "фиктивного" LIB-файла.
В реальных, у микрософтовцев, тоже всё так же само.






Ранг: 71.5 (постоянный), 95thx
Активность: 0.10.38
Статус: Участник

Создано: 10 января 2018 19:46 · Поправил: BlackCode
· Личное сообщение · #30

С подобным я сталкивался когда компилил статическую sqlite3.lib для своего проекта.
Так вот запарился я с тем, что собираю статику и в импорт попадает вместо msvcrt.dll - msvcrt120.dll
Т.е. совместимость вниз ровно до msvcrt120.
Плюс ко всему студия лепила .СRT секцию в которой ничего не было.
С матами решил проблему скомпилив статику sqlite3 в VC6 под ХР..
Все За то у меня щас есть адекватная sqlite3.lib, которую могу ликовать к любому проекту.. правда только х86

P.S. Подобная трабла не только с либами. К примеру, если я в свой проект воткну сейчас функу из msvcrt, так
МАСМ втыкает msvcrt120. Как с этим бороться хз по сей день


. 1 . 2 . >>
 [email protected] —› Программирование —› Библиотека импорта из DEF-файла
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати