Сейчас на форуме: vsv1, _MBK_, ut2004 (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Как программно сбросить состояние регистров и памяти опр. процесса в опр. месте?
Посл.ответ Сообщение

Ранг: 1.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 марта 2007 15:03 · Поправил: Sasha73
· Личное сообщение · #1

Уважаемые мастера дэКодинга !
Помогите, плиз, или поскажите можно ли сбросить состаение памяти (стека) опр. процесса в опр. месте этого процесса (т.е. вставить Jmp на нашу прогу и выгрузить в файл 256 байт начиная с ebp-12, будем ли мы видеть эту область памяти под 2к_ХР из своей проги) ?
Занимаюсь Ccalc6.80 (версия 6.98.56). Она уже здесь обсуждалась, но так и не доделали до конца, может буду первым. --> Здесь было обсуждение. <--
Если можно, набросайте, пожалуйста, примерчик (желательно на Delphi - ближе всего, можно со вставками Asm).
Найти процесс в памяти смогу, нужное смещение тоже, замену нужного кода на Jmp тоже, а вот как подобрать адрес для Jmp не догадаюсь (как вычислить @Metka, т.е. как будет выглядеть на Delphi вставка длинного Jpm на нужное место?) (искать некогда, экспериментировать тоже - время сильно жмет - вот обратился к Вам).
И так, как написать? (как вычислить "Metka" ("назад"-это просто смещение, по кот. мы вставляли Jmp?) :
begin
....
Asm
Metka:
pushad
lea ax, [ebp-12]
(дальше понятно)
jmp <назад>
End;
....
end;


P.S.: Извините, если не внятно что-то пояснил - голова не соображает уже, несколько дней подряд трассирую процедуру превращения ответного кода в нужный вид (сложные преобразования).
Зараннее благодарен.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 21 марта 2007 16:18
· Личное сообщение · #2

Sasha73 пишет:
вставка длинного Jpm на нужное место?

Ты плохо себе представляешь механизм управления памятью в WinNT (и даже в Win9x так нельзя).
Кроме того, плохо знаешь Асм.

Существуют безусловные переходы:
- короткие (смещение кодируется в знаковый байт),
- длинные (смещение знаковое целое (WORD/DOWRD))
- и дальние (сегмент : смещение знаковое целое).

Так вот винда каждому процессу выделяет виртуальные смещения от 0 до максимального значения DWORD (разумеется, большая часть этих смещений процессу недоступна).
Выходит, что любые короткие и длинные переходы укажут на виртуальное пространство текущего процесса.
Дальние переходы под форточками тоже ничего не дадут (процессы разделяются не по сегментам, а через страничную адресацию).

Так что сама идея бредовая.
Можно делать инжект, можно патч, можно использовать API, но никак не прямыми jmp.

Для понимания вопроса рекомендую прочесть:
Джеффри РИХТЕР "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows" (ссылка есть в топе про электронные книги).

-----
Всем привет, я вернулся




Ранг: 1.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 марта 2007 16:00
· Личное сообщение · #3

Спасибо за разяснение.
Bitfry пишет:
Кроме того, плохо знаешь Асм.

Да, уже забыл. В ДОСе все гораздо проще было.
Bitfry пишет:
процессы разделяются не по сегментам, а через страничную адресацию

Так я и подозревал, потому и спросил можно ли.
Bitfry пишет:
Можно делать инжект, можно патч, можно использовать API

Какой из методов проще будет? Можно, если не тяжело, примерчик, хотя бы кратко-блоксхемно?
Не осталось времени литературу изучить!


 eXeL@B —› Вопросы новичков —› Как программно сбросить состояние регистров и памяти опр. процесса в опр. месте?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати