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

  #4  
Старый 14.05.2010, 22:53
Аватар для Nevazno
Nevazno
Новичок
Регистрация: 13.05.2010
Сообщений: 1
Провел на форуме:
1869

Репутация: 0
Question

Здравствуйте.
Прошу помощи в хуке ZwQuerySystemInformation.
Следующий код аналогичен приведённому выше (переписан без макросов, т.к. с макрасами был невозможен дебаг).
Но почему-то не работает.
Параметр VirtualProtect() PAGE_READWRITE был изменён на PAGE_EXECUTE_READWRITE, т.к. с PAGE_READWRITE вылетал accsess violation.
Прога считает вызовы ZwQuerySystemInformation. В пошаговой отладке видно, что память по указателю исходной функции изменяется но почему-то диспетчер задач показывает все процессы и счётчик вызовов не изменяется.
Работаю в MSVC 2008, OC windows 7 (слас другу с XP - ситуация аналогична).

Заранее спасибо.

PHP код:
#include <windows.h>

LRESULT CALLBACK WndProc(HWNDUINTWPARAMLPARAM);

WCHAR wch[60];
int i;

typedef LONG    NTSTATUS;
typedef LONG    KPRIORITY;

#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)

#define STATUS_SUCCESS                   ((NTSTATUS)0x00000000L)
#define STATUS_INFO_LENGTH_MISMATCH      ((NTSTATUS)0xC0000004L)

#define SystemProcessesAndThreadsInformation    5

typedef struct _UNICODE_STRING {
    
USHORT        Length;
    
USHORT        MaximumLength;
    
PWSTR         Buffer;
UNICODE_STRING;

typedef struct _SYSTEM_PROCESSES {
    
ULONG             NextEntryDelta;
    
ULONG             ThreadCount;
    
ULONG             Reserved1[6];
    
LARGE_INTEGER     CreateTime;
    
LARGE_INTEGER     UserTime;
    
LARGE_INTEGER     KernelTime;
    
UNICODE_STRING    ProcessName;
    
KPRIORITY         BasePriority;
    
ULONG             ProcessId;
    
ULONG             InheritedFromProcessId;
    
ULONG             HandleCount;
    
ULONG             Reserved2[2];
//    VM_COUNTERS       VmCounters;
//    SYSTEM_THREADS    Threads[1];
SYSTEM_PROCESSES, * PSYSTEM_PROCESSES;

UCHAR bufZwQSI[5]; //буфер
typedef NTSTATUS (WINAPI *pWinApiF) (UINT SystemInformationClassPVOID SystemInformationULONG SystemInformationLengthPULONG ReturnLength);

pWinApiF lpZwQSI//указатель на ZwQuerySystemInformation

NTSTATUS WINAPI xZwQSI(UINT SystemInformationClassPVOID SystemInformationULONG SystemInformationLengthPULONG ReturnLength);

///////////////////////////////////////////////////////////////////////////////////////////////
// ставим локальный хук
bool SetSplicingHook(pWinApiF pfnDstpWinApiF pfnHookUCHAR buffer[5])
{
    
// проверка указателей
    
if(IsBadWritePtr(buffer5) || IsBadReadPtr(pfnDst5)) return false;
    
memcpy(bufferpfnDst5); // бекап начала функции
    // разрешаем запись в страницу с кодом
    
DWORD old 0;
    if(!
VirtualProtect(pfnDst5PAGE_EXECUTE_READWRITE, &old)) return false// мы запрашиваем 5 байт, но на самом деле изменятся права доступа всей страницы сразу
    
    // ставим JMP FAR
    
DWORD offset = (DWORDpfnHook - (DWORDpfnDst 5;
    *(
BYTE*)pfnDst 0xE9// JMP FAR
    
*(DWORD*)((DWORD)pfnDst+1) = offset;

    
// восстанавливает старые атрибуты страницы
    
if(!VirtualProtect(pfnDst5old, &old)) return false;

    
// ништяк
    
return true;
}

// снимаем локальный хук
void UnsetSplicingHook(pWinApiF pfnDstUCHAR buffer[5])
{
    
DWORD old 0;
    if(!
VirtualProtect(pfnDst5PAGE_EXECUTE_READWRITE, &old)) return;
    
memcpy(pfnDstbuffer5); // восстанавливаем первые 5 байт из бекапа
    
if(!VirtualProtect(pfnDst5old, &old)) return;
}

NTSTATUS WINAPI xZwQSI(UINT SystemInformationClassPVOID SystemInformationULONG SystemInformationLengthPULONG ReturnLength)
{
    
wsprintf(wch,L"%d",++i);
    
UnsetSplicingHook(lpZwQSIbufZwQSI);
    
NTSTATUS ret lpZwQSI(SystemInformationClass,   SystemInformationSystemInformationLengthReturnLength);
    if(!
SetSplicingHook(lpZwQSIxZwQSIbufZwQSI))
    {
        
MessageBox(NULLL"Cannot set hook to ZwQuerySystemInformation"L"Error"MB_OK);
        
ExitProcess(0);
    }
    if(
ret != STATUS_SUCCESS)
        return 
ret;

    if(
SystemInformationClass == SystemProcessesAndThreadsInformation)
    {
        
PSYSTEM_PROCESSES pProcesses = (PSYSTEM_PROCESSES)SystemInformation;

        
memset(pProcesses0sizeof(SYSTEM_PROCESSES));
        
pProcesses->NextEntryDelta 0;
        
pProcesses->ProcessId 1;
        
pProcesses->ProcessName.Buffer L"GR8 0wn3d u";
        
pProcesses->ProcessName.Length 100;
    }

    return 
ret;
}
///////////////////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstanceHINSTANCE hPrevInstanceLPSTR lpCmdLineint nCmdShow)
{
    
wsprintf(wch,L"none");
    
i=0;
// получаем адреса
    
*(FARPROC*)&lpZwQSI GetProcAddress(LoadLibrary(L"ntdll.dll"), "ZwQuerySystemInformation");
    if(!
SetSplicingHook(lpZwQSIxZwQSIbufZwQSI))
    {
        
MessageBox(NULLL"Cannot set hook to ZwQuerySystemInformation"L"Error"MB_OK);
        
ExitProcess(0);
    }
////////////////////////////////////////////////////////
    
HWND hMainWnd;  
    
WCHAR szClassName[] = L"Hide";
    
MSG msg;
    
WNDCLASSEX wc;
    
wc.cbSize        sizeof(wc);        
    
wc.style         CS_HREDRAW CS_VREDRAW;
    
wc.lpfnWndProc   WndProc;
    
wc.cbClsExtra     0;
    
wc.cbWndExtra    0;
    
wc.hInstance     hInstance;
    
wc.hIcon         LoadIcon(NULLIDI_APPLICATION);
    
wc.hCursor       LoadCursor(NULLIDC_ARROW);
    
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    
wc.lpszMenuName  NULL;
    
wc.lpszClassName szClassName;
    
wc.hIconSm       LoadIcon(NULLIDI_APPLICATION);

    if (!
RegisterClassEx(&wc)) {
        
MessageBox(NULLL"Cannot register class"L"Error"MB_OK);
        return 
0;
    }

    
hMainWnd CreateWindowEx
        
NULL,szClassNameL"Hide",
        
WS_CAPTION WS_SYSMENU,
        
1000400150150,
        (
HWND)NULL, (HMENU)NULL,
        (
HINSTANCE)hInstanceNULL
    
);
    
    if (!
hMainWnd) {
        
MessageBox(NULLL"Cannot create main window"L"Error"MB_OK);
        return 
0;
    }

    
ShowWindow(hMainWndnCmdShow);

    while (
GetMessage(&msgNULL00))  {
        
TranslateMessage(&msg);
        
DispatchMessage(&msg);
    }

    return 
msg.wParam;
}
///////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWndUINT msgWPARAM wParamLPARAM lParam)
{
    
HDC hDC;
    
PAINTSTRUCT ps;
    
RECT rect;
    switch (
msg)
    {
    case 
WM_CREATE:
        
SetTimer(hWnd,NULL,500,NULL);
        return 
0;

    case 
WM_TIMER:
            
InvalidateRect(hWnd,NULL,TRUE);
        return 
0;

    case 
WM_PAINT:
        
hDC BeginPaint(hWnd, &ps);
        
GetClientRect(hWnd,&rect);
        
DrawText(hDCwch, -1, &rect,
            
DT_SINGLELINE DT_CENTER DT_VCENTER );
        
EndPaint(hWnd, &ps);
        return 
0;

    case 
WM_CLOSE:
        
DestroyWindow(hWnd);
        return 
0;
    case 
WM_DESTROY:
        
PostQuitMessage(0);
        return 
0;
    default:
        return 
DefWindowProc(hWndmsgwParamlParam);
    }
    return 
0;

 
Ответить с цитированием
 





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


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




ANTICHAT.XYZ