Сейчас на форуме: zombi-vadim, zds (+4 невидимых)

 eXeL@B —› Программирование —› Программа работает только внутри отладчика
<< . 1 . 2 . 3 . 4 . >>
Посл.ответ Сообщение

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

Создано: 23 сентября 2013 20:27 · Поправил: Envy12
· Личное сообщение · #1

Есть код:
Code:
  1. proc check
  2. ;invoke RegisterHotKey,0,1,0x0004,0x41
  3. ;invoke RegisterHotKey,0,2,0x0004,0x4c
  4. start3:
  5.         invoke AdjustTokenPrivileges,[phToken],0,PrivilegeCount ,0,0,0
  6.         mov    [prcs.dwSize],sizeof.PROCESSENTRY32
  7.         invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
  8.         mov    [hSnapshot], eax
  9.         invoke Process32First,eax,prcs
  10.         mov edi,[memhandle2]
  11.  
  12. loop1:
  13.         invoke GetMessage,msg,0,0,0
  14.         cmp ecx,1
  15.         je stop
  16.         mov eax,[edi]
  17.         cmp dword [prcs.szExeFile],eax
  18.         jnz kill2
  19.         add edi,4
  20. next:
  21.         invoke Process32Next,[hSnapshot],prcs
  22.         cmp    eax,0
  23.         jne    loop1
  24.         jmp start3
  25. kill2:
  26. stdcall kill1
  27. jmp next
  28. stop:
  29. invoke GetMessage,msg,0,0,0
  30. cmp ecx,2
  31. jnz next
  32. invoke Sleep,1200000
  33. jmp next
  34. ret
  35. endp

Первые 2 стркои закоментил тк с ними функция отказывается работать вне отладчика, без них все ок, как в отладчике так и без. В чем тут дело?




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

Создано: 10 октября 2013 08:33 · Поправил: DenCoder
· Личное сообщение · #2

Есть
Code:
  1. Privilege      db 'SeDebugPrivilege',0
, а нигде не используется во всех версиях кода.

Смотрим MSDN
Code:
  1. BOOL WINAPI AdjustTokenPrivileges(
  2.   __in          HANDLE TokenHandle,
  3.   __in          BOOL DisableAllPrivileges,
  4.   __in_opt      PTOKEN_PRIVILEGES NewState,
  5.   __in          DWORD BufferLength,
  6.   __out_opt     PTOKEN_PRIVILEGES PreviousState,
  7.   __out_opt     PDWORD ReturnLength
  8. );
  9.  


Где у тебя указатель на привилегии? Вместо него у тебя PrivilegeCount почему-то. Если переменной PrivilegeCount хотел передать аргумент BufferLength(если б даже и своей очередью), то неправильно. BufferLength - длина структуры TOKEN_PRIVILEGES, в которой массив из одного или более LUID_AND_ATTRIBUTES, а не число привилегий!...

Читай внимательно MSDN и переделывай! За это даже оценку не поставишь. Если будешь на полпути, поделюсь исходником

-----
IZ.RU


| Сообщение посчитали полезным: Envy12

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

Создано: 10 октября 2013 08:46
· Личное сообщение · #3

pause1, messagebox появляется а программа не останавливается на слипе, идет дальше, процедуру вызываю через инжект.




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

Создано: 10 октября 2013 09:02 · Поправил: DenCoder
· Личное сообщение · #4

Envy12 пишет:
pause1, messagebox появляется а программа не останавливается на слипе, идет дальше, процедуру вызываю через инжект.

Посмотри, что творится в процессе-"жертве"

Хотя вообще-то самого инжекта и не видно...

fasm - это единственный язык, который "знаешь"?

-----
IZ.RU




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

Создано: 10 октября 2013 10:14 · Поправил: Envy12
· Личное сообщение · #5

DenCoder
Вот так:
Code:
  1. struct LUID
  2.        LowPart dd ?
  3.        HighPart dd ?
  4. ends
  5.  
  6. struct LUID_AND_ATTRIBUTES
  7.        Luid LUID
  8.        Attributes dd ?
  9. ends
  10. nope db 0
  11. struct TOKEN_PRIVELEGES
  12.        PrivilegeCount dd 2
  13.        Priveleges LUID_AND_ATTRIBUTES
  14. ends

правильно?
Я смотрел что там происходит, поставил бряк на входе в процедуру, после messagebox выходит из процедуры и дальше работает.
"Знаю" еще парочку других: pure basic, autoit. Глянул другую прогу, оказалось, что CreateToolhelp32Snapshot может работать и без AdjustTokenPrivileges
Я не успеваю нажать OK в окне, как процесс уже идет дальше, наверно, что-то не так с адресом возврата.
PS Смотрю я это в CE, тк в ольке все нормально работает =\




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

Создано: 10 октября 2013 11:38
· Личное сообщение · #6

Envy12 пишет:
оказалось, что CreateToolhelp32Snapshot может работать и без AdjustTokenPrivileges

Вообще-то да. В твоём коде бардак, и себя и других в заблуждения вводишь.

Envy12 пишет:
Я не успеваю нажать OK в окне, как процесс уже идет дальше,

Процесс, наверное, многопоточный.

-----
IZ.RU




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

Создано: 10 октября 2013 14:18
· Личное сообщение · #7

Инжект делаю с помощью virtualalloc + createremotethread,
push pause1
ret
Болоше никаких потоков там нет. А код этот я не писал.




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

Создано: 10 октября 2013 14:52 · Поправил: DenCoder
· Личное сообщение · #8

Envy12 пишет:
Болоше никаких потоков там нет

А основной поток процесса? Процесс усыпляется перед инжектом?

-----
IZ.RU




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

Создано: 10 октября 2013 15:08 · Поправил: Envy12
· Личное сообщение · #9

DenCoder пишет:
А основной поток процесса? Процесс усыпляется перед инжектом?

Он должен уснуть после инжекта.
Инжект входит в процедуру, вызывается окно, программа переходит в основную процедуру check, без слипа.
Процесс уже может находится в слипе, тк в у меня в цикле есть слип, и скорее всего мой инжект срабатывает в момент слипа и следующий слип не работает.




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

Создано: 10 октября 2013 22:27 · Поправил: DenCoder
· Личное сообщение · #10

Envy12 пишет:
Он должен уснуть после инжекта.Инжект входит в процедуру, вызывается окно, программа переходит в основную процедуру check, без слипа.

С чего ты взял-то?
Если CreateRemoteThread используешь, то она создаёт отдельный поток в процессе, а главный продолжает работать. В то время как созданный поток выдаёт тебе MessageBox и входит после него в Sleep, главный поток также продолжает работать. У твоего Sleep, кстати, 3 600 000 задержка - это ж 1 час ждать.

Envy12 пишет:
у меня в цикле есть слип, и скорее всего мой инжект срабатывает в момент слипа и следующий слип не работает

Я так понял, хочешь разобраться по готовому исходнику и наваять что-нить интересное? Смотришь, что будет если так или так поменять в коде? )) Без понимания принипов работы функций вряд ли получится )
Sleep, к примеру, усыпляет только тот поток, из которого вызван.

Лучше напиши алгоритм по-русски, что нужно сделать... А вообще, случайно не малварь написать хочешь? )

-----
IZ.RU




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

Создано: 11 октября 2013 14:23 · Поправил: Envy12
· Личное сообщение · #11

Это программа моя разработка, за исключением поиска процессов. Ну в принципе если убрать sleep 3600000 получится малварь, хоть и весьма нубская. Как можно остановить главный поток на время слипа?




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

Создано: 11 октября 2013 14:34 · Поправил: DenCoder
· Личное сообщение · #12

Envy12 пишет:
Как можно остановить главный поток на время слипа?

--> SuspendThread <--, если инжект в уже запущенный процесс. Если так, то потоков там может быть несколько. При остановке главного потока остальные не останавятся, поэтому если требуется остановить остальные, то используй их перечисление с помощью того же toolhelp32.

Envy12 пишет:
за исключением поиска процессов.

СильнО сказано! По 4 первым символам имени образа не всегда идентифицируешь правильно единственный нужный процесс! Что мешает полное сравнение имени сделать?

-----
IZ.RU




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

Создано: 11 октября 2013 17:58 · Поправил: Envy12
· Личное сообщение · #13

DenCoder пишет:
СильнО сказано! По 4 первым символам имени образа не всегда идентифицируешь правильно единственный нужный процесс! Что мешает полное сравнение имени сделать?

Это не принципиально, лень матушка мешает.
Сделал вот так:
Code:
  1. proc pause1
  2. invoke SuspendThread,[hthread]
  3. invoke MessageBoxA,0,0,caption,0
  4. invoke Sleep,1200000
  5. invoke ResumeThread,[hthread]
  6. jmp start3
  7. endp

после окна код опять запускается




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

Создано: 11 октября 2013 18:28
· Личное сообщение · #14

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

-----
IZ.RU




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

Создано: 11 октября 2013 19:40
· Личное сообщение · #15

DenCoder пишет:
Да открой уже процесс, который инжектишь

Что там смотреть? Основной поток стартует после мсг и все.




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

Создано: 12 октября 2013 14:37
· Личное сообщение · #16

DenCoder

> При остановке главного потока остальные не останавятся, поэтому если требуется остановить остальные, то используй их перечисление с помощью того же toolhelp32.

NtSuspendProcess:

Code:
  1. NTSTATUS
  2. NtSuspendProcess (
  3.     __in HANDLE ProcessHandle
  4.     )
  5. /*++
  6.  
  7. Routine Description:
  8.  
  9.     This function suspends all none-exiting threads in the target process
  10.  
  11. Arguments:
  12.  
  13.     ProcessHandle - Supplies an open handle to the process to be suspended
  14.  
  15. Return Value:
  16.  
  17.     NTSTATUS - Status of operation
  18.  
  19. --*/





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

Создано: 12 октября 2013 17:42
· Личное сообщение · #17

Dr0p
Мы не рассматриваем сейчас андок функс

Envy12 пишет:
Основной поток стартует после мсг и все.

Основной поток никогда не стартует после мсг! Любое созданное окно привязывается только к потоку, который его создал!
Читай:
--> Процессы и потоки <--
--> Многопоточные приложения <--

-----
IZ.RU




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

Создано: 12 октября 2013 18:20 · Поправил: Envy12
· Личное сообщение · #18

DenCoder
Так, как только открывается окно, функция check продолжает работать, до тех пор пока я не нажму кнопку в окне, после этого опять останавливается. Могу выложить весь код, чтобы вы сами убедились в этом.
Dr0p
А зачем toolhelp32? Я могу в хендл функцие дать результат GetCurrentThreadId?




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

Создано: 12 октября 2013 18:41 · Поправил: DenCoder
· Личное сообщение · #19

Envy12 пишет:
Я могу в хендл функцие дать результат GetCurrentThreadId?

нет! ид потока нужно передать в OpenThread(), чтобы получить хендл.

Envy12 пишет:
А зачем toolhelp32?

Ты меня удивляешь - перечисляешь процессы с помощью него и не знаешь, как оно называется? )) Аналогично им можно перечислять кучи, модули и потоки

Envy12 пишет:
Могу выложить весь код, чтобы вы сами убедились в этом.

Давно пора, а то гадать надоедает.

Envy12 пишет:
DenCoder пишет:Да открой уже процесс, который инжектишь
Что там смотреть?

Последовательность выполнения, возможные коды ошибок... Другими словами - владел бы отладчиком, топик был бы короче и возможно даже был бы интереснее ))

-----
IZ.RU




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

Создано: 12 октября 2013 18:47
· Личное сообщение · #20

DenCoder пишет:
Последовательность выполнения, возможные коды ошибок... Другими словами - владел бы отладчиком, топик был бы короче и возможно даже был бы интереснее ))

Я немного владею олей, но как я говорил выше, она в этом случае безполезна.
Code:
  1. format PE GUI 4.0
  2. include 'win32a.inc'
  3. entry start
  4. section '.text' code readable executable
  5.  
  6. proc init
  7. start1:
  8.         invoke GetCurrentThreadId
  9.         mov [hthread],eax
  10.         invoke HeapCreate,0x00040000,400,0x256
  11.         add eax,0x688
  12.         mov [memhandle2],eax
  13.         mov    [prcs.dwSize],sizeof.PROCESSENTRY32
  14.         invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
  15.         mov    [hSnapshot], eax
  16.         invoke Process32First,eax,prcs
  17.         mov edi,[memhandle2]
  18. .loop:
  19.         mov esi,prcs.szExeFile
  20.         movsd
  21.         inc [count]
  22.  
  23. .next:
  24.         invoke Process32Next,[hSnapshot],prcs
  25.         cmp    eax,0
  26.         jne    .loop
  27. ret
  28. endp
  29.  
  30. proc kill1
  31. pushad
  32. mov eax,prcs.szExeFile
  33. mov eax,[eax]
  34. mov ecx,[count]
  35. shl ecx,1
  36. mov edi,[memhandle2]
  37. repne scasd
  38. jz end1
  39.  
  40. invoke OpenProcess,0x1F0FFF,0,[prcs.th32ProcessID]
  41. invoke TerminateProcess,eax,NULL
  42. end1:
  43. popad
  44. ret
  45. endp
  46.  
  47. proc check
  48. start3:
  49.         invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
  50.         mov    [hSnapshot], eax
  51.         invoke Process32First,eax,prcs
  52.         mov edi,[memhandle2]
  53.  
  54. loop1:
  55.         invoke Sleep,100
  56.         mov eax,[edi]
  57.         cmp dword [prcs.szExeFile],eax
  58.         jnz kill2
  59.         add edi,4
  60. next:
  61.         invoke Process32Next,[hSnapshot],prcs
  62.         cmp    eax,0
  63.         jne    loop1
  64.         jmp start3
  65. kill2:
  66. stdcall kill1
  67. jmp next
  68. ret
  69. endp
  70.  
  71. proc pause1
  72. invoke SuspendThread,[hthread]
  73. invoke MessageBoxA,0,0,caption,0
  74. invoke Sleep,1200000
  75. invoke ResumeThread,[hthread]
  76. jmp start3
  77. endp
  78.  
  79. start:
  80. stdcall init
  81. stdcall check
  82. stdcall pause1
  83. ret
  84.  
  85. section '.data' data readable writeable
  86. caption db 'Пауза',0
  87. count dd 0
  88. memhandle2 dd ?
  89. hthread dd ?
  90.  
  91. TH32CS_SNAPPROCESS = 2
  92.  
  93. struct PROCESSENTRY32
  94.         dwSize dd ?
  95.         cntUsage dd ?
  96.         th32ProcessID dd ?
  97.         th32DefaultHeapID dd ?
  98.         th32ModuleID dd ?
  99.         cntThreads dd ?
  100.         th32ParentProcessID dd ?
  101.         pcPriClassBase dd ?
  102.         dwFlags dd ?
  103.         szExeFile db 260 dup(?)
  104. ends
  105.  
  106. hSnapshot      dd ?
  107. prcs           PROCESSENTRY32
  108.  
  109. section '.idata' import data readable
  110.  
  111. library         kernel32,'KERNEL32.DLL',\
  112.                 advapi32,'ADVAPI32.DLL',\
  113.                 shell32,'SHELL32.DLL',\
  114.                 user32,'USER32.DLL'
  115.  
  116. include 'API\kernel32.inc'
  117. include 'API\advapi32.inc'
  118. include 'API\shell32.inc'
  119. include 'API\user32.inc'





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

Создано: 12 октября 2013 18:54 · Поправил: DenCoder
· Личное сообщение · #21

1. Где код инжекта с CreateRemoteThread() ?
2. Envy12 пишет:
Я немного владею олей, но как я говорил выше, она в этом случае безполезна.

Неверное решение! Поставив бряк на начало потока, созданного функцией CreateRemoteThread(), увидишь правильно ли выполняется. В частности, увидишь, что из Sleep() поток не выходит, пока не истечёт указанное время. А также, увидишь, что логика функции kill1 противоречит логике init, и много чего ещё увидишь...
3. 2 Замечания по SuspendThread(). Во-первых, судя по коду, ты не понял, что усыплять нужно не свой поток, а потоки процесса. Во-вторых, передавать нужно хендл потока, а не его ид.
4. Если необходимо усыпление потоков процесса-жертвы, то сделать это можно ещё до инжекта, но необязательно.

-----
IZ.RU





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

Создано: 12 октября 2013 19:12
· Личное сообщение · #22

DenCoder

> Мы не рассматриваем сейчас андок функс

Это не функция а сервис, функция это стаб для него.. Она мало того что док, так есчо и опенсорс. Прототип и имя никогда не менялись и никогда не изменятся. Андоком было бы лезть в нэйтивные структуры слепка(сисинфо), они изменяются.

Envy12

> А зачем toolhelp32? Я могу в хендл функцие дать результат GetCurrentThreadId?

Не могу ответить, так как не знаю что вы пытаетесь сделать, а перечитывать всё лень

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




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

Создано: 12 октября 2013 19:26 · Поправил: DenCoder
· Личное сообщение · #23

Dr0p пишет:
Она мало того что док, так есчо и опенсорс.

Её нету даже в хидерах ddk, ни в 2600, ни в 7600 )).

Dr0p пишет:
Андоком было бы лезть в нэйтивные структуры слепка(сисинфо), они изменяются

Это верно, поэтому никто и не предлагает реализацию на NtQuerySystemInformation. Все вроде как согласны с toophelp ))

Dr0p пишет:
не знаю что вы пытаетесь сделать, а перечитывать всё лень

Отвечать зато не лень. И мне было поначалу лень вникать. И могу уверенно сказать, что многим лень, поэтому ответов от других здесь нет. И есть высокая вероятность, что я устану давать подсказки тс, если он не включит полезную часть моска ))

Envy12
5. Из всего вышенаписанного следует огромная вероятность, что приведённый выше код должен выполняться в контексте процесса-жертвы. В этом случае адреса переменных, на которые ссылаются инструкции, будут неверны, если перед запуском удалённого потока не сделать поправок. Да и вообще при инжекте код и данные удобнее располагать в одной секции.

-----
IZ.RU





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

Создано: 12 октября 2013 19:38
· Личное сообщение · #24

DenCoder

> Её нету даже в хидерах ddk, ни в 2600, ни в 7600 )).

Ну а счего она там должна быть, это для юзанья в юзермодах, лол :s15




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

Создано: 12 октября 2013 19:53 · Поправил: DenCoder
· Личное сообщение · #25

Dr0p пишет:
Ну а счего она там должна быть

Поскольку это сервис с индексом 0xFD на XP SP3 x86 и экспортируется из ntoskrnl, а не только из ntdll, то странно что её нет.

UPD. Моя ошибка - из ntoskrnl нет экспорта.

-----
IZ.RU





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

Создано: 12 октября 2013 19:57 · Поправил: Dr0p
· Личное сообщение · #26

DenCoder

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

> экспортируется из ntoskrnl

Не экспортится она ядром, я это знал вот щас проверил.




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

Создано: 12 октября 2013 20:17 · Поправил: DenCoder
· Личное сообщение · #27

Dr0p
ок, но в sdk её нет

Более того
If a function is not documented, it may disappear outright at any point in the future, or grow or lose some extra paramters, at which point your application may stop working or break in really interesting ways.

If it's not documented, it's definitely not supported and you shouldn't use it.


--> NtSuspendProcess <--

А её реализация основана на том же перечислении потоков (только через PsGetNextProcessThread) и последующем усыплении. Это не трудно самому реализовать и достоинства реализации налицо - работать будет гаранированно на последующих версиях.

-----
IZ.RU





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

Создано: 12 октября 2013 20:29
· Личное сообщение · #28

DenCoder

Да и ваще, какая разница док оно или нет, если изменений небыло и не будет. Для вас что, лучше костыли всякие юзать типо toolhelp-api.




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

Создано: 12 октября 2013 20:36
· Личное сообщение · #29

Dr0p пишет:
Для вас что, лучше костыли всякие юзать типо toolhelp-api

Когда той информации, что оно даёт, достаточно, зачем что-то другое?

-----
IZ.RU





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

Создано: 12 октября 2013 20:39 · Поправил: Dr0p
· Личное сообщение · #30

DenCoder

Сервис блокировку использует, а вручную не будет такого. Да и про скорость - запрос слепка ооочень долгий.

> работать будет гаранированно на последующих версиях.

Вот недавно вышла 8-ка, быть может вы подскажите какой там сервис пропал по отношению к 1-м версиям нт и какой прототип изменился. Я вот например не знаю.




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

Создано: 12 октября 2013 20:57 · Поправил: DenCoder
· Личное сообщение · #31

Убедительно! И тем более она действительно есть на всех версиях, включая 8. Тогда действительно хочется знать реальную причину, почему она андок (официально)?

-----
IZ.RU



<< . 1 . 2 . 3 . 4 . >>
 eXeL@B —› Программирование —› Программа работает только внутри отладчика
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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