Проблема: я работаю над проектом для школы (мой выбор), который представляет собой загрузчик программ / инжектор DLL, идея которого я изначально нашел здесь , модифицированный в соответствии с моими потребностями и преобразованный ASM-части DLL для расширенного ASM, который будет компилироваться с GCC вместо Visual Studio. Вместо того, чтобы печатать счет пинбола в окне консоли, я загружаю написанную мной программу, которая принимает данные от пользователя и записывает их в файл. Загрузчик внедряет DLL с функцией, которая перенаправляет ввод пользователя, ранее предназначенный для файла, в ящик сообщений и записывает мою собственную строку в файл.
Это работает на моей машине, однако у меня есть опасения по поводу переключения платформы, потому что мой профессор должен скомпилировать работу на своей машине, поэтому вполне возможно, что адрес 0x004014A6, который в настоящее время содержит инструкцию для
CALL <some address>
, который записывает эту строку в файл (фактический код: ofile << user_input;
) не будет содержать ничего похожего на то, что скомпилировано на другом компьютере, но все равно будет вызывать эту функцию, которая записывает строку в файл .
То, что я хочу сделать, это динамически определять, каким будет этот адрес, в отличие от жесткого кодирования адреса. Я думаю, что я могу сделать это, используя GetProcAddress для функции, которая вызывается для получения адреса, затем создать массив для хранения байтов, представляющих CALL <that function>
, и искать побайтно в памяти где-то там, где я ожидаю найти этот вызов сделать, взять адрес и работать оттуда.
Хотя я точно не знаю, как это сделать.
ОСНОВНОЙ ВОПРОС: Как я могу отсканировать диапазон адресов памяти и сравнить содержимое с элементами массива?
Другими словами, я хочу включить в мою DLL функцию, которая читает байты по произвольному адресу в памяти и сравнивает его с ожидаемой последовательностью. Как я могу просто произвольно прочитать содержимое адресов памяти в определенном процессе?
Подозрения: мне нужно знать начальный и конечный адреса, где происходит выполнение исходной программы. Как я могу получить диапазон между начальным и конечным адресами? (Это похоже на настоящее препятствие. Остальное я, вероятно, могу получить, зная только, как получить начальный и конечный адреса процессов.)