• XSS.stack #1 – первый литературный журнал от юзеров форума

что тут может быть не так ?)

mddbs

RAID-массив
Пользователь
Регистрация
09.02.2024
Сообщения
98
Реакции
3
C:
NTSTATUS read_process_memory(uintptr_t pid, uintptr_t address, PVOID buffer, SIZE_T bitetoread)
{
    if (pid) return STATUS_UNSUCCESSFUL;
    PEPROCESS process = 0;
    PsLookupProcessByProcessId(pid, &process);
    if (!process) return STATUS_UNSUCCESSFUL;
    uintptr_t process_base = get_process_cr3(process);
    if (!process_base) return STATUS_UNSUCCESSFUL;
    ObDereferenceObject(process);
    uintptr_t physical_address = translate_linear(process_base, (uintptr_t)address);
    if (!physical_address) return STATUS_UNSUCCESSFUL;
    uintptr_t final_size = min(PAGE_SIZE - (physical_address & 0xFFF), bitetoread);
   
    buffer = Read_Physical_memory((PVOID)physical_address, NULL, final_size);
    return STATUS_SUCCESS;
}

uintptr_t get_process_cr8(PEPROCESS pprocess)
{
    if (!pprocess) return 0;
    uintptr_t process_dirbase = *(uintptr_t*)((UINT8*)pprocess + 0x28);
    if (process_dirbase == 0)
    {
        ULONG user_diroffset = get_winver();
        process_dirbase = *(uintptr_t*)((UINT8*)pprocess + user_diroffset);
    }
    if ((process_dirbase >> 0x38) == 0x40)
    {
        if (!already_attached) //find a way to reset this
        {
            KAPC_STATE apc_state;
            KeStackAttachProcess(pprocess, &apc_state);
            saved_dirbase = __readcr8();
            KeUnstackDetachProcess(&apc_state);
            already_attached = TRUE;
        }
        if (saved_dirbase) return saved_dirbase;
    }
    return process_dirbase;
}

uintptr_t translate_linear(uintptr_t directory_table_base, uintptr_t virtual_address)
{
    directory_table_base &= ~0xf;
    uintptr_t pageoffset = virtual_address & ~(~0ul << page_offset_size);
    uintptr_t pte = ((virtual_address >> 12) & (0x1ffll));
    uintptr_t pt = ((virtual_address >> 21) & (0x1ffll));
    uintptr_t pd = ((virtual_address >> 30) & (0x1ffll));
    uintptr_t pdp = ((virtual_address >> 39) & (0x1ffll));
    SIZE_T readsize = 0;
    uintptr_t pdpe = 0;
    pdpe = Read_Physical_memory((PVOID)(directory_table_base + 8 * pdp), &pdpe, sizeof(pdpe));
    if (~pdpe & 1) return 0;
    uintptr_t pde = 0;
    pde = Read_Physical_memory((PVOID)((pdpe & pmask) + 8 * pd), &pde, sizeof(pde));
    if (~pde & 1) return 0;
    if (pde & 0x80) return (pde & (~0ull << 42 >> 12)) + (virtual_address & ~(~0ull << 30));
    uintptr_t ptraddr = 0;
    ptraddr = Read_Physical_memory((PVOID)((pde & pmask) + 8 * pt), &ptraddr, sizeof(ptraddr));
    if (~ptraddr & 1) return 0;
    if (ptraddr & 0x80) return (ptraddr & pmask) + (virtual_address & ~(~0ull << 21));
    virtual_address = 0;
    virtual_address = Read_Physical_memory((PVOID)((ptraddr & pmask) + 8 * pte), &virtual_address, sizeof(virtual_address));
    virtual_address &= pmask;
    if (!virtual_address) return 0;
    return virtual_address + pageoffset;
}

uintptr_t Read_Physical_memory(uintptr_t Address, PVOID buffer, SIZE_T bitetoread)
{


    PVOID Pool = ExAllocatePoolWithTag(NonPagedPool, bitetoread, 'Tag1');

    if (Pool == NULL) return;
    else
    {
        PHYSICAL_ADDRESS ad;
        ad.QuadPart = Address;
        PVOID MemoryMap = MmMapIoSpaceEx(ad, bitetoread, PAGE_READONLY);

        if (MemoryMap == NULL) return;
        else
        {
            MM_COPY_ADDRESS copyaddress;
            copyaddress.VirtualAddress = MemoryMap;
            SIZE_T counter;
            MmCopyMemory(Pool, copyaddress, bitetoread, MM_COPY_MEMORY_VIRTUAL, &counter);
           
            DbgPrint("Value of counter: %p\n", counter);
            for (int i = 0; i < bitetoread; i++) {
                DbgPrint("%02X ", ((PUCHAR)Pool)[i]);

            }
            MmUnmapIoSpace(MemoryMap, bitetoread);
            return *(PULONG)Pool;
            ExFreePoolWithTag(Pool, 'Tag1');


        }
    }
}

где здесь может быть ошибка ?
 
Последнее редактирование:
Праивльно будет освободить пул перед возвратом значения.

C:
uintptr_t Read_Physical_memory(uintptr_t Address, PVOID buffer, SIZE_T bitetoread)
{
    PVOID Pool = ExAllocatePoolWithTag(NonPagedPool, bitetoread, 'Tag1');

    if (Pool == NULL) return 0;
    else
    {
        PHYSICAL_ADDRESS ad;
        ad.QuadPart = Address;
        PVOID MemoryMap = MmMapIoSpaceEx(ad, bitetoread, PAGE_READONLY);

        if (MemoryMap == NULL) return 0;
        else
        {
            MM_COPY_ADDRESS copyaddress;
            copyaddress.VirtualAddress = MemoryMap;
            SIZE_T counter;
            MmCopyMemory(Pool, copyaddress, bitetoread, MM_COPY_MEMORY_VIRTUAL, &counter);
         
            DbgPrint("Value of counter: %p
", counter);
            for (int i = 0; i < bitetoread; i++) {
                DbgPrint("%02X ", ((PUCHAR)Pool)[i]);
            }

            MmUnmapIoSpace(MemoryMap, bitetoread);
            ExFreePoolWithTag(Pool, 'Tag1');
            return *(PULONG)Pool;
        }
    }
    return 0;
}
он освобождается в выгрузке драйвера
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
где здесь может быть ошибка ?
везде.

советую сначала книжку по C почитать и перестать пользоваться нейронками для генерации кода.
А после почитать книжку по кернел программированию.
if (MemoryMap == NULL) return;
утечка памяти, ретурн ничего не возвращает, хотя функция требует вернуть uintptr_t
NTSTATUS read_process_memory(uintptr_t pid, uintptr_t address, PVOID buffer, SIZE_T bitetoread)
buffer = Read_Physical_memory((PVOID)physical_address, NULL, final_size);
подумай, что за бред ты написал)

Если ты хочешь прочитать память процесса, то делай это через MmCopyVirtualMemory.


Сгенерить код нейронкой, получить само собой не рабочее говно, скинуть на форум, чтобы починили.
 
везде.

советую сначала книжку по C почитать и перестать пользоваться нейронками для генерации кода.
А после почитать книжку по кернел программированию.

утечка памяти, ретурн ничего не возвращает, хотя функция требует вернуть uintptr_t


подумай, что за бред ты написал)

Если ты хочешь прочитать память процесса, то делай это через MmCopyVirtualMemory.


Сгенерить код нейронкой, получить само собой не рабочее говно, скинуть на форум, чтобы починили.
Не одна строчка данного кода не сгенерированная при помощи нейронки
 
везде.

советую сначала книжку по C почитать и перестать пользоваться нейронками для генерации кода.
А после почитать книжку по кернел программированию.

утечка памяти, ретурн ничего не возвращает, хотя функция требует вернуть uintptr_t


подумай, что за бред ты написал)

Если ты хочешь прочитать память процесса, то делай это через MmCopyVirtualMemory.


Сгенерить код нейронкой, получить само собой не рабочее говно, скинуть на форум, чтобы починили.
Придрался к какой-то фигне да данная строчка buffer = Read_Physical_memory((PVOID)physical_address, NULL, final_size); да в данной строчке бред(не заметил потому что реализация до этого была другая) потом говоришь что return ничего не возвращает return *(PULONG)Pool; а это тогда что. Ничего толком ты полезного не написал
 
везде.

советую сначала книжку по C почитать и перестать пользоваться нейронками для генерации кода.
А после почитать книжку по кернел программированию.

утечка памяти, ретурн ничего не возвращает, хотя функция требует вернуть uintptr_t


подумай, что за бред ты написал)

Если ты хочешь прочитать память процесса, то делай это через MmCopyVirtualMemory.


Сгенерить код нейронкой, получить само собой не рабочее говно, скинуть на форум, чтобы починили.
И типа как может произойти утечка памяти если оператор return без значения не приводит к выделению дополнительной памяти?))
 
Пожалуйста, обратите внимание, что пользователь заблокирован
И типа как может произойти утечка памяти если оператор return без значения не приводит к выделению дополнительной памяти?))
Ты идиот или прикидываешься?))
Ты выделил память под Pool, проверил, что она не 0, зашел дальше, выделил MemoryMap, если меморимап 0 вышел.
Ты правда не видишь утечки памяти?

Книжку в руки и вперед)
 
Ты идиот или прикидываешься?))
Ты выделил память под Pool, проверил, что она не 0, зашел дальше, выделил MemoryMap, если меморимап 0 вышел.
Ты правда не видишь утечки памяти?

Книжку в руки и вперед)
Pool освобождается при выгрузки драйвера если ты чего-то не видишь это не означает что этого нет
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Pool освобождается при выгрузки драйвера если ты чего-то не видишь это не означает что этого нет
Это уже не смешно.

Pool освобождается при выгрузки драйвера
Скинь ссылку на доку, где это написано. А то я загуглил и увидел, что надо функции специальные вызывать, а оно вон как само умеет.
Зачем же ты тогда вручную пытаешься его освободить?)))
 
Это уже не смешно.


Скинь ссылку на доку, где это написано. А то я загуглил и увидел, что надо функции специальные вызывать, а оно вон как само умеет.
Зачем же ты тогда вручную пытаешься его освободить?)))
Смешно, а про то что можно указать функцию выгрузки в драйвере ты не знаешь. И да представляешь внутри этой функции можно ещё что то написать 😲
Книжку в руки и вперед)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Смешно, а про то что можно указать функцию выгрузки в драйвере ты не знаешь. И да представляешь внутри этой функции можно ещё что то написать 😲
Можно, только ты указатель на pool уже проебал.
return *(PULONG)Pool; ExFreePoolWithTag(Pool, 'Tag1');
Сокральный смысл был спрятан в этих строках....

Лан, тебе говорить что-то - как о стенку горох
 
Можно, только ты указатель на pool уже проебал.

Сокральный смысл был спрятан в этих строках....

Лан, тебе говорить что-то - как о стенку горох
Ок ты доебался до одной строчки кода о которой я и так знал но не менял потому что драйвер не выгружается и утечки памяти не может быть. Представляешь я умею читать предупреждения и забивать на них (потому что это сырой код который писался на коленках)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ок ты доебался до одной строчки кода о которой я и так знал но не менял потому что драйвер не выгружается и утечки памяти не может быть.
Давай я в последний раз подробно разжую и закончим диалог на этом.
C:
uintptr_t Read_Physical_memory(uintptr_t Address, PVOID buffer, SIZE_T bitetoread)
{
    // насколько я вижу, Pool нигде не сохраняется.
    PVOID Pool = ExAllocatePoolWithTag(NonPagedPool, bitetoread, 'Tag1'); // <--- аллокация памяти. Должно быть освобождено через вызов ExFreePoolWithTag(Pool, 'Tag1')

    if (Pool == NULL)
        return; // на этом моменте в rax у тебя непонятная х#йня. Ты её вернул, то есть вернул мусор. Будет неправильное поведение где-то
    else
    {
        PHYSICAL_ADDRESS ad;
        ad.QuadPart = Address;
        PVOID MemoryMap = MmMapIoSpaceEx(ad, bitetoread, PAGE_READONLY); // попытка выделить ресурсы

        if (MemoryMap == NULL)
            return; // не получилось. Ты вышел и проебал указатель на Pool. То есть ты уже не можешь освободить память. К тому же вернул мусор из функции.
        else
        {
            MM_COPY_ADDRESS copyaddress;
            copyaddress.VirtualAddress = MemoryMap;
            SIZE_T counter;
            MmCopyMemory(Pool, copyaddress, bitetoread, MM_COPY_MEMORY_VIRTUAL, &counter);

            DbgPrint("Value of counter: %p\n", counter);
            for (int i = 0; i < bitetoread; i++) {
                DbgPrint("%02X ", ((PUCHAR)Pool)[i]);
            }
            MmUnmapIoSpace(MemoryMap, bitetoread);
            return *(PULONG)Pool; // утечка памяти Pool
        }
    }
}
 
Давай я в последний раз подробно разжую и закончим диалог на этом.
C:
uintptr_t Read_Physical_memory(uintptr_t Address, PVOID buffer, SIZE_T bitetoread)
{
    // насколько я вижу, Pool нигде не сохраняется.
    PVOID Pool = ExAllocatePoolWithTag(NonPagedPool, bitetoread, 'Tag1'); // <--- аллокация памяти. Должно быть освобождено через вызов ExFreePoolWithTag(Pool, 'Tag1')

    if (Pool == NULL)
        return; // на этом моменте в rax у тебя непонятная х#йня. Ты её вернул, то есть вернул мусор. Будет неправильное поведение где-то
    else
    {
        PHYSICAL_ADDRESS ad;
        ad.QuadPart = Address;
        PVOID MemoryMap = MmMapIoSpaceEx(ad, bitetoread, PAGE_READONLY); // попытка выделить ресурсы

        if (MemoryMap == NULL)
            return; // не получилось. Ты вышел и проебал указатель на Pool. То есть ты уже не можешь освободить память. К тому же вернул мусор из функции.
        else
        {
            MM_COPY_ADDRESS copyaddress;
            copyaddress.VirtualAddress = MemoryMap;
            SIZE_T counter;
            MmCopyMemory(Pool, copyaddress, bitetoread, MM_COPY_MEMORY_VIRTUAL, &counter);

            DbgPrint("Value of counter: %p\n", counter);
            for (int i = 0; i < bitetoread; i++) {
                DbgPrint("%02X ", ((PUCHAR)Pool)[i]);
            }
            MmUnmapIoSpace(MemoryMap, bitetoread);
            return *(PULONG)Pool; // утечка памяти Pool
        }
    }
}
Окей с return; я согласен но с освобождением нет так как утечки не может быть так как драйвер не выгружается единственное что может произойти это нехватка памяти если функция будет вызываться миллион раз
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх