Перейти к содержанию

Рекомендуемые сообщения

Цитирую MSDN:

 

"The pointer that specifies a desired starting address for the region of pages that you want to allocate."

 

Это - про второй аргумент VirtualAllocEx. Если надо выделить память в конкретной области - даем адрес этой области. Аргумент не обязательный.

А как это конкретизировать?

Ссылка на комментарий
Поделиться на другие сайты

Если не знаешь, зачем, то и не надо. Ставь там 0 и все. Параметр не обязательно указывать, как и сказано в MSDN.

Я поставил NULL )

P.s. когда-то я думал, что NULL - это ноль )))))))))

Ссылка на комментарий
Поделиться на другие сайты

В общем.

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

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

Ссылка на комментарий
Поделиться на другие сайты

В общем.

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

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

Яснопонятно. Разобрался с реализацией, осталось вникнуть в смысл послания Keng'a. 

Ссылка на комментарий
Поделиться на другие сайты

Какого именно?

Какого именно Keng'a? Или какого именно послания?

1. Кенга - да он вроде один тут)) 

2. Послания, которое первым или вторым ответом идет) От тебя) Я пытался вначале вникнуть, но у меня пар из ушей пошел, как в мультфильмах.

Нужно еще раз попробовать)

Ссылка на комментарий
Поделиться на другие сайты

Попробовал я, значит, этот способ. Возник еще один вопросик:

Я так понимаю, что игровой код мы будем изменять и инъектировать не с помощью асмы, а с помощью байтов 0x12, 0x23 вот такого типа.

Ok, so let's test this shit. Я взял несколько байтов на пробу и засунул к себе в прогу. Не работает. Потому что:

Код наш (0х12, 0х12) был взят во время нашей инъекции из СЕ. Т.е. он адаптирован под конкретный адрес. А в нашей проге он представлен в виде смещения.

Вот примерчик:

//типо тут пример на AA в СЕ... типо перешли на новый адрес newmemmov ebx, 28add ebx, 3push pentagonjmp [notepad.exe + 150A] //тут прыжок обратно в оригинальный код

Ну и...

//типо тут пример _работы_ нашей софтины. Т.е. что она пишет по адресу после компиляшки... типо перешли на newmemmov ebx, 28add ebx, 3push pentagonjmp 0x12345 //т.е. тут мы прыгаем на оригналку. НО! по смещению. //Т.е. наша выделенная память может отличаться от той, где мы брали её в начале. //И прыгнуть мы можем при повторном использовании куда-нибудь в другое место и игра обрушится.

Как решить это?

Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

Смещение мы считаем ручками, для обоих переходов. А потом только записываем.

Ok, как его считать ручками?

Это еще ладно, тут логика нужна. Но... Как переводить наш математический результат - в байты? (т.е. в 0хEB, 0x12)

Ссылка на комментарий
Поделиться на другие сайты

Гляди:

 

JMP 1

 

то же самое, но в опкодах:

 

E9 01

 

E9 - опкод команды, 01 - смещение для прыжка. В 16-ричной системе счисления. Как его считать? Арифметикой.

Ссылка на комментарий
Поделиться на другие сайты

Гляди:

 

JMP 1

 

то же самое, но в опкодах:

 

E9 01

 

E9 - опкод команды, 01 - смещение для прыжка. В 16-ричной системе счисления. Как его считать? Арифметикой.

Ok, тогда почему

notepad.exe+350A - E9 F1CAFEFF           - jmp FFF60000
Просто не понятно как именно переводить)
Т.е. как бы переводить в HEX... и потом ещё раз переводить в HEX?))
Это как: ничего не написал в коде нажал ctrl + s, прошло 10 сек ещё раз нажал ctrl + s ))0 Чтоб уж наверняка)
Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

 

Просто не понятно как именно переводить)

Я делаю так, если мне нужно узнать байты, в скрипте (временно, лучше если инструкция только на запись и разовая) прописываю инструкцию которую мне нужно, включаю скрипт, перехожу в отладчик, перехожу на адрес прыжка инъекции и там смотрю байты.

Ссылка на комментарий
Поделиться на другие сайты

Я делаю так, если мне нужно узнать байты, в скрипте (временно, лучше если инструкция только на запись и разовая) прописываю инструкцию которую мне нужно, включаю скрипт, перехожу в отладчик, перехожу на адрес прыжка инъекции и там смотрю байты.

В том-то и дело! Такой способ  не работает! Нужно математически это всё высчитывать. Вычитать один адрес из другого и переводить это всё в HEX...

 

А теперь сходи и почитай про представление отрицательных чисел в 16-ричной системе счиления. (;

Кстати, какой адрес из какого вычитать?

И... Можно ссылку на эту тему? А то я ни разу об этом не слышал.

Ссылка на комментарий
Поделиться на другие сайты

Ты статью-то мою прочитал? Там даже готовый пример есть. :D

Статья? А она уже вышла?

Просто смотрел в твоём блоге (kekekeng) и там такой темы нет.

Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.