Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   помогите скрыть процесс в диспетчере задач с помощью Delphi 7 (https://forum.antichat.xyz/showthread.php?t=118323)

dimarik-dima 29.04.2009 13:43

помогите скрыть процесс в диспетчере задач с помощью Delphi 7
 
когда писал программу сталкнулся с такой проблеммой со скрытием процесса в диспетчере задач windows xp!!! подскажите плиз какой модуль надо подключить и что нужно написать чтобы диспетчер процесс неотображал

s0l_ir0n 29.04.2009 14:29

Статья всеми уважаемого Рема по инжекту, скрытию, раскрытию:
http://wasm.ru/article.php?article=apihook_1
Прога для скрытия + сорцы на делфи:
http://wasm.ru/pub/21/files/prochide.rar

Nightmarе 29.04.2009 14:54

Никогда не понимал смысл таких прог.
Она скрывает процесс, но палится всем чем только можно, в итоге палева в разы больше.

ЗЫ: дата издания 16.05.2005 =))

s0l_ir0n 29.04.2009 15:12

Цитата:

Сообщение от Nightmarе
Никогда не понимал смысл таких прог.
Она скрывает процесс, но палится всем чем только можно, в итоге палева в разы больше.

Ты много раз вм прот и фиму без фантомки распаковывал? Очень помогало раньше прятать ольку.
Цитата:

Сообщение от Nightmarе
ЗЫ: дата издания 16.05.2005 =))

А рема ты когда последний раз видал? я в районе 2006-начале 2007. Статья действительно старая, но инжект некогда не потеряет актуальность

Nightmarе 29.04.2009 18:43

Для распаковки и прочего эта программа естественно подойдёт.
но речь как я понимаю в этой теме исключительно про трояны.
И скрытие процесса публичным способом вызовет ещё большее палево чем присутствие в трее.

s0l_ir0n 29.04.2009 22:27

Если речь идет действительно о троянах, то я даже спорить не стану, все верно. Просто я сразу начал думать в другую сторону, т.к. сам реверсер и сокрытие процесса у меня подразумевается с отладкой/анти-отладкой =)

slesh 29.04.2009 23:11

Если прятать процесса - это ппц палится и выясняется банальным перебором PID'ов процессов и попыткой их открытия и сравнение результата с реально отображаемым процессами, так что такое ленивый даже спалит. Другая сторона - скрыть процесс именно для стандартного диспетчера задач. Есть гдето DLL которая это делает.
С теоретической реализации - это банальное слежения за окнами и если найдено окно диспечера задача, то находится поле отображения процесса (типа листбокс) и постоянно оно преезписывается (чаще чем стандартно) и от туда выкидывается имя своего процесса.

<offtop>
Если я не ошибаюсь то Ms-Rem погиб в автокатастрофе
</offtop>

s0l_ir0n 29.04.2009 23:59

Цитата:

Если я не ошибаюсь то Ms-Rem погиб в автокатастрофе
Санке предоставлял фотки, якобы с могилы Рема(только он с ним был знаком в реале). Но как в последствии оказалось, это не правда, Рем жив, просто он вырос что-ли... и ушел.

з.ы.: все, молчу,молчу, больше ничего не буду говорить по этому поводу. холивары тут не нужны.

KaZ@NoVa 30.04.2009 10:29

Бред.((((

desTiny 30.04.2009 20:05

<тут был бажный кодес. ну его... )>

slesh 30.04.2009 20:39

2 desTiny А ты незабывай что есть скрытые процессы, а есть зомби.
Зомби в смысле - завершенные процессы, но еще неубитые виндой хз по каким причинам. Отличить зомби от скрытого процесса можно через запрос списка модулей процесса(EnumProcessModules) Если список не может быть получен, значит это зомби, в противном случае - скрытый процесс.
Это связано скоре всего с тем, что данные о модулях хранятся в PEB, а т.к. юзермодная часть уже уничтожена (и PEB отсутствует) то запрос проваливается.

desTiny 30.04.2009 20:44

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

Hellsp@wn 30.04.2009 21:05

у рема в phunter всё это было реализовано :)

desTiny 30.04.2009 22:33

а теперь - в том коде есть несколько (много) багов
вот (вроде) правильный (+ добавил получение SeDebugPrivilege):
Код:

#define MPID 0xFFFF+1
#define SHOW_ALL
#define SEDEBUG

#if defined(WIN32) && !defined(_WIN32)
#define _WIN32
#endif
#define _WIN32_WINNT 0x0500
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <winbase.h>
#include <psapi.h>
#pragma comment(lib,"Psapi.lib")

#ifndef STATUS_INFO_LENGTH_MISMATCH
#define STATUS_INFO_LENGTH_MISMATCH        ((NTSTATUS)0xC0000004L)
#endif
#define NtQuerySystemInformation _NtQuerySystemInformation
#include <winternl.h>
#undef NtQuerySystemInformation

#define SystemHandleInformation 16

typedef LONG KPRIORITY;
typedef struct {
                int index;
                bool hidden;
                HANDLE handle;
                TCHAR Name[MAX_PATH];
        } Process;
Process List[MPID];
SYSTEM_PROCESS_INFORMATION SystemPrInfo[MPID];

typedef struct {
    ULONG NextEntryOffset;
    ULONG NumberOfThreads;
    LARGE_INTEGER SpareLi1;
    LARGE_INTEGER SpareLi2;
    LARGE_INTEGER SpareLi3;
    LARGE_INTEGER CreateTime;
    LARGE_INTEGER UserTime;
    LARGE_INTEGER KernelTime;
    UNICODE_STRING ImageName;
    KPRIORITY BasePriority;
    HANDLE UniqueProcessId;
    HANDLE InheritedFromUniqueProcessId;
    ULONG HandleCount;
    ULONG SessionId;
    ULONG SpareUl3;
    SIZE_T PeakVirtualSize;
    SIZE_T VirtualSize;
    ULONG PageFaultCount;
    ULONG PeakWorkingSetSize;
    ULONG WorkingSetSize;
    SIZE_T QuotaPeakPagedPoolUsage;
    SIZE_T QuotaPagedPoolUsage;
    SIZE_T QuotaPeakNonPagedPoolUsage;
    SIZE_T QuotaNonPagedPoolUsage;
    SIZE_T PagefileUsage;
    SIZE_T PeakPagefileUsage;
    SIZE_T PrivatePageCount;
    LARGE_INTEGER ReadOperationCount;
    LARGE_INTEGER WriteOperationCount;
    LARGE_INTEGER OtherOperationCount;
    LARGE_INTEGER ReadTransferCount;
    LARGE_INTEGER WriteTransferCount;
    LARGE_INTEGER OtherTransferCount;
} MORE_SYSTEM_PROCESS_INFORMATION;

typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO {
    USHORT UniqueProcessId;
    USHORT CreatorBackTraceIndex;
    UCHAR ObjectTypeIndex;
    UCHAR HandleAttributes;
    USHORT HandleValue;
    PVOID Object;
    ULONG GrantedAccess;
} SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;

typedef struct _SYSTEM_HANDLE_INFORMATION {
    ULONG NumberOfHandles;
    SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[ 1 ];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

typedef NTSTATUS (WINAPI* NTQUERYSYSTEMINFORMATION)(DWORD, PVOID, DWORD, DWORD*);
NTQUERYSYSTEMINFORMATION NtQuerySystemInformation;
static DWORD find(int* xt)
{        int k = 0;
        SIZE_T RequiredLength;
        NTSTATUS s;
        MORE_SYSTEM_PROCESS_INFORMATION *ProcTable,*Proc;
        RequiredLength=64*1024;
        ProcTable = (MORE_SYSTEM_PROCESS_INFORMATION *)VirtualAlloc(NULL,RequiredLength,MEM_COMMIT,PAGE_READWRITE);
        if (ProcTable == NULL) return -1;

        while ((s=NtQuerySystemInformation(SystemProcessInformation,
                        ProcTable,
                        (ULONG)RequiredLength,NULL))
                        == STATUS_INFO_LENGTH_MISMATCH)
        {
                RequiredLength += 16*1024;
            VirtualFree(ProcTable,0,MEM_RELEASE);
        ProcTable = (MORE_SYSTEM_PROCESS_INFORMATION *)VirtualAlloc (NULL,RequiredLength,
                        MEM_COMMIT,PAGE_READWRITE);
            if (ProcTable == NULL) return -1;
        }
       
        Proc=ProcTable;
        do {
                k++;
                RtlCopyMemory(List[(DWORD)Proc->UniqueProcessId].Name,Proc->ImageName.Buffer,Proc->ImageName.MaximumLength);
            if(!List[(DWORD)Proc->UniqueProcessId].hidden){
                        (*xt)++;
                        printf("strange one: %.4X ", (DWORD)Proc->UniqueProcessId);
                        _putts(List[(DWORD)Proc->UniqueProcessId].Name);
                }
            List[(DWORD)Proc->UniqueProcessId].hidden = false ;
                Proc=(MORE_SYSTEM_PROCESS_INFORMATION *)((char *)Proc+Proc->NextEntryOffset);
        } while (Proc->NextEntryOffset);

        VirtualFree (ProcTable,0,MEM_RELEASE);

  return k;
}

void Enum2(){
        int f1 = 0, f2 = 0, xt = 0, z = 0;
        HMODULE hNtDll = LoadLibrary(TEXT("ntdll.dll"));
        NtQuerySystemInformation = (NTQUERYSYSTEMINFORMATION)GetProcAddress(
        hNtDll, "NtQuerySystemInformation");
        for(int i = 0; i < MPID; i+=4){
                HANDLE p = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, false, i);
                HMODULE a; DWORD b=0;
                if (p&&(EnumProcessModules(p,&a,0,&b)||(b>0))||i==4){
                    List[i].handle = p;
                        GetModuleFileNameExW(p, 0, List[i].Name, MAX_PATH);
                        CloseHandle(p);
                        List[i].hidden = true;
                        f1++;
                }else{
                        if(p){
                                List[i].handle = (HANDLE)-1;
                                List[i].hidden = true;
                                z++;
                        }
                }
               
        }
        f2 = find(&xt);

        /**/
        int cpid = GetCurrentProcessId();
        //f1 -- : current
        f1--;
        f2--;
        /**/

#ifdef SHOW_ALL
        for (int i = 0; i<MPID; i+=4)
                if(List[i].handle && List[i].handle!=(HANDLE)-1 && i != cpid){
                        printf("%.4X - ",i);
                        if (List[i].hidden)
                                printf("(warning! hidden one!) ");
                        _putts(List[i].Name);                       
                }
        printf("Zombies:\n");
        int k = 0;
        for (int i = 0; i<MPID; i+=4)
                if(List[i].handle==(HANDLE)-1){
                        printf("%X",i);
                        if (++k!=z) printf(", ");
                }
        printf("\n\n------------\n");       
        printf("all: %d + %d\nvisible: %d\nzombies: %d\n",f1, xt, f2, z);
#endif       
        int i;
        scanf("%c", &i);
}

bool SetDebugPrivileges() {
        LUID Luid;
        TOKEN_PRIVILEGES tpToken;
        HANDLE hToken;

        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken)) {
                return false;
        }

        if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Luid)) {
                CloseHandle (hToken);
                return false;
        }

        tpToken.PrivilegeCount = 1;
        tpToken.Privileges[0].Luid = Luid;
        tpToken.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

        if (!AdjustTokenPrivileges(hToken, false, &tpToken, NULL, NULL, NULL)) {
                CloseHandle(hToken);
                return false;
        }

        CloseHandle(hToken);
        return true;

}

int main(){
#ifdef SEDEBUG
        SetDebugPrivileges();
#endif
        Enum2();
        return 0;
}

thx 2 slesh

>>у рема в phunter всё это было реализовано
Да тут нетрудно реализутся-то ) другое дело, что во время кодинга можно какие-то забавные вещи узнать.. вот например, оказалось, что во время загрузки программы (то есть при исследуемый pid = CurrentPid), в имени модуля лежит не имя экзешника, а полный путь..

slesh 30.04.2009 23:07

<offtop>Тема прикольно развилась ) Начали за здравие закончили заупакой (только в нашем случае наоборот)</offtop>

А вообще для скрытия попробуйте заюзать код DLL из Delphi World - "Ныкаем программу от Ctrl Alt Del в WinXP"
Покрайней мере 6 каспер молчит на такое )

desTiny 30.04.2009 23:15

да.. точно.. сабж ведь есть) Вообще такая либа вроде работает (не знаю, может я что-нть лишнее вырезал, когда код выбирал - но вряд ли)
http://pastebin.com/f4b4169cf

dimarik-dima 04.05.2009 00:51

:cool: desTiny!!! slesh!!! Большое спасибо за внимание и за полезную информацию!!! кстати очень помогло!!! Конечно хотелось бы и узнать побольше про скрытые процессы и зомби!!!


Время: 13:34