Сейчас на форуме: asfa, _MBK_, Adler (+8 невидимых)

 eXeL@B —› Вопросы новичков —› Проблема с VirtualProtect под Windows7
Посл.ответ Сообщение


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 14 января 2013 23:55
· Личное сообщение · #1

Успешно пользовался примерно таким кодом под WinXP:
Code:
  1. Var oldprt:Cardinal;
  2.  
  3. VirtualProtect(Pointer($440200),4,PAGE_READWRITE,oldprt);
  4. dword(Pointer($440200)^):=$90909090;
  5. VirtualProtect(Pointer($440200),4,oldprt,oldprt);


На Windows7 x86 код вызывает исключение. Код выполняю в DLL которая вызывается жертвой (EXE).



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 15 января 2013 00:03
· Личное сообщение · #2

1. неплохо было бы добавить обработку результатов вызовов функций VirtualProtect + GetLastError
2. Вы уверены в существовании адреса 0x440200? в целевом ехе может присутствовать релокация, которой в win 7 ЕХЕ таки подвержены.
3. создаются ли потоки в dll_main?
4. можно попробовать сместить адрес 0x440200 на начало страницы

-----
все багрепорты - в личные сообщения


| Сообщение посчитали полезным: ToBad


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 15 января 2013 00:21
· Личное сообщение · #3

HandMill конкретный адрес указан для примера, та же самая длл отлично работает на WinXP, то есть всё патчит. В ехе релоки присутствуют, но я патчу не в код содержащий их.



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 15 января 2013 00:27 · Поправил: HandMill
· Личное сообщение · #4

ToBad пишет:
В ехе релоки присутствуют, но я патчу не в код содержащий их.

какая разница если Вы сами говорите что ЕХЕ подвержен релокации и при этом адрес хардкодится вместо того что б считать от image base?

рекомендация: Вы до сих пор не обработали все перечисленные мною пункты, хотя бы ошибки вызовов VirtualProtect как-то обработайте

-----
все багрепорты - в личные сообщения




Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 15 января 2013 01:20
· Личное сообщение · #5

ToBad
ну я же вам тогда не просто так писал

Code:
  1. Hndl:= GetModuleHandle(nil);
  2. offset:= Hndl + $1BF213;
  3.  VirtualProtect(Pointer(offset),4,PAGE_READWRITE,oldprt);


| Сообщение посчитали полезным: ToBad


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 15 января 2013 02:50
· Личное сообщение · #6

HandMill пишет:
какая разница если Вы сами говорите что ЕХЕ подвержен релокации и при этом адрес хардкодится вместо того что б считать от image base?


SReg пишет:
ну я же вам тогда не просто так писал


Простите, туплю... Сейчас посмотрел под отладчиком в Win7 (комп чужой, не мог ранее), действительно адреса не те, нужно учитывать image base...




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 15 января 2013 04:45
· Личное сообщение · #7

Всё отлично получилось, спасибо за помощь! Хотя опять вылезли какие то особенности семёрки, которых я не знаю.
У меня патч проходит во многих функциях. Ранее я ставил страничку на запись из первой используемой функции, а возвращал на место в последней после нужного патча.
Теперь так не работает. В пределах каждой функции я должен установить PAGE_READWRITE, пропатчить и вернуть назад. Если этого не сделать - вылетает. GetLastError после VirtualProtect отлавливаю - ошибок нет.




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 15 января 2013 08:17
· Личное сообщение · #8

Может лучше ставить EXECUTEREADWRITE. При выполнении кода с чтением и записью запросто может вылететь эксепшн.

| Сообщение посчитали полезным: ToBad

Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 15 января 2013 08:54
· Личное сообщение · #9

Или предварительно заморозить все потоки перед патчем




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 15 января 2013 10:56
· Личное сообщение · #10

Или предварительно заморозить все потоки перед патчем

Или патчить из DllMain.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 15 января 2013 15:55
· Личное сообщение · #11

Код дллмейн выполняется в 1 потоке при загрузке длл?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 15 января 2013 16:30
· Личное сообщение · #12

Ну вообще при вызове DllMain захватывается LoaderLock, так что теоретически на ЕП длл может только 1 поток топтаться. А вот что патчит-вопрос. Скажем, в экспорте длл или в ехе вполне могут топтаться в это время другие потоки.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 15 января 2013 16:52
· Личное сообщение · #13

Специфика такова, что из дллмейн я ставлю только первый инжект на мою функцию и всё. Далее когда программа туда заруливает, я в функции возвращаю на место то, что патчил для перехода, делаю всё что нужно и устанавливаю переход на следующую мою функцию в которой происходит всё тоже самое. В последней возвращаю на место атрибуты страницы, и всё, меня там как бы не было...

Nightshade пишет:
Может лучше ставить EXECUTEREADWRITE.


Да, это оно самое! С таким атрибутом я могу делать как описал выше и не смыкать VirtualProtect несколько раз в одной функе. Проблема решена!

Спасибо!

p.s. Тему пока не закрываю, проверю всё сперва, вдруг всплывёт что-то ещё.


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


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