Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 3
Регистрация: 22.10.2014
Сообщений: 6
1

Странности с ReadProcessMemory

22.10.2014, 14:27. Показов 1051. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. У меня есть функция на C#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
            var systemInfo = new SystemInfo();
            while (systemInfo.minimumApplicationAddress.ToInt32() == 0)
            {
                Win32.GetSystemInfo(out systemInfo);
            }
            IntPtr minimumAdress = systemInfo.minimumApplicationAddress;
            long minimumAdresslong = minimumAdress.ToInt32();
            IntPtr processHandle = Win32.OpenProcess(1040, false, 6168);
            ProcessQueryInformation processQuery;
            while (Win32.VirtualQueryEx(processHandle, minimumAdress, out processQuery, 28) != 0)
            {
                if ((processQuery.Protect == 4) && (processQuery.State == 4096))
                {
                        var buffer = new byte[processQuery.RegionSize];
                        IntPtr lpNumberOfbytes;
                        Win32.ReadProcessMemory(processHandle, processQuery.BaseAdress, buffer,
                            processQuery.RegionSize, out lpNumberOfbytes);
                        string preparedIDs = Encoding.ASCII.GetString(buffer);
                        //Console.WriteLine(preparedIDs);
                        var matchs =
                            new Regex("some regex", RegexOptions.IgnoreCase).Matches(preparedIDs);
                        if (matchs.Count > 0)
                        {
                            foreach (Match match in matchs)
                            {
                                Console.WriteLine(match.Value);
                            }
                        }
                }
                minimumAdresslong += processQuery.RegionSize;
                if (minimumAdresslong >= Int32.MaxValue)
                {
                    break;
                }
                minimumAdress = new IntPtr(minimumAdresslong);
            }
Я переписал её на C++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    SYSTEM_INFO systeminfo;
    GetSystemInfo(&systeminfo);
    LPVOID minimumAdress = systeminfo.lpMinimumApplicationAddress;
    long minimumAdresslong = reinterpret_cast<long>(minimumAdress);
    MEMORY_BASIC_INFORMATION meminfo;
    HANDLE hProc = OpenProcess(1040, FALSE, 6168);
    while (VirtualQueryEx(hProc, minimumAdress, &meminfo, sizeof(meminfo)) != 0){
        if ((meminfo.Protect == 4) && (meminfo.State) == 4096)
        {
            char* cDataBuffer = (char*)malloc(meminfo.RegionSize);
            DWORD lpNumberOfbytes;
            //std::string buffer;
            //buffer.resize(meminfo.RegionSize);
                                              //&buffer[0] - если с std::string buffer;
            ReadProcessMemory(hProc, meminfo.BaseAddress, cDataBuffer, meminfo.RegionSize, &lpNumberOfbytes);
            string preparedIDs(cDataBuffer, lpNumberOfbytes);
            //string preparedIDs = buffer;
            const std::tr1::regex rx("some regex", std::regex_constants::icase);
            std::tr1::match_results<std::string::const_iterator> res;
            if (std::tr1::regex_search(preparedIDs, res, rx))
            {
                for (unsigned int i = 0; i<res.size(); ++i)
                {
                cout << res[i] << std::endl;
                }
            }
            //cout << preparedIDs << endl;
            free(cDataBuffer);
        }
        minimumAdresslong += meminfo.RegionSize;
        if (minimumAdresslong >= INT_MAX){
            break;
        }
        minimumAdress = reinterpret_cast<LPVOID>(minimumAdresslong);
    }
Оно конечно работает, но есть проблемы. Код на С# работает нааамного быстрее, я значения получаю ещё до появление консоли, а в С++ за 4 секунды только. Но это ещё ладно, но на C++ выводит только 4 значения, когда на C# выдает 12 значении..
Пробовал использовать std::string buffer(говорят так лучше), но разницы нету вообще никакой. В чем может быть проблема? на С++ пишу первый раз и избалован решеткой, так что сильно палкой не бить если упустил какие-то тонкости работы с++)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2014, 14:27
Ответы с готовыми решениями:

ReadProcessMemory
ReadProcessMemory(hProcess,(LPVOID)0x004F21B0,&amp;Value,?,NULL); Возникла такая проблема я не знаю...

ReadProcessMemory
Приветствую всех. Ребят, проблема − нужно подцепиться к стороннему процессу и прочитать кусок...

ReadProcessMemory
ReadProcessMemory (fProcess.__HandleProcess, (PBYTE*)(fProcess.__dwordClient + Player_Base),...

ReadProcessMemory
Привет всем!) Помогите пожалуйста прочитать строку из памяти и вывести её на экран. Читаю так:...

3
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
22.10.2014, 19:46 2
Для начала работу с regex и буферами вынести за пределы цикла.
0
1 / 1 / 3
Регистрация: 22.10.2014
Сообщений: 6
24.10.2014, 00:10  [ТС] 3
Для начала работу с regex и буферами вынести за пределы цикла.
Это все я уже делал, куда что только не переносил, просто тут я выложил такой вариант, т.к. особо не влияло. Сейчас моя задача уже заключается не столь в скорости и микро оптимизации как найти хотя бы все значения из памяти, а не 1/3(нужно в точности как в С# выходит)
0
1 / 1 / 3
Регистрация: 22.10.2014
Сообщений: 6
26.10.2014, 13:51  [ТС] 4
Есть идеи?
0
26.10.2014, 13:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2014, 13:51
Помогаю со студенческими работами здесь

ReadProcessMemory LPCSTR
Здравствуйте! Почему-то при выводе считанной строки программа падает (Необработанное исключение,...

ReadProcessMemory ERROR_PARTIAL_COPY
ReadProcessMemory даёт ошибку ERROR_PARTIAL_COPY(299). Программа не имеет защиты. Адрес брался из...

ReadProcessMemory returns 0
Здравствуйте. Вообщем столкнулся с такой проблемой. пишу тренер для онлайн игры. Раньше работало...

ReadProcessMemory string
есть такая вещичка: template &lt;class cData&gt; cData Read(DWORD dwAddress) { cData cRead;...

ReadProcessMemory Pro
Доброго времени суток! Такая проблема. Хочу прочесть регион памяти защищенного процесса. Использую...

Проблемы с ReadProcessMemory, WriteProcessMemory
Приветствую всех. Ребят, проблема − нужно подцепиться к стороннему процессу, прочитать кусок...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru