Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение памяти, читать память HANDLE 
:(
    Опции темы
DrHex
Дата 2.5.2009, 18:33 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 2.5.2009

Репутация: нет
Всего: нет



Вопрос таков как читать память HANDLE, то и есть делаем следущие 

Код

HANDLE hMutex = CreateMutex(NULL, FALSE, _T("bla bla bla"));

char buffer[16];

mempcy(buffer, hMutex, sizoef(buffer));


Разумеется происход исключени(access violation reading).

Написал драйвер
(Код копирование памяти с указанием процесса)

Код

void ReadMemory(HANDLE hProcess, void* src, void* dest, unsigned int* size)
{
    PEPROCESS process = NULL;
    NTSTATUS  st;
    PUCHAR pMem = NULL;
    ULONG Addr;
    unsigned int size_copy;
    PUCHAR cPtr, dPtr;
    KAPC_STATE ApcState;
    ULONG CR0Reg;


    //create reference to hProcess(for kernel mode)
    st = ObReferenceObjectByHandle(hProcess, 0, NULL, UserMode, &process, NULL);
    
    if(!NT_SUCCESS(st))
        return;

    size_copy = *size;

    //create timed buffer
    pMem = ExAllocatePool(NonPagedPool, size_copy);
    dPtr = pMem;
    cPtr = (PUCHAR)src;

    //connect process to read memory
    KeStackAttachProcess(process, &ApcState);
    
    /*
      Copy memory from process.
      Not used memocy(and etc) because if not valid block memory we catch exception(copy while have access)
    */
    __try
    {
        while (size_copy)
        {
            *dPtr = *cPtr;
            cPtr++;
            dPtr++;
            size_copy--;
        }
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {}

    //unconnect from process(process when read memory)
    KeUnstackDetachProcess(&ApcState);

    size_copy = *size - size_copy;
    __try

    {
        memcpy(dest, pMem, size_copy);
        *size = size_copy;
    }

    __except(EXCEPTION_EXECUTE_HANDLER)
    { }

    /*
      free memory for timed buffer
    */
    ExFreePool(pMem);
    ObDereferenceObject(process);
}


Но читает только пользовательскую память.


После чего еще добавил вариант

Код

NTSTATUS ReadKernelMemory(HANDLE hProcess, void* src, void* dest, unsigned int* size)
{

    char* addressSrc, *addressDest;
    PMDL  pSrcMdl, pDstMdl;

    //__asm int 3
    //create source
    pSrcMdl = IoAllocateMdl(src, *size, FALSE, FALSE, NULL);
    if(!pSrcMdl)
        goto EXIT_ERROR;

    MmBuildMdlForNonPagedPool(pSrcMdl);

    addressSrc = MmGetSystemAddressForMdlSafe(pSrcMdl, NormalPagePriority);
    if(!addressSrc)
        goto EXIT_ERROR_FREE_SRC_MDL;

    pDstMdl = IoAllocateMdl(dest, *size, FALSE, FALSE, NULL);

    if(!pDstMdl)
        goto EXIT_ERROR_FREE_SRC_MDL;

    MmProbeAndLockPages(pDstMdl, UserMode, IoWriteAccess);

    addressDest = MmGetSystemAddressForMdlSafe(pDstMdl, NormalPagePriority);

    if(!addressDest)
        goto EXIT_ERROR_FREE_MDL;

    //set zero
    memset(addressDest, 0, *size);

    //copy memory
    {
        unsigned int i;
        //_asm int 3
        __try
        {
            for (i = 1; i < *size; ++i)
            {
                //if (MmIsAddressValid(addressSrc)) 
                    *addressDest = *addressSrc;

                addressSrc++;
                addressDest++;
            }
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {}
        *size = i;
    }

    //free timed resource
    MmUnlockPages(pDstMdl);
    IoFreeMdl(pDstMdl);
    IoFreeMdl(pSrcMdl);

    return STATUS_SUCCESS;

//errors
EXIT_ERROR_FREE_MDL:    
    MmUnlockPages(pDstMdl);
    IoFreeMdl(pDstMdl);
EXIT_ERROR_FREE_SRC_MDL:
    IoFreeMdl(pSrcMdl);
EXIT_ERROR:
    *size = 0;
    return STATUS_UNSUCCESSFUL;
}


Но и это не происходит удачно, может читать только не выгружаеме пулы.


Так как же все таки моно прочитать? Очень надо........







--------------------
google.com и это все.
PM MAIL   Вверх
GremlinProg
Дата 3.5.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



меня терзают смутные сомнения,
как сочетается этот код:
Цитата(DrHex @  2.5.2009,  20:33 Найти цитируемый пост)

HANDLE hMutex = CreateMutex(NULL, FALSE, _T("bla bla bla"));
char buffer[16];
mempcy(buffer, hMutex, sizoef(buffer));

с этим выражением:
Цитата(DrHex @  2.5.2009,  20:33 Найти цитируемый пост)
Написал драйвер

поскольку банальная ошибка представления дескриптора как указателя ни как не вяжется со всем остальным,

объясни человеческим языком, что ты хочешь получить?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
xvr
Дата 4.5.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(DrHex @ 2.5.2009,  18:33)
Вопрос таков как читать память HANDLE

Никак. 
HANDLE, не смотря на то, что описан как void* не является указателем, и ни на какую память не указывает

PM MAIL   Вверх
GoldFinch
Дата 4.5.2009, 14:18 (ссылка)    | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



HANDLE занимает 4 байта, а не 16

Добавлено через 35 секунд
xvr, некоторые хендлы являются указателями, например HMODULE
PM MAIL ICQ   Вверх
Lazin
Дата 4.5.2009, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



Цитата(GoldFinch @  4.5.2009,  14:18 Найти цитируемый пост)
HANDLE занимает 4 байта, а не 16

4 или 8 байт, в зависимости от процессорной архитектуры, или вы ничего другого не признаете?  smile 
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 4.5.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Цитата

HANDLE занимает 4 байта, а не 16

Причем тут вообще сколько занимает HANDLE? Он пытается копировать то что находится по указателю а не сам указатель.
И вообще как сказал Lazin это зависит от архитектуры
PM   Вверх
GoldFinch
Дата 4.5.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



Lazin, да, в большинстве систем 4 байта, и в некоторых системах 8байт
PM MAIL ICQ   Вверх
xvr
Дата 4.5.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(GoldFinch @ 4.5.2009,  14:18)
Добавлено @ 14:19
xvr, некоторые хендлы являются указателями, например HMODULE

Угу, но HANDLE от Mutex таковым не является  smile 

PM MAIL   Вверх
J0ker
Дата 5.5.2009, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: -1
Всего: 14



Цитата(DrHex @  2.5.2009,  18:33 Найти цитируемый пост)
Написал драйвер

а не рановато-ли?  smile 


--------------------
user posted image
PM MAIL   Вверх
DrHex
Дата 6.5.2009, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 2.5.2009

Репутация: нет
Всего: нет



Ладно пример я выбрал плохой, чтения HANDLE.

Вопрос в том чтобы читать память ядра.

к примеру по адрессу 0x80000000(32 битка).

Зачем пишу драйвер?

Так как в виндовс поддерживает 2 кольца(0 и 3), а все приложения находятся в 3 кольце из которого нельзя получить доступ к памяти ядра,
то пишу драйвер(внимпние: драйвер ядра) что бы получить память(так как драйвер находится в 0 кольце).


--------------------
google.com и это все.
PM MAIL   Вверх
Lazin
Дата 6.5.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



Цитата(DrHex @  6.5.2009,  10:14 Найти цитируемый пост)
Вопрос в том чтобы читать память ядра.

к примеру по адрессу 0x80000000(32 битка).


с помощью memcpy smile 
или еще проще
Код

int* ptr = (int*)0x80000000;
int value = *ptr;

только не понятно, зачем это нужно, так-что:
Цитата(J0ker @  5.5.2009,  01:12 Найти цитируемый пост)
а не рановато-ли?
 smile 


Это сообщение отредактировал(а) Lazin - 6.5.2009, 10:26
PM MAIL Skype GTalk   Вверх
DrHex
Дата 7.5.2009, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 2.5.2009

Репутация: нет
Всего: нет



Lazin извените за грубость но вы название ветки форума видели?

Так вот если вы обитаете в этой ветки форума , то наверника читали 3 томник интела(или у амд чето подобное есть)

32 бит адресное пространство делится на диапозоны.

Адрессация с(точно непомни) до 0x80000000   -  принадлежит к 3 кольцу

Адрессация с 0x80000000 - принадледит 0 кольцу.

Винда грузится с 0x80000000.

Так вот надо скопировать(потом понадобится запись) память с 0x80000000(и выше). 


Если делать mempcy просто будет access violation.
Если в драйвере тоже будет исключение.(А вот почему?)
Отключаем флаг dw  в crt3, получаю BSOD.
Перевожу в физическую адрессацию тоже получаю BSOD.


Если кто то решал такую проблему скажите как?

Зачем нужно? ну вопервых читать память процесса, делать дамп адра.
Функии ReadProcessMemory/WriteProcessMemory(и Virtual ) на них как правило ставят хуки(даже в рреальзации ntdll, хотя конечно можно их перевисать, но вообщемно индентивикация возмона их по сигнатуре, можно сделать обфускацию но по мне так это уже через чюр, да и память ядра они читать не умеют).












--------------------
google.com и это все.
PM MAIL   Вверх
Lazin
Дата 7.5.2009, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



Цитата(DrHex @  7.5.2009,  02:39 Найти цитируемый пост)
Если делать mempcy просто будет access violation.
Если в драйвере тоже будет исключение.(А вот почему?)

я говорил о драйвере, который работает в режиме ядра
теперь о исключениях, если я в обычном приложении попытаюсь прочитать память по адресу между 0x00000000 и 0x80000000, то получу исключение, так-что режим работы процессора здесь роли не играет, память должна быть выделена, что-бы к ней можно было обращаться
PM MAIL Skype GTalk   Вверх
xvr
Дата 7.5.2009, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(DrHex @ 7.5.2009,  02:39)
Так вот если вы обитаете в этой ветки форума , то наверника читали 3 томник интела(или у амд чето подобное есть)

32 бит адресное пространство делится на диапозоны.

Адрессация с(точно непомни) до 0x80000000   -  принадлежит к 3 кольцу

Адрессация с 0x80000000 - принадледит 0 кольцу.

Сильно  smile . В каком месте 3х томника это написано? 
Цитата

Винда грузится с 0x80000000.
Это личное дело Винды, куда грузится и как распределять память на системную/пользовательскую.
Цитата

Если делать mempcy просто будет access violation.
Если в драйвере тоже будет исключение.(А вот почему?)
Драйвер ruki.sys виноват
Цитата

Отключаем флаг dw  в crt3, получаю BSOD.
Перевожу в физическую адрессацию тоже получаю BSOD.
Драйвер golova.sys 
Цитата

Если кто то решал такую проблему скажите как?
Внимательным чтением DDK на тему что и куда читать. Hint: для memcpy нужно 2 адреса - откуда читать (ваши 0x80000000) и куда читать (а вот об этом вы и не позаботились). Читать нужно в ответ на какую то операцию в драйвере (это может быть IRP_MJ_READ или IRP_MJ_DEVICE_CONTROL), Винда вам выделит буфер для обмена - вот туда и надо делать memcpy

PM MAIL   Вверх
J0ker
Дата 7.5.2009, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: -1
Всего: 14



Цитата(DrHex @  7.5.2009,  02:39 Найти цитируемый пост)
Адрессация с(точно непомни) до 0x80000000   -  принадлежит к 3 кольцу

Адрессация с 0x80000000 - принадледит 0 кольцу.

Винда грузится с 0x80000000.

бредить изволите? причем мэпинг к кольцам-то
эти адреса виртуальные, и принадлежат они полностью процессу
то, что в верхние 2Гб мэпаются системные прибамбасы не делают эти гигабайты "принадлежащими 0 кольцу"


--------------------
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0634 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.