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

Поиск незадокументированной функции в NTDLL

secflag

RAID-массив
Пользователь
Регистрация
29.01.2020
Сообщения
51
Реакции
10
Всех Приветствую. Стоит задача найти адрес функции по паттерну в NTDLL.
На просторах интернета нашел этот код:

C++:
#include <Windows.h>
#include <iostream>

bool DataCompare(byte* pData, byte* pattern, char* mask)
{
    for (; *mask; mask++, pattern++, pData++)
    {
        if (*mask == 'x' && *pData != *pattern)
            return false;
    }
    return true;
}

DWORD FindPattern(DWORD addr, DWORD length, byte* pattern, char* mask)
{
    HMODULE handle = GetModuleHandleW(L"ntdll.dll");

    MEMORY_BASIC_INFORMATION mbi = { 0 };
    DWORD offset = 0;

    while (offset < length)
    {
        VirtualQueryEx(handle, (LPCVOID)(addr + offset), &mbi,
            sizeof(MEMORY_BASIC_INFORMATION));
        if (mbi.State != MEM_FREE)
        {
            byte* buffer = new byte[mbi.RegionSize];
            memcpy(mbi.BaseAddress, buffer, mbi.RegionSize);
            for (unsigned int i = 0; i < mbi.RegionSize; i++)
            {
                if (DataCompare(buffer + i, pattern, mask))
                {
                    delete[] buffer;
                    return (DWORD)mbi.BaseAddress + i;
                }
            }
            delete[] buffer;
        }
        offset += mbi.RegionSize;
    }
    return 0;
}

unsigned char pattern[] = { 0xF6, 0x40, 0x10, 0x01 };
char* mask = (char*)"xxxx";

int main(int argc, char* argv[]) {

    DWORD addr = FindPattern(
        (DWORD)GetModuleHandleW(L"ntdll.dll"),
        4,
        pattern,
        mask
    );

    printf("%p", (void*)addr);

    return 0;
}

Но при запуске программы начинается вечный цикл...
Хотя в IDA Pro этот паттерн обозначает фрагмент в функции LdrpPrepareModuleForExecution.
Заранее спасибо за конструктивную помощь!
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Но при запуске программы начинается вечный цикл
Если у тебя бесконечный цикл, то в отладчике или в выводе в консоль посмотри RegionSize, вполне вероятно, что у, допустим, MEM_FREE он равен нулю, и у тебя указатель застревает на одном значении.
 
Решил проблему.

1. Поменял переменную handle с хэндла ntdll.dll на хэндл всего процесса, это была ошибка ставить ntdll :)
2. Была ошибка в memcpy, перепутал destination и source.
3. В первый параметр функции закинул прямой адрес на кодовую секцию, чтобы прям оттуда начинал искать.

Спасибо DildoFagins за помощь.
 


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