Найти в Дзене
osieman

Свой Cheat Engine с нуля! Часть 1 - Получаем список процессов и модули в нем.

Чтобы сформировать понимание, как происходит получение списка процессов, просто заглянем в исходники самого Cheat Engine. Здесь у нас есть процедура GetProcessList, в которую мы подаем массив строк, в который она запишем нам имена и айди процессов. Первое, на что обратим внимание - структура, куда записывается информация о процесе, в СЕ она выглядит так Мы можем ее записать так. Далее в процедуре идет блок с переменными Как итог я оставил так Для замены под C++ объекта ProcessList: TStrings, я использовал std::unordered_map<std::wstring, PProcessListInfo>& process_list. Потому что в коде, была логика схожая с мапой, когда у нас по имени процесса идет связка с объектом, содержащим информацию о нем (фактически один ProcessID..) Что у нас эквивалентно И в конце при необходимости это включается в лист Заменил на По этой процедуре особо добавить и нечего, она просто делает снимок и пробегается по процессам, выгружая данные.. Но тут мое любопытство увело меня в сторону от Cheat Engine, и я р

Чтобы сформировать понимание, как происходит получение списка процессов, просто заглянем в исходники самого Cheat Engine.

Здесь у нас есть процедура GetProcessList, в которую мы подаем массив строк, в который она запишем нам имена и айди процессов.

Первое, на что обратим внимание - структура, куда записывается информация о процесе, в СЕ она выглядит так

Мы можем ее записать так.

-2

Далее в процедуре идет блок с переменными

-3

Как итог я оставил так

-4

Для замены под C++ объекта ProcessList: TStrings, я использовал std::unordered_map<std::wstring, PProcessListInfo>& process_list. Потому что в коде, была логика схожая с мапой, когда у нас по имени процесса идет связка с объектом, содержащим информацию о нем (фактически один ProcessID..)

-5

Что у нас эквивалентно

-6

И в конце при необходимости это включается в лист

-7

Заменил на

-8

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

Но тут мое любопытство увело меня в сторону от Cheat Engine, и я решил посмотреть, что там у Process Hacker, это утилита позволяет работать с процессами. Самой интересной частью является - список модулей. Потому, что там сразу можно увидеть кто-где и какой размер в памяти занимает каждый из них.

Через поиск по файла по фразе EnumModules я вышел на вот такую вот функцию

-9

так же у нее есть 32битная реализация

-10

Результатом работы оных будет вот такая вот структура

-11
-12

Самыми интересными для нас будут PVOID DllBase - начало модуля относительно процесса , ULONG SizeOfImage - размер модуля (сколько байт он занимает внутри процесса) и UNICODE_STRING FullDllName. Но с именем все не так просто. Структура выглядит так

-13

Казалось бы, вот же она.. PWSTR Buffer строка.. выводись в студаут!! А вот и нет, здесь находится адрес в чужом пространстве, чтобы прочитать эту строку, придется сделать следующее.

-14

И тут я на радостях побежал смотреть все модули, но не тут-то было.. Если получить список процессов вполне себе легитимная процедура, то читать память другого процесса уже не всегда дозволяется авторами софта. Но на этот случай у ProcessHacker есть свой собственный драйвер, на то он и хакер.

Все, до чего я докопался - это метод

-15

Данные о драйвере выглядят так

-16

Но, к сожалению, с наскока подключиться к драйверу не удалось и лучший ответ, который я получилъ

-17

По итогу, я решил пока оставить драйвер и заняться гуевой частью, чтобы сразу под каждый инструмент прорабатывать внешний вид, как, что и куда будет выводиться.

Конец! А кто слушал - можете прокачать свои навыки на крутейшем курсе по реверсу ММОРПГ :)