Сейчас на форуме: tyns777, cppasm, dutyfree (+8 невидимых)

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

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

Создано: 13 июля 2017 02:00
· Личное сообщение · #1

Попытался открыть RAM запущенной программы-жертвы в WinHex, надо-то было найти патерн и изменить его. Но защита программы спалила запуск WinHex-а и закрыла свою программу.
Выяснил, что запуск WinHex определяется защитой по Caption("WinHex") и по ClassName ("WHXMDI"). Если хоть один из этих параметров есть, то защита валит программу.
Хочу сделать лоадер под WinHex, на Делфи. Чтобы при запуске подменить Caption и ClassName.
С Caption, проблем нет:
Code:
  1. SetWindowText(FindWindow(nil, 'WinHex'), 'BinHex ');

А вот с ClassName, не знаю как это сделать.
Подскажите. пожалуйста, если кто знает решение.



Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 13 июля 2017 08:50
· Личное сообщение · #2

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





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

Создано: 13 июля 2017 18:37 · Поправил: Kuzya69
· Личное сообщение · #3

Ну такое я уже проделывал, хотелось-бы узнать метод не меняя сам EXE. Тоесть делать это с помощью лоадера, при запуске WinHex.
Я хотел сказать, хочется знать универсальный метод, без поиска паттернов, и чтоб подходил к любой версии программы, да и не только к WinHex.




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

Создано: 13 июля 2017 19:01
· Личное сообщение · #4

Kuzya69

Давайте вместе подумаем. Вам нужно изменить некоторые параметры приложения. Очевидно что некоторые(текст) могут быть изменены в произвольный момент времени, некоторые не могут быть изменены(класс етц), так как к примеру свойства обьекта задаются при его создании.

Поэтому очевидно что параметры/свойства которые далее изменить нельзя должны быть заданы на том этапе работы апп, когда их возможно изменить. В данном случае это создание обьектов.
Как отловить это событие - мониторить вызов соотвествующего сервиса/апи. Как это сделать - зависит от конкретного тз.

-----
vx




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

Создано: 13 июля 2017 19:41
· Личное сообщение · #5

Как я понял, надо отлавливать момент создания структуры WNDCLASS, и после ее создания подменять переменную lpszClassName. Ну или отлавливать API RegisterClass, по ее параметру находить WNDCLASS, ну и так-же как в первом случае?



Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 13 июля 2017 20:06
· Личное сообщение · #6

Kuzya69, ну скриншот же




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 14 июля 2017 10:17
· Личное сообщение · #7

кто вообще додумался (и главное зачем) защищаться от WinHex?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 14 июля 2017 10:56 · Поправил: VOLKOFF
· Личное сообщение · #8

Ну кому-то же пришло в голову
Kuzya69 пишет:
открыть RAM запущенной программы-жертвы в WinHex

они нашли друг друга



Ранг: 10.2 (новичок), 7thx
Активность: 0.020
Статус: Участник

Создано: 14 июля 2017 11:17
· Личное сообщение · #9

Элементарно через Loader:
1) Запускаем WinHex через CreateProcess с флагами NORMAL_PRIORITY_CLASS | CREATE_SUSPENDED.
2) Патчим нужное (как руками в HEX-редакторе, только в памяти) (VirtualProtectEx & WriteProcessMemory)
3) ResumeThread



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

Создано: 14 июля 2017 13:00 · Поправил: Kuzya69
· Личное сообщение · #10

Isaev пишет:
кто вообще додумался

Не знаю, протектор. RDGPackerDetector076 и ProtectionID685 молчат как партизаны. Но судя по тому что для предыдущих версий программы использовался VMProtect, то скорее всего и в этот раз он, родимый.
gajemuxi пишет:
Патчим нужное (как руками в HEX-редакторе, только в памяти

Не, это не мой метод, нужно научить лоадер самостоятельно находить имя класса.



Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 14 июля 2017 14:19
· Личное сообщение · #11

Уже многим походу интересно что это за аццкий такой софт?

Kuzya69 пишет:
нужно научить лоадер самостоятельно находить имя класса

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



Ранг: 160.9 (ветеран), 1thx
Активность: 0.050
Статус: Участник

Создано: 14 июля 2017 14:57
· Личное сообщение · #12

Kuzya69 пишет:
Не, это не мой метод, нужно научить лоадер самостоятельно находить имя класса.

Ну так хукай функции и обрабатывай.



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

Создано: 14 июля 2017 15:49 · Поправил: Kuzya69
· Личное сообщение · #13

VOLKOFF пишет:
увидеть функцию, создающую окно и параметры, которые она принимает.

Так скорее всего, не создающую окно, а функцию, регистрирующую класс, надо хукать ?




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

Создано: 14 июля 2017 19:26
· Личное сообщение · #14

Kuzya69

У вас не работает сеть или гугл..

--> Link <--

Первый аргумент. Есчо спросите какой нибудь бред.

-----
vx





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

Создано: 15 июля 2017 10:52 · Поправил: DenCoder
· Личное сообщение · #15

Kuzya69 пишет:
Так скорее всего, не создающую окно, а функцию, регистрирующую класс, надо хукать ?


Можно функу по ссылке difexacaw хукать, тогда надо класс подменять, свой создавать на обработке хука. Но перед нужно узнать значение атома, ведь регистрация класса окна возвращает его, чтобы передать в CreateWindowEx(A | W). Как узнать по атому название класса? Надо вызывать GetClassInfo/GetClassInfoEx. Хотя можно и по адресам возврата в стеке выявить, что именно то нужное окно вызывается.

А можно только RegisterClass(A | W)/RegisterClassEx(A | W) хукнуть, чтобы подменить название класса сразу и только.

-----
IZ.RU


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

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

Создано: 15 июля 2017 14:29 · Поправил: Kuzya69
· Личное сообщение · #16

DenCoder пишет:
Можно функу по ссылке difexacaw хукать, тогда надо класс подменять, свой создавать на обработке хука.
.....
А можно только RegisterClass(A | W)/RegisterClassEx(A | W) хукнуть, чтобы подменить название класса сразу и только.

Ну, вот это я и пытался выяснить. Я никак не мог понять, как задать имя класса для функции CreateWindow, который еще не создан-зарегистрирован.




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

Создано: 15 июля 2017 15:47
· Личное сообщение · #17

DenCoder

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

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

-----
vx




Ранг: 33.4 (посетитель), 24thx
Активность: 0.020
Статус: Участник

Создано: 15 июля 2017 23:44 · Поправил: redlord
· Личное сообщение · #18

Kuzya69
рихтера + msdn читани, дебаггером походи
если не поможет - мотор клерка скомпЕлируй




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

Создано: 17 июля 2017 16:58
· Личное сообщение · #19

difexacaw пишет:
Поставить HW точку останова на нужную функу, и обработать.


У каждого своё кунфу ) Но в данном случае для выполнения описанной задачи, в контексте желаемого тс достаточно джампов на чуть умелонаписанный "хэндлер" хуков

По универсальности - это как и пытались найти общий алгоритм решений диофантовых уравнений. Нет такого! - Это было доказано Матиясевичем в 1970 г. Также и вообще - нет универсального алгоритма и никогда не будет! К каждой задаче индивидуальный подход!

-----
IZ.RU



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


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