PDA

Просмотр полной версии : Исправление раздела импорта у my.exe



Keith
17.02.2005, 02:20
Как корректнее сделать исправления раздела импорта у exe'шника? Нужно чтобы работало для Win9x/2000/XP. Может у кого-нибудь есть пример кода? В Интернете не нашел.

Eugie
17.02.2005, 16:44
Еще раз советую посмотреть статью:
http://www.rsdn.ru/article/baseserv/apicallsintercepting.xml

Keith
24.02.2005, 03:14
Я некорректно задал вопрос. Расширено моя задача звучит так:
Нужно, чтобы некоторые процессы создавались с перехватом некоторых API-функций, а некотрые как обычно. При этом, если нажата определенная комбинация клавиш, то в активном процессе(тот у кого в данный момент окно активно) состояние перехвата API менялось бы на противоположное, т.е. если в момент нажатия клавишь перехват осуществлялся, то отменить его, иначе — начать.

Вот, что я придумал:
Составить таблицу(храниться в файле, загружается в память при загрузке my_prog.exe):
prog1.exe +
prog2.exe +
prog3.exe +
prog4.exe -
prog5.exe -
prog6.exe -

1. Запускаем my_prog.exe при старте Windows. Он сразу же вешает хук на все процессы и перехватывает(меняя таблицу импорта) у них СreateProcess(). Так же он ловит нажатие определенной комбинации клавиш(глобальный хоткей).
2. При создании кем-либо процесса входящего в мою таблицу и отмеченного "+", вызываем CreateProcess() с флагом CREATE_SUSPENDED, после чего передаем в my_prog.exe идентификатор первичного потока создаваемового процесса. Внутри my_prog.exe мы вешаем на него хук(и исправляем таблицу импорта для нужных API функций), после чего вызываем ResumeThread().
3. Если нажата определенная комбинация клавиш(тот самый глобальный хоткей) и текущее активное окно десктопа является окном процесса, находящегося в моей таблице, то: если перехват API функций в этом процессе производится, то прекращаем его, иначе — начинаем перехват.

Фу. Надеюсь понятно объяснил. Я сам сильно начинающий и многого не понимаю, так что если мой вариант решения поставленной задачи глуп и нелогичен, то с огромным удовольствием выслушаю ваши наброски и идеи. Если же мой вариант вполне удовлетворителен и не должен вызывать особых проблем в реализации, то хотелось бы узнать следующее:
а) как лучше передавать идентификатор процесса отмеченного "+" в my_prog.exe? (это нужно для того, чтобы только моя программа контролировала время жизни хуков)
б) как узнать имеет ли поток(threadId) окно? Может быть можно перебирать все окна в системе, и узнавать их threadId?

зы Нужно, чтобы всё работало в Win9x/2000/XP.

Eugie
28.02.2005, 19:05
Если я правильно понял, что Вы хотите сделать, то замечания будут следующие:

1) Перехват при помощи хуков по определению работает только для GUI потоков/процессов, т.е. у них должна быть очередь сообщений. Более того, сообщения должны в нее поступать, т.к. реальное подключение глобального хука при выборке сообщения из очереди. Очевидно, что этот механизм не универсальный, и, например, не будет работать для консольных приложений.

2) Механизм обмена между my_prog.exe и запускаемой программой излишен. Если глобальный хук установлен, подключение hook DLL для GUI-процессов происходит автоматически. Правку таблицы импорта нужно совместить с загрузкой DLL - просто вызываете свою ReplaceIAT в DllMain на DLL_PROCESS_ATTACH. Здесь же проверяете, нужно ли на самом деле подменять IAT.

3) Включать/выключать подмену IAT можно, как Вы предложили, по hotkey. Ловить его можно тем же хуком (типа WH_GETMESSAGE) - просто в hook proc отслеживаете сообщение типа WM_KEYDOWN с заданной клавиатурной комбинацией и подменяете/восстанавливаете IAT.

4) Список процессов лучше хранить не в файле, а в реестре. Создайте в HKCU\Software свой ключ и храните там всю информацию. Все процессы смогут ей воспользоваться.

Вот так, в общих чертах. А зачем все это надо, если не секрет? ;)