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

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

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 15 марта 2016 05:19 · Поправил: Kuzya69
· Личное сообщение · #1

Просвятите, пожалуйста.
В момент вызова "kernel32.LoadLibraryA" для "USER32.dll", код жертвы, который я собираюсь патчить, уже готов для изменения (распакован).
Собираюсь писать инлайн, но в голове каша. При поиске в гугле, не попадаются примеры с такой задачей.
То-есть я хочу на ЕП пропатчить функцию "LoadLibraryA", чтобы она переходила в мой код. И когда я увижу, что аргумент равен "USER32.dll", то сразу пропатчу жертву, и верну украденные байты обратно в "LoadLibraryA".
Как мне определить базовый адрес, по которому загрузилась "kernel32.dll", чтобы воспользоваться ее АПИ-функциями?
Не уж-то начинать с адреса 0х80000000 и с шагом 0х1000, идти вниз по адресам, и все время проверять имя библиотеки, на соответствие "kernel32.dll"?
И как тогда обрабатывать варианты "Access violation", ведь мой код еще ничего не будет знать о загруженных в жертву библиотеках.



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 15 марта 2016 05:30
· Личное сообщение · #2

Не нужно патчить функцию в библиотеке kernel32.dll, в теле жертвы есть же переходник, через который вызывается тот самый LoadLibraryA, этот переходник и нужно патчить. А вообще мест для инлайна может быть сколько угодно, бери любое понравившееся и ставь свою заглушку туда, да не забудь потертый код восстановить после прыга.

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

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 15 марта 2016 05:35 · Поправил: Kuzya69
· Личное сообщение · #3

Тот самый LoadLibraryA, вызывается через "Retn 0", внутри обработчика Пи-кода. Но это пол-беды. На ЕП, этот код еще не готов, а готов он только после третьего слоя расшифровки. Это Винлиценз с Темидой. Хотя тут я наверное и не прав, Темида скорее всего меня поймает. Наверное придется патчить LoadLibraryExW.



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 15 марта 2016 07:24
· Личное сообщение · #4

Если мне не изменяет память, у фимы свои прототипы GetProcAddress, LoadLibraryA, GetModuleHandle и т.д. Во время распаковки, она не обращается к данным виндовым функциям.




Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 15 марта 2016 07:58 · Поправил: Rainbow
· Личное сообщение · #5

Kernel Image from PEB:

mov eax, dword ptr fs:[30h]
mov eax, dword ptr ds:[eax+0Ch]
mov eax, dword ptr ds:[eax+1Ch]
mov eax, dword ptr ds:[eax]
mov eax, dword ptr ds:[eax+08h]

NTDLL Image from PEB:

mov eax,dword ptr fs:[30h]
mov eax,dword ptr ds:[eax+0ch]
mov eax,dword ptr ds:[eax+0ch]
mov eax,dword ptr ds:[eax]
mov eax,dword ptr ds:[eax+18h]

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

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 15 марта 2016 15:48 · Поправил: Kuzya69
· Личное сообщение · #6

TryAga1n пишет:
... у фимы свои прототипы GetProcAddress, LoadLibraryA, GetModuleHandle и т.д. Во время распаковки, она не обращается ...
Все правильно, но именно user32.dll у меня она грузит через LoadLibraryA, все остальное через прототипы.
Rainbow
А вот это хорошо, вечерком проверю. Сейчас некогда.
Кстати столкнулся, с эксепшоном при записи в область dll, придется наверное еще атрибуты доступа сменить.




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

Создано: 15 марта 2016 16:55 · Поправил: DenCoder
· Личное сообщение · #7

Kuzya69 пишет:
Кстати столкнулся, с эксепшоном при записи в область dll, придется наверное еще атрибуты доступа сменить.

Ну как же Вы могли не знать, что без этого
Code:
  1. DWORD fOldProtect;
  2. VirtualProtect(addr, size, PAGE_EXECUTE_READWRITE, &fOldProtect);
  3.  
  4. //code for change bytes from addr to addr + size
  5. //...
  6.  
  7. FlushInstructionCache(GetCurrentProcess(), addr, size);

в 99% изменяться код, так чтоб работал, не будет.
1% - что изменится, если после самораспаковки(что сейчас не Ваш случай) не вернулись старые атрибуты. Но если не под дебагом это делается, то кэш обязательно сбрасывать надо.

-----
IZ.RU





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 15 марта 2016 17:16
· Личное сообщение · #8

DenCoder пишет: кэш обязательно сбрасывать надо
на pc (86,64) - нет

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 15 марта 2016 17:20
· Личное сообщение · #9

Про атрибуты знал, просто дебагер в заблуждение ввел, он то меняет эти атрибуты приспокойно, если руками байты переписывать.
А вот про кэш первый раз слышу. Вроде когда лоадер писал, не требовалось этого.
Ну и наверное потом, после подмены, обратно восстановить аттрибуты? А кэш кстати перед сбросом не надо сохранять?
Не пинайте, первый раз инлайн делаю. Просто не хочется лоадер с задержкой писать. Да и один файл куда красивее выглядит.




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

Создано: 15 марта 2016 17:39 · Поправил: DenCoder
· Личное сообщение · #10

ajax пишет:
на pc (86,64) - нет

да ну???

Оно без этого не работает сразу, сколько раз замечено было... ) Но хотя тут и от проца зависит, и от nt-модуля, и от hal...

Когда начинал фрилансить, попадался мне проектик. Надо было заставить исчезать процесс игрового клиента из списка диспетчера задач сразу. Вот я тогда не знал совсем ещё, что дело во FlushInstructionCache()

Из моих ранних проектов, когда сел за написание своего апи-логгера, тоже раз на раз не приходилось. Бывало сразу запишется и всё воркает, а бывало - не сразу. Одна особенность была - когда процесс только ещё создан, создан с флагом CREATE_SUSPENDED, неинициализирован и находится в состоянии SUSPENDED, FlushInstructionCache() даже в цикле приходилось крутить до появления признаков удачного изменения. ) Но правда вмешательства были из вне, из другого процесса.

Добавлено спустя 2 минуты
Kuzya69 пишет:
А кэш кстати перед сбросом не надо сохранять?

Даже и не то, чтобы нет. Я даже и не видел такой возможности

Добавлено спустя 28 минут
Сброс кэша - это чтобы процессор увидел изменения. Как там оно на уровне драйверов реализовано, я пока так и не знаю. Но в моих гипотезах одно из 2х должно иметь место с кешем:
1) Либо кеш никак не сохранятся для каждого процесса. Тогда в силу его ограниченного размера есть теоретическое кол-во процессов, и теоретическое кол-во модулей, такое что суммарный прогоняемый код превышает размер кеша. Если эта гипотеза верная, то при этих условиях этой функцией даже и не понадобится пользоваться.
2) Либо при переключениях между процессами кеш всё-таки сохраняется. Тогда эта функция нужна каждый раз.

Этот момент надо будет для себя выяснить, когда найдётся время... Хотя, может, здесь кто-то об этом знает

-----
IZ.RU





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 15 марта 2016 18:34
· Личное сообщение · #11

Rainbow пишет:
Kernel Image from PEB

способ хороший, но насколько я знаю, в новых системах таким образом получится база kernelbase.dll




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 15 марта 2016 19:00 · Поправил: ajax
· Личное сообщение · #12

DenCoder
коммент внизу ссылки msdn по искомой функе. вообще, всякие моменты мб. в контексте своего процесса - пофик.
патчерам-лоадерам тоже, IPC отнюдь не множественный. тут деталюшки, если возникнет желание
--> System Programming Guide, Part 1 <--

-----
От многой мудрости много скорби, и умножающий знание умножает печаль


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


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

Создано: 15 марта 2016 20:55
· Личное сообщение · #13

хм... интересная тонкость...

Добавлено спустя 2 минуты
Как тогда это объяснить? ))

DenCoder пишет:
Одна особенность была - когда процесс только ещё создан, создан с флагом CREATE_SUSPENDED, неинициализирован и находится в состоянии SUSPENDED, FlushInstructionCache() даже в цикле приходилось крутить до появления признаков удачного изменения. ) Но правда вмешательства были из вне, из другого процесса.


Одна тонкость была ещё - тогда у меня стоял ещё проц Pentium 3

-----
IZ.RU



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


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