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

Получить через peb инфу о модуле (lpBaseOfDll и SizeOfImage)

cppjunior

ripper
КИДАЛА
Регистрация
25.05.2022
Сообщения
57
Реакции
3
Гарант сделки
2
Пожалуйста, обратите внимание, что пользователь заблокирован
Как без GetModuleInformation получить информацию о модуле lpBaseOfDll и SizeOfImage (через peb). Помогите кодом, кому не сложно)
 
Тяжело, когда в гугле бан.
За основу взято: https://habr.com/ru/post/187226/

C:
// x64
BOOL get_dll_peb(LPCWSTR dllname /* in */, PUINT size  /* out */, HMODULE* base /* out */)
{
    typedef struct _UNICODE_STRING {
        USHORT Length;
        USHORT MaximumLength;
        PWSTR  Buffer;
    } UNICODE_STRING, * PUNICODE_STRING;
    typedef struct LDR_MODULE
    {
        LIST_ENTRY e[3];
        HMODULE    BaseAddress;
        void* EntryPoint;
        UINT       Size;
        UNICODE_STRING Path;
        UNICODE_STRING Name;
    } LDR_MODULE, *PLDR_MODULE;

    BOOL success = FALSE;

    *size = 0;
    *base = 0;

    int offset = 0x60;
    int ModuleList = 0x18;
    int ModuleListFlink = 0x18;
    int KernelBaseAddr = 0x10;
   
    INT_PTR peb = __readgsqword(offset);
    INT_PTR mdllist = *(INT_PTR*)(peb + ModuleList);
    INT_PTR mlink = *(INT_PTR*)(mdllist + ModuleListFlink);

    PLDR_MODULE mdl = (PLDR_MODULE)mlink;
    do
    {
        mdl = (LDR_MODULE*)mdl->e[0].Flink;

        if (mdl->BaseAddress != NULL)
        {
            if (!lstrcmpiW(mdl->Name.Buffer, dllname))
            {
                *size = mdl->Size;
                *base = mdl->BaseAddress;
                success = TRUE;
                break;
            }
        }
    } while (mlink != (INT_PTR)mdl);
    return success;
}
Думаю, как вызывать понятно.
Под x86 надеюсь сам справишься, там только смещения поменять надо будет. (и __readfsdword будет)
 


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