Сейчас на форуме: zds (+4 невидимых) |
![]() |
eXeL@B —› Программирование —› Выделение памяти в х64 процессе из х86 |
Посл.ответ | Сообщение |
|
Создано: 29 декабря 2013 19:00 · Личное сообщение · #1 Здравствуйте, товарищи. Возникла у меня проблема такого рода. Нужно мне выделить память (обычным вызовом VirtualAllocEx) в другом процессе. Но проблема в том, что VirtualAllocEx вызывается из 32-разрядного процесса, а выделить память нужно в 64-разрядном. Память-то выделяется, т.е. VirtualAllocEx отрабатывает, но вот проблема в том, что размерности указателей разные. Поясню детальнее. в х64 все указатели восьмибайтовые, и, соответственно, память выделить можно и выше 4 гигов. А в процессе, где разрядность 32 бита, указатели все четырёхбайтовые. Поэтому происходит усечение указателя, и истинное значение адреса теряется (VirtualAllocEx возвращает адрес, который помещается в 32-разрядный регистр). И получается, что память где-то выделилась, а где - непонятно. Как решить такую проблему, не пересобирая приложение под х64? ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 29 декабря 2013 19:11 · Личное сообщение · #2 пробежать VirtualQueryEx и запросить у VirtualAllocEx заведомо пустую область в нижних 4гб ![]() |
|
Создано: 29 декабря 2013 19:13 · Личное сообщение · #3 |
|
Создано: 29 декабря 2013 22:28 · Личное сообщение · #4 Решил последовать совету Veliant'а, но появилась проблема - VirtualQueryEx правильно определяет свободную область, т.е. ту, у которой State == MEM_FREE, но вот я вызываю VirtualAllocEx, в качестве второго параметра передаю ей BaseAddress из MEMORY_BASIC_INFORMATION, и вызов завершается с ошибкой об INVALID_ADDRESS. Но в ходе опытов я, бывает, передавал какие-то значения в середине региона, и, о чудо, оно позволяло выделить память. Причём, как и заявлено в документации, происходило округление вниз согласно гранулярности страниц. Code:
Выше приведен код метода, что я делаю не так? ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 30 декабря 2013 00:38 · Личное сообщение · #5 Смотри на AllocationType: MSDN: Attempting to commit a specific address range by specifying MEM_COMMIT without MEM_RESERVE and a non-NULL lpAddress fails unless the entire range has already been reserved. The resulting error code is ERROR_INVALID_ADDRESS. ----- the Power of Reversing team ![]() |
|
Создано: 30 декабря 2013 00:52 · Поправил: plutos · Личное сообщение · #6 |
|
Создано: 30 декабря 2013 01:28 · Личное сообщение · #7 DillerInc Да, именно в этом и были грабли, добавил MEM_RESERVE и заработало. Теперь буду тестить на х64. plutos Я не понял, зачем освобождать память, заранее ведь неизвестно, что за данные в чужом процессе расположены по каким-то адресам. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
![]() |
eXeL@B —› Программирование —› Выделение памяти в х64 процессе из х86 |