eXeL@B —› Крэки, обсуждения —› Опкод EBFE в начало системной функции |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 29 июля 2005 18:08 · Личное сообщение · #1 Господа,прошу помочь мне разобраться в следующей ситуации: необходимо разместить опкод EBFE в начало системной функции LoadLibraryA в чужом процессе,чтобы таким образом отследить обращение чужого процесса к данной функции и получить тем самым некоторую информацию (имя загружаемой библиотеки,обратный адрес функции).Собственно в чём проблема...
...так вот функция VirtualProtectEx возвращает C0000018 (STATUS_CONFLICTING_ADDRESSES) и естесственно вся остальная констукция кода тоже рушится . Хотелось бы узнать,почему так происходит ? Т.к. такая же кодовая операция только с адресом,к примеру,точки входа проходит без проблем,т.е. на EP размещается необходимый опкод. Читал в статьях Ms-Rem'а про "сплайсинг" API-функций,в которых он говорит,что перехват API,находящихся в чужом процессе, - весьма неудобная штука.Следовательно любознательный вопрос - почему это так (неудобно) ? Далее он приводит просто монструозные коды внедрения собственных библиотек в чужой процесс путём создания удалённого процесса... Собственно у меня дилемма - как поступить,если мне всего лишь необходимо узнать имя загружаемой библиотеки и обратный адрес функции LoadLibraryA,загружающей эту библиотеку . Или как всё-таки заставить вышеприведённый код работать без ошибок ? Весьма надеюсь на любые предложения,советы,вопросы с вашей,господа,стороны... ----- the Power of Reversing team |
|
Создано: 29 июля 2005 18:39 · Личное сообщение · #2 DillerInc пишет: разместить опкод EBFE в начало системной функции LoadLibraryA в чужом процессе,чтобы таким образом отследить обращение чужого процесса к данной функции и получить тем самым некоторую информацию (имя загружаемой библиотеки,обратный адрес функции) бред какой-то, с таким-же успехом там можно размещать и 90h (тоже весьма информативная комманда) и т.д. |
|
Создано: 29 июля 2005 18:44 · Личное сообщение · #3 DillerInc пишет: EBFE в начало системной функции LoadLibraryA Патчить системные функции можно только из Ring-0, а так как прога работает в Ring-3, то винда не позволит проге из Ring-3 патчить системные ф-ции. Т. е или нужно писать драйвер ring-0 либо искать альтернативные пути. ----- Research is my purpose |
|
Создано: 29 июля 2005 18:49 · Личное сообщение · #4 |
|
Создано: 29 июля 2005 19:05 · Поправил: AlexZ · Личное сообщение · #5 DillerInc пишет: VirtualProtectEx(processInfo.hProcess, ProcAddress, 2, PAGE_EXECUTE_READWRITE, @Temp_Protect); ReadProcessMemory(processInfo.hProcess, ProcAddress, @OriginalData, 2, @nBytesRead); WriteProcessMemory(processInfo.hProcess, ProcAddress, @Code, SizeOf(WORD), @nBytesWritten); VirtualProtectEx(processInfo.hProcess, ProcAddress, 2, Temp_Protect, @Temp_Protect); Или вместо @ поставь ptr(). Возможно в этом причина. ----- Я медленно снимаю с неё UPX... *FF_User* |
|
Создано: 29 июля 2005 19:33 · Личное сообщение · #6 Error_Log пишет: Патчить системные функции можно только из Ring-0, а так как прога работает в Ring-3, то винда не позволит проге из Ring-3 патчить системные ф-ции ...примерно подобное объяснение я и собирался услышать... AlexZ пишет: Или вместо @ поставь ptr(). Возможно в этом причина ...наврядли - я же писал выше,что подобный код,только использующий другой адрес,к примеру, $41CCD8B (секция кода чужого процесса), выполняется на ура. Error_Log пишет: Поищи альтернативный способ ...да,а что делать - придётся думать... Однако хочется услышать ещё какие-нибудь мнения (в частности по поводу возможного альтернативного способа). ----- the Power of Reversing team |
|
Создано: 29 июля 2005 20:33 · Личное сообщение · #7 |
|
Создано: 29 июля 2005 20:57 · Личное сообщение · #8 Error_Log пишет: Патчить системные функции можно только из Ring-0, а так как прога работает в Ring-3, то винда не позволит проге из Ring-3 патчить системные ф-ции Бред сивой кобылы. Error_Log пишет: Не вкуре зачем это тебе понадобилось, но идея патчить системные ф-ции не самая хорошая Идея достаточно хорошая. DillerInc Почитай это www.rsdn.ru/article/baseserv/IntercetionAPI.xml |
|
Создано: 30 июля 2005 00:07 · Личное сообщение · #9 Ara Спасибо за ссылку (я,кстати,с этим материалом уже встречался как-то). Я заметил,что во всех этих статьях делается упор именно на внедрение своего кода через подгружаемую библиотеку,которая размещается в создаваемом удалённом потоке целевого процесса, т.е. делается упор на единственно возможный вариант сплайсинга API-функций. Это походу значит,что мой код,приведённый выше,в принципе неработоспособен...а жаль.Поправьте меня,если я ошибаюсь. Я,кстати,начинаю прикидывать,а не попробовать бы этак динамически собрать необходимую информацию при помощи функции GetThreadContext... ----- the Power of Reversing team |
|
Создано: 30 июля 2005 00:23 · Личное сообщение · #10 |
|
Создано: 30 июля 2005 00:45 · Личное сообщение · #11 |
|
Создано: 30 июля 2005 00:58 · Личное сообщение · #12 В винде есть такие средства для отладки. Вот ссылка в мсдн на пример главного отладочного цикла: [url=http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ debug/base/writing_the_debugger_s_main_loop.asp][/url] Установка/снятие бряков - через WriteProcessMemory. По отладочным событиям будешь ловить исключения и делать все что тебе нужно. Метод с лоадером куда удобнее, т.к. исчезает рутина с коммуникациями между процессами, не все процессы хотят так отлаживаться, и вообще, находясь в адресном пространстве нужного процесса ты - бог. |
|
Создано: 30 июля 2005 00:59 · Личное сообщение · #13 DillerInc пишет: Ты имеешь в виду использование точек останова,установленных с помощью API-функций ? Да, именно. Посмотри еще ЭТУ статью, довольно доступно все изложено и сорсы с комментариями. |
|
Создано: 30 июля 2005 12:06 · Личное сообщение · #14 ну и тут я импользовал эту технику, если хочешь смотри, код на С++: http://www.exelab.ru/f/files/9805_unGHF.zip |
|
Создано: 31 июля 2005 17:08 · Поправил: DillerInc · Личное сообщение · #15 arnix Э...а можно,пожалуйста,исходник ? Ara Весьма познавательная между прочим статья - спасибо...но я думаю,что придётся побрезговать использованием опкода CC, т.к. я имею дело с протектором,который вполне может применять какие-нибудь антиотладочные приёмы. А вообще я сейчас в полном смятении с этим делом . Нашёл типа временный способ нахождения команды CALL [_LoadLibraryA] :
Собственно как же функционирует эта GetThreadContext ? Такое чувство,что она возвращает контекст какого-то другого потока целевого процесса . ----- the Power of Reversing team |
|
Создано: 31 июля 2005 20:39 · Личное сообщение · #16 |
|
Создано: 31 июля 2005 21:26 · Личное сообщение · #17 |
|
Создано: 31 июля 2005 21:26 · Личное сообщение · #18 |
|
Создано: 31 июля 2005 22:48 · Личное сообщение · #19 Прежде всего спасибо за участие . Ara пишет: что именно ты хочешь получить ...значит,распаковка программы,защищённой протектором,происходит в адресном пространстве определённой подгружаемой DLL,поэтому для того,чтобымы были в состоянии влиять на ход распаковки,нам необходимо знать адрес,по которому эта DLL загрузилась.А так как адрес загрузки DLL - вещь непостоянная (по крайней мере в данном случае), то нам необходимо узнавать его динамически. Следовательно сейчас я стараюсь найти в коде конструкции типа:
Найдя по опкоду такое место (команда call [_LoadLibraryA] ),надо как-то на него "встать", чтобы функция GetThreadContext нормально прочитала значение регистра ESP, на вершине которого должна быть строка с именем актуальной библиотеки,ну а далее можно будет и адрес загрузки узнать таким же макаром. Приложил проблемные места кода - надеюсь общий ход мыслей будет ясен. 64fc_Source.txt ----- the Power of Reversing team |
|
Создано: 31 июля 2005 23:07 · Личное сообщение · #20 |
|
Создано: 01 августа 2005 00:41 · Личное сообщение · #21 Ara пишет: Хм, вот теперь мне эта идея тоже кажется бредовой... ...обоснуй,пожалуйста ... Ara пишет: А что ты хочешь получить В ЦЕЛОМ? ...ну,а что здесь можно вообще получить - распакованный исполняемый файл. P.S. Может ты что-то неправильно понял из моих объяснений ? Протектор использует подгружаемую DLL, чтобы по мере надобности распаковывать исполняемый файл (в основном идёт декриптование названий функций). ----- the Power of Reversing team |
|
Создано: 01 августа 2005 00:50 · Личное сообщение · #22 |
|
Создано: 01 августа 2005 00:56 · Личное сообщение · #23 |
|
Создано: 01 августа 2005 11:30 · Личное сообщение · #24 |
|
Создано: 01 августа 2005 14:40 · Поправил: arnix · Личное сообщение · #25 DillerInc пишет: Э...а можно,пожалуйста,исходник ? хм, я дyмал он там есть... вот держи: 2a00_unGHF_0.3_with_src.rar |
|
Создано: 02 августа 2005 16:32 · Личное сообщение · #26 В общем,есть задумка создать некое подобие универсального распаковщика. Mario555 пишет: что за прот ... Visual Protect http://www.visagesoft.com/products/vp/index.php . Mario555 пишет: ну поймаешь програмно загрузку, дальше-то что ? ...как я уже говорил,восстановление названий системных функций происходит в специальной библиотеке протектора.Узнав базовый адрес её загрузки,мы сможем использовать его как стартовую точку для поиска определённых байт,в районе которых мы будем влиять на ход распаковки. freeExec пишет: GetModuleHandle("name_of_Dll.dll"); ...да,кстати,действительно . Только если я не ошибаюсь,данная функция возвращает дескрипторы тех модулей,которые загружены в вызывающий процесс,а как же поступить с чужим процессом ? ----- the Power of Reversing team |
|
Создано: 02 августа 2005 19:13 · Личное сообщение · #27 DillerInc пишет: Только если я не ошибаюсь,данная функция возвращает дескрипторы тех модулей,которые загружены в вызывающий процесс,а как же поступить с чужим процессом ? дык про внедрение в чужой процесс написано много, читай ;) а в твоём случае (написание динамического унпакера) я вообще не понимаю в чём проблема, ведь загрузка библы в отлаживаемый процесс является отладочным событием. |
|
Создано: 02 августа 2005 20:45 · Личное сообщение · #28 |
|
Создано: 05 августа 2005 00:21 · Личное сообщение · #29 Ну и задолбался же я с этим кодом... Ближе к делу - по совету Mario555 я стал использовать наиболее подходящий,на мой взгляд,вариант. А именно:
...так вот эта долбаная функция GetModuleBaseName ни под каким соусом не хочет возвращать мне имя модуля,возвращая всё время нуль . В чём может быть проблема ? ----- the Power of Reversing team |
|
Создано: 05 августа 2005 16:43 · Личное сообщение · #30 Ara пишет: Бред сивой кобылы Гм... Вот прикольно было бы если любая прога могла в ядро что попало писать... Кста есть такая прога Chameleon Clock, так там прикол как раз в том, что прога умышленно делает попытку записи в ядро, при этом управление передается SEH-обработчику, а он передает его той ветке программы, которая работает в незареганой версии. Теперь обоснуй свое мнение... ИМХО писать что либо в область ядра не так просто... ----- Research is my purpose |
. 1 . 2 . >> |
eXeL@B —› Крэки, обсуждения —› Опкод EBFE в начало системной функции |