Ошибка 299 что это может быть

i’m having some problem with reading process’s memory, all i get is error 299, sometimes error 5/6, i’m new to memory reading / writing and can use any help.

This is what i have so far :

    private void ScanMemory()
    {
        uint PID;
        GetWindowThreadProcessId(GetWindowHandle(), out PID);
        label3.Text = "" + (int)PID;
        int valueToSearch = 4;
        List<int> matchAddresses = new List<int>();
        long MaxAddress = 0x7fffffff;
        long address = 0;
        do
        {
            MEMORY_BASIC_INFORMATION32 m;
            IntPtr Handle = OpenProcess((int)ProcessAccessFlags.All, false, (int)PID);
            uint result = VirtualQueryEx((int)Handle, (int)address, out m, (int)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION32)));
            if (address == (long)m.BaseAddress + (long)m.RegionSize)
                break;
            address = (long)m.BaseAddress + (long)m.RegionSize;
            SearchIntSizeValue(Handle, (int)m.BaseAddress, (int)m.RegionSize, valueToSearch, matchAddresses);
        } while (address <= MaxAddress);

        foreach (int res in matchAddresses)
        {
            listBox1.Items.Add(res);
        }
    }
    public void SearchIntSizeValue(IntPtr hProcess, int startAddress, int endAddress, int valueToSearch, List<int> addresses)
    {
        byte[] buffer = new byte[4];
        IntPtr bytesread;
        while (startAddress < endAddress)
        {
            ReadProcessMemory(hProcess, (IntPtr)startAddress, buffer, 4, out bytesread);
            int res = BitConverter.ToInt32(buffer, 0);
            if (res == valueToSearch)
            {
                addresses.Add(startAddress);
            }
            else
            {
                int le;
                if ((le = Marshal.GetLastWin32Error()) != 0)
                {

                }
            }
            startAddress += 4;
        }
    }

[StructLayout(LayoutKind.Sequential)]
 struct MEMORY_BASIC_INFORMATION32
{
    public uint BaseAddress;
    public uint AllocationBase;
    public int AllocationProtect;
    public uint RegionSize;
    public int State;
    public int Protect;
    public int lType;
}

i’m reading size of int at the moment, not really working :|, from reading in google, i saw there is this thing with privilege , though, i run vs2010 with Admin rights on windows 7, i hope it’s enough information for you to spot my problme, thanks in advance!

>
ReadProcessMemory… code error 299
, Помогите справиться с кодом 299

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
25.08.08, 17:23

    Senior Member

    ****

    Рейтинг (т): 10

    Пытаюсь прочитать память процесса по заранее известному адресу…..

    ExpandedWrap disabled

      HANDLE hQip=0;

          HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

          PROCESSENTRY32 ProcEntry;

          ProcEntry.dwSize = sizeof(PROCESSENTRY32);

          Process32First(hSnapShot,&ProcEntry);

          do

          {

              if(lstrcmp(«qip.exe»,ProcEntry.szExeFile)==0)

              {

                  hQip = OpenProcess(PROCESS_ALL_ACCESS,TRUE,ProcEntry.th32ProcessID);

                  if(hQip==0) return 0;

              }

          }

          while(Process32Next(hSnapShot,&ProcEntry));

          if(ReadProcessMemory(hQip,(PVOID)0x006A3AC,n,1000,&d) == 0)

          {

              d = GetLastError();

          sprintf(n,»%d»,d);

          MessageBox(HWND_DESKTOP,n,»pass:»,0);

          }

          else

          {

              MessageBox(HWND_DESKTOP,n,»»,0);

          }

    GetLastError() всегда говорит о 299 ошибке: ReadWriteProcessMemory запрос выполнен не полнустью.
    Чего это может быть ?


    Мальчиш



    Сообщ.
    #2

    ,
    26.08.08, 06:51

      barberan
      во первых надо проверять

      ExpandedWrap disabled

        if (hQip)

        {

           if(ReadProcessMemory(hQip,(PVOID)0x006A3AC,n,1000,&d) == 0)

            {

                d = GetLastError();

                sprintf(n,»%d»,d);

                MessageBox(HWND_DESKTOP,n,»pass:»,0);

            }

            else

            {

                MessageBox(HWND_DESKTOP,n,»»,0);

            }

        }

      во вторых адрес 0x006A3AC на разных платформах, системах, при разных условиях может быть разным.
      И в третьих, кто тебе сказал что там можно считать 1000 байт?

      Добавлено 26.08.08, 06:52
      и в четверых посмотри чему равно d после вызова ReadProcessMemory.

      Добавлено 26.08.08, 06:53
      и вообще код ОЧЕНЬ плохой, т.к. используешь одни и те же переменные для разных целей (n, d)


      leo



      Сообщ.
      #3

      ,
      26.08.08, 08:21

        Цитата Мальчиш @ 26.08.08, 06:51

        во вторых адрес 0x006A3AC на разных платформах, системах, при разных условиях может быть разным.
        И в третьих, кто тебе сказал что там можно считать 1000 байт?

        Во-вторых — верно, а в-третьих — Майкрософт ;)
        Т.к. память выделяется страницами не менее 4К, то либо адрес 0x06A3AC вообше не доступен, либо доступна вся страница до 0x06B000, т.е. 3156 байт

        А вот хватает ли размера переменной n для 1000 байт — из приведенного кода не видно


        barberan



        Сообщ.
        #4

        ,
        26.08.08, 13:41

          Senior Member

          ****

          Рейтинг (т): 10

          if (hQip)
          { }

          это проверено заранее.
          адрес — заранее известен… из отладчика.
          а ошибка 299 — есть.


          leo



          Сообщ.
          #5

          ,
          26.08.08, 15:02

            Ошибка 299 вылезает и в том случае, когда память по адресу вообще не доступна. Проверь число прочитанных байт d — если 0, значит память по данному адресу вообще не выделена — можешь проверить по VirtualQueryEx


            barberan



            Сообщ.
            #6

            ,
            26.08.08, 16:59

              Senior Member

              ****

              Рейтинг (т): 10

              С этим разобрался, спасибо. А еще вопрос.. как в памяти процесса найти что-то определнное, и узнать по какому адресу оно лежит ?


              leo



              Сообщ.
              #7

              ,
              27.08.08, 05:17

                Цитата barberan @ 26.08.08, 16:59

                как в памяти процесса найти что-то определнное, и узнать по какому адресу оно лежит ?

                Сам понимаешь, вопрос не только не новый, но и достаточно «популярный» ;)
                Краткий ответ: VirtualQueryEx + SetLength(s,pmi.RegionSize) + ReadProcessMemory(..,pointer(s),..) + Pos(..,s)
                Конкретные примеры найдешь поиском, например VirtualQueryEx и ReadProcessMemory


                barberan



                Сообщ.
                #8

                ,
                27.08.08, 21:11

                  Senior Member

                  ****

                  Рейтинг (т): 10

                  Подскажите, как найти границы адресов процесса? Делаю так:

                  ExpandedWrap disabled

                    MEMORY_BASIC_INFORMATION mbi;

                    SIZE_T mbi_size = sizeof(mbi);

                    DWORD startaddr=0,     //начальный адрес

                    lowaddr,             //нижняя граница

                    highaddr;            //верхняя граница

                    do

                        {

                            if( VirtualQueryEx(hQip,(LPCVOID)startaddr,&mbi,mbi_size) != sizeof(mbi))

                            {

                                         return 0;

                            }

                            startaddr+=(DWORD)mbi.RegionSize;

                        }while(mbi.State != MEM_COMMIT);

                    lowaddr = mbi.BaseAddress; //типа нашли нижнюю границу процесса.

                  Через отладчик смарел… startaddr сначала +=65536 потом еще +=4096… Получается всего 2 страницы MEM_COMMIT чего быть то и не может.
                  Сам вопрос вообще в том, что я не понимаю %) С какого адресса начинать VirtualQueryEx-ить… т.е. 2 арг. ф-ции — что туда передавать ?

                  Wizard

                  B.V.



                  Сообщ.
                  #9

                  ,
                  28.08.08, 07:03


                    leo



                    Сообщ.
                    #10

                    ,
                    28.08.08, 12:07

                      Цитата barberan @ 27.08.08, 21:11

                      как найти границы адресов процесса?
                      Получается всего 2 страницы MEM_COMMIT чего быть то и не может

                      Еще как может ;) Похоже ты не понимаешь главного — память процесса это не только образ загруженного экзешника, но и образы подключенных длл (системных и «личных»), стек(и) потока(ов), динамическая память (виндовая куча, собственная куча, отдельные блоки VirtualAlloc), плюс множество служебных регионов памяти типа переменных окружения, списка загруженных модулей (куча загрузчика) и т.д. и т.п. Каждая из этих «сущностей» занимает непрерывные регионы памяти, но между собой эти регионы не «склеены» и как правило разделены «дырами», хотя бы потому что в винде адреса резервируются с шагом 64К, а физ.память выделяется (commit) страницами по 4К.
                      Поэтому если ты точно знаешь, что твое искомое значение принадлежит секции данных образа или виндовой кучи, то можно определить соотв.диапазон адресов через ToolHelp АПИ и структуру PE-заголовка. Но определить диапазон адресов стека и тем более не виндовой кучи (например, борландовской) и уж тем более отдельно выделенных блоков — не так то просто. Поэтому проще просто просканировать всю память VirtualQueryEx с шагом 4 (или 64К), читая commited блоки и искать в них нужное значение


                      barberan



                      Сообщ.
                      #11

                      ,
                      28.08.08, 20:13

                        Senior Member

                        ****

                        Рейтинг (т): 10

                        Хм.. РАзобрался. А вот еще вопрос… ведь каждый адресс, если верить карте памяти состояит из 16 байт(или как это… — секций чтоли). В каждом байте(секции) хранится 1 символ. Иногда у меня странно считываетются не все 16(я точно не знаю что происходит), но знаючи, что например по данному адрессу «hello,world» я вижу чёта типа «lo,world» или «hello,wor». Что есть что? :wacko:


                        leo



                        Сообщ.
                        #12

                        ,
                        29.08.08, 07:03

                          Цитата barberan @ 28.08.08, 20:13

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

                          Не верь глазам своим :) Это делается просто для удобства отображения — в каждой строке выводится по 16 байтсимволов по адресам кратным 0x10. Поэтому если ты вместо «hello,world» видишь чёта типа «lo,world» по адресу X, значит действительный адрес начала текста = X-3 и ничего более :)


                          barberan



                          Сообщ.
                          #13

                          ,
                          29.08.08, 11:45

                            Senior Member

                            ****

                            Рейтинг (т): 10

                            а как бы это корректировать по ходу ??? ведь не знаю что увижу, толи леву половинку, толи правую. КАк быть?


                            leo



                            Сообщ.
                            #14

                            ,
                            29.08.08, 14:27

                              Никак.
                              Не пойму, чего ты хочешь. Если нужно найти заданную строку, например, «hello,world» то и ищи ее в регионе памяти.
                              Если же не знаешь, чего искать, и хочешь сам вывести карту памяти, то тебе по любому нужно будет как-то ограничивать длину выводимых строк, разбивая их по 8, 16 или 32 символа. При этом ес-но текст «hello,world» может оказаться в любом месте

                              PS: В дельфиBCB поиск подстроки реализуется легко — выделяем память под AnsiString через SetLength(s,mbi.RegionSize), читаем в строку весь регион и затем ищем подстроку функцией Pos. Такой поиск работает для любых бинарных данных, т.к. диапазон поиска ограничивается явно заданной длиной строки, а не нулевыми символами, которые могут встречаться в произвольных данных. Есть ли нечто подобное в CC++ не знаю. Если нет, то придется организовать ручками: юзать в цикле strstr и перескакивать нулевые символы, пока не дойдем до конца региона

                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                              0 пользователей:

                              • Предыдущая тема
                              • Visual C++ / MFC / WTL
                              • Следующая тема

                              [ Script execution time: 0,0386 ]   [ 16 queries used ]   [ Generated: 13.06.23, 10:11 GMT ]  

                              Мой код работает на win7 32bit, но когда я использую EnumProcessModules, он возвращает false и getlasterror() возвращает код ошибки 299, который заявляет, что программа 32bit, и этот оператор не может работать на 64-битной системе.

                              Интересно, почему это происходит, и почему система думает, что я работаю на 64-битной ОС?

                              Код, который я использую:

                                       HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
                                       if (hProcess)
                                       {
                                          HMODULE hMod = NULL;
                                          DWORD cbNeeded = 0;
                                          if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
                                          {
                                            //do something here...
                                          }
                                       }
                              

                              dwPid — это идентификатор процесса, который я хочу манипулировать.

                              PS. Эта ошибка возникает только на одной из моих тестовых машин, другие — в порядке. Таким образом, эта проблема может быть связана с конкретной конфигурацией машины или системы?

                              • Классы состояния
                              • Коды ответов сервера
                              • 1xx
                              • 2xx
                              • 3xx
                              • 4xx
                              • 5xx

                              HTTP status code — (с англ.) код состояния HTTP; часть первой строки ответа сервера при запросах по протоколу HTTP. Он (код ответа) представляет собой целое число из трёх цифр, первая из которых указывает на класс состояния. За кодом ответа обычно следует, отделённая пробелом, поясняющая фраза на английском языке, которая разъясняет человеку причину именно такого ответа:

                              200 OK

                              404 Not Found

                              500 Internal Server Error

                              Классы состояния

                              1xx: Informational
                              Информационные ответы — запрос от клиента принят, работа продолжается.
                              2xx: Success
                              Успех — запрос от клиента принят, понятен и может быть выполнен.
                              3xx: Redirection
                              Перенаправление — для выполнения запроса необходимы дальнейшие действия.
                              4xx: Client Error
                              Ошибка клиента — запрос составлен неверно или не может быть выполнен.
                              5xx: Server Error
                              Ошибка сервера — запрос правильный, но сервер не может его выполнить.

                              Коды ответов сервера

                              Номер Поясняющая фраза Перевод
                              1xx Informational Информационные ответы
                              100 Continue Продолжить
                              101 Switching Protocols Переключение протоколов
                              102 Processing Идёт обработка
                              103-199 Не назначены
                              2xx Success Успех
                              200 OK Хорошо
                              201 Created Создано
                              202 Accepted Принято
                              203 Non-Authoritative Information Информация не авторитетна
                              204 No Content Нет содержимого
                              205 Reset Content Сбросить содержимое
                              206 Partial Content Частичное содержимое
                              207 Multi-Status Многостатусный
                              208 Already Reported Уже сообщили
                              209-225 Не назначены
                              226 IM Used Использовано IM
                              227-299 Не назначены
                              3xx Redirection Перенаправление
                              300 Multiple Choices Множество выборов
                              301 Moved Permanently Перемещено навсегда
                              302 Found Найдено
                              303 See Other Смотреть другое
                              304 Not Modified Не изменялось
                              305 Use Proxy Использовать прокси
                              306 Не используется
                              307 Temporary Redirect Временное перенаправление
                              308 Permanent Redirect Постоянное перенаправление
                              309-399 Не назначены
                              4xx Client Error Ошибка клиента
                              400 Bad Request Плохой, неверный запрос
                              401 Unauthorized Неавторизован
                              402 Payment Required Необходима оплата
                              403 Forbidden Запрещено
                              404 Not Found Не найдено
                              405 Method Not Allowed Метод не поддерживается
                              406 Not Acceptable Неприемлемо
                              407 Proxy Authentication Required Необходима аутентификация прокси
                              408 Request Timeout Истекло время ожидания
                              409 Conflict Конфликт
                              410 Gone Удален
                              411 Length Required Необходима длина
                              412 Precondition Failed Условие ложно
                              413 Payload Too Large Большая нагрузка
                              414 URI Too Long URI слишком длинный
                              415 Unsupported Media Type Неподдерживаемый тип данных
                              416 Range Not Satisfiable Неприемлемый диапазон
                              417 Expectation Failed Ожидаемое неприемлемо
                              418-420 Не назначены
                              421 Misdirected Request Неверно адресованный запрос
                              422 Unprocessable Entity Необрабатываемый экземпляр
                              423 Locked Заблокировано
                              424 Failed Dependency Невыполненная зависимость
                              425 Не назначен
                              426 Upgrade Required Необходимо обновление
                              427 Не назначен
                              428 Precondition Required Необходимо предусловие
                              429 Too Many Requests Слишком много запросов
                              430 Не назначен
                              431 Request Header Fields Too Large Поля заголовка запроса слишком большие
                              432-450 Не назначены
                              451 Unavailable for Legal Reasons Недоступно по юридическим причинам
                              432-499 Не назначены
                              5xx Server Error Ошибка сервера
                              500 Internal Server Error Внутренняя ошибка сервера
                              501 Not Implemented Не реализовано
                              502 Bad Gateway Плохой, ошибочный шлюз
                              503 Service Unavailable Сервис недоступен
                              504 Gateway Timeout Шлюз не отвечает
                              505 HTTP Version Not Supported Версия HTTP не поддерживается
                              506 Variant Also Negotiates Вариант тоже проводит согласование
                              507 Insufficient Storage Переполнение хранилища
                              508 Loop Detected Обнаружена петля
                              509 Не назначен
                              510 Not Extended Не расширено
                              511 Network Authentication Required Требуется сетевая аутентификация
                              512-599 Не назначены
                              • HTTP
                              • Hypertext Transfer Protocol (HTTP) Status Code Registry
                              • Список кодов состояния HTTP

                              31.08.2014

                                  DWORD pid;
                              HWND hForeground = GetForegroundWindow();
                              GetWindowThreadProcessId(hForeground, &pid);
                              const int MAX_SIZE = 512;
                              char buffer[MAX_SIZE];
                              HANDLE pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
                              while (true) {
                                  int l = 10;
                                  cout << l << endl;
                                  if (ReadProcessMemory(pHandle, (LPCVOID)&l, buffer, sizeof(l), 0) == 0 && GetLastError() == 299)
                                      cout << "paging file"<<buffer << endl;
                                  else if (ReadProcessMemory(pHandle, (LPCVOID)&l, buffer, sizeof(l), 0) !=0)
                                      cout << "RAM" << endl;
                                  cout << l << endl;
                                  Sleep(100);
                                  system("CLS");
                              }
                              

                              по моей задумке программа должна получать ячейку памяти занимаемую переменной l и если она есть в оперативной памяти то выводится RAM, и соответственно если ее там нет то значит она в файле подкачки. Но почему-то происходит ошибка 299 и buffer не заполняется.

                              Понравилась статья? Поделить с друзьями:
                            • Ошибка 299 в бмв е60
                            • Ошибка 2fd7b735 в nba 2k21
                            • Ошибка 296b бмв 1 16i
                            • Ошибка 2fa blacksprut как исправить
                            • Ошибка 2955 71 опель астра н