Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Общие вопросы > Как избавиться от перехвата ф-ций АПИ |
Автор: Romikgy 31.8.2006, 11:18 |
Если я не туда запостил , извеняйте , вроде такой вообще нет ветки, хотя могу и ошибаться ![]() Смысл такой , вирус завелся, перехватывает 3 ф-ции апи FindFirstFile, Module32First, RegEnumValue, сам он сделан в dll , как мне программно (самому написать) или другим ПО, избавится от этой dll ? Тоесть убрать ее из запуска, вирус (хотя возможно это трой) этот ничем не видится ![]() |
Автор: Quadr0 31.8.2006, 11:31 |
... |
Автор: Yanis 31.8.2006, 11:36 |
Потому что это крутая прога ![]() Там на закладке параметры поиска есть опции "Блокировать работу RootKit User-Mode" и "Блокировать работу RootKit Kernel-Mode". Попробуй их включить. AVZ сразу заволнуется, что типа это вредно для системы... Не обращай внимания, просто потребуется перезагрузка на всякий случай. Возможно после поиска перехват функций вирём деактивируются. А ещё поставь себе ProcessXP Руссиновича и посмотри кто подгружает эту dll. Добавлено @ 11:39 А самое простое это отнести винт к другу и удалить эту либу от него. Конечно, если винт не в RAID'е стоят как в моём случае ![]() |
Автор: Romikgy 31.8.2006, 11:42 |
Ща попробуем |
Автор: Yanis 31.8.2006, 11:44 |
Ещё может помочь включение AVZGuard перед сканированием.... Надо пробовать. |
Автор: Romikgy 31.8.2006, 14:27 | ||||
Teran, ты читал мой первый пост?
ниочем не говорит?
этого не нашел ![]() ![]() |
Автор: Yanis 31.8.2006, 14:39 | ||
Romikgy
А это пробовал? |
Автор: Romikgy 31.8.2006, 14:59 |
нет ща поищу его Добавлено @ 15:04 чет найти не могу, да и вроде этож для ХР , а у мя на машине 2000 стоит |
Автор: BUGOR 31.8.2006, 15:15 |
Если апи перехватываются в режиме пользователя, то на 99% это сплайсинг(ну или исправление экспорта, что вряд ли), т.е. замена первых пяти байт вначале этих функций на прыжок. Так, что просто определи адреса этих функций в памяти процесса и проверь равен ли первый байт 55h, если равен, то это не сплайсинг![]() |
Автор: dumb 31.8.2006, 15:40 | ||
большинство экспортируемых системой функций начинаются с сигнатуры 8b,ff - mov edi,edi. push ebp потом идет. Добавлено @ 15:53 не во всех системах, естественно. вроде как с SP2 пошла такая пьянка - вставлять 5 экстра-нопов перед функциями и эту "пустышку". видать будут делать фиксы на лету - call/jmp xx;jmp $-7; |
Автор: Romikgy 31.8.2006, 16:16 | ||||||||
BUGOR, вот что АВЗ сказал
и вот
но от корнел мода , я уже избавилься , остался юзер мод Добавлено @ 16:24 а что это ? и это
что? ![]() говорит еще вот что
|
Автор: Yanis 31.8.2006, 17:29 |
Вот это, что за файл? Проверь его вот на этом сайте http://www.virustotal.com/en/indexf.html Там используются все известные антивирусы. Это метод перехвата в режиме пользователя API функций. |
Автор: Romikgy 31.8.2006, 18:43 |
с удавольствием его бы проверил да его на винте найти не могу, имхо это и есть троян/вирус, и себя же прячет ![]() |
Автор: Alexeis 31.8.2006, 18:46 |
Romikgy, А если снять с него (msvcrt64.dll) дамп и проверить его? |
Автор: Romikgy 31.8.2006, 18:56 |
как это сделать? |
Автор: BUGOR 31.8.2006, 21:02 | ||||||||
Ок, проверяй, чтобы первым байтом небыл опкод команды JMP - E9h.
А что это нам даст? Не понимаю. Проверить мы можем и в памяти.
А вот на это стоит обратить внимание, похоже на какой-то руткит.
Ну вот, значит это и есть сплайсинг. |
Автор: Alexeis 31.8.2006, 21:20 |
Да много есть разных програмок, например lordpe. Предложили проверить на вирус мощным онлайн антивирусом, он ведь не будет память проверять, а дамп снял, сохранил на диск и пожалуйста можно отправлять куда угодно, проверять чем угодно. |
Автор: Romikgy 1.9.2006, 08:58 |
А хде смотреть этот опкод? Ответ на данное утверждения имхо ясен спасибо ща попробую (сначало найти это) ![]() |
Автор: dumb 1.9.2006, 09:02 | ||
этот "руткит" - драйвер "алкоголя".
его, возможно, уже и нет... пристрелили или сам убился ![]() самое простое - грузануться с cd со свежим ав-набором. а так - глянуть, куда ведет перехват и отстрелить в сэйф-моде руками. |
Автор: Romikgy 1.9.2006, 10:02 | ||
спасиб за инфу значит снова включу ![]() нет сам к сожалению он не убился ![]()
в сейф моде он тоже активен ![]() по инфе от данного чела alexeis1, с помощью lordpe нашел место нахождения троя , идентификация его Generic.ZWR , нашел его в консоли можно наверное навернуть , но его наверное держат все процессы, так что просто не получится , хотя эксперементы оставлю на начало следующей недели |
Автор: Yanis 1.9.2006, 10:20 |
Я уже писал как проверить какие процессы его держат ![]() |
Автор: Romikgy 1.9.2006, 10:25 |
Yanis, не хочу показатся грубым , но я тоже писал , что у троя этого есть перевхат ф-ций которые просматривают, кто держит dll |
Автор: BUGOR 1.9.2006, 10:40 |
Romikgy, посмотри какие первые 5 байт оригинальные у перехватываемых функций в твоей системе, далее восстанови их и спокойно юзай как написал Yanis. Т.о. образом собсно ты и избавишься от перехвата. |
Автор: Romikgy 1.9.2006, 11:01 | ||
BUGOR, сколько раз просить
ХДЕ посмотреть ??? |
Автор: Yanis 1.9.2006, 11:09 | ||
Ни одна из тех функций, которые у тебя перехвачены не должна повлиять на роботу ProcessXP в определении процесса, который владет описателем вирусного файла. |
Автор: Romikgy 1.9.2006, 11:20 |
его ссылки для скачивания я не нашел, и он только для ХР или нет? У мя 2000 |
Автор: _hunter 1.9.2006, 11:34 |
http://www.sysinternals.com/Utilities/ProcessExplorer.html есть и для 2к |
Автор: Romikgy 1.9.2006, 11:44 |
_hunter, это у мя есть , и оно никого не видит ![]() |
Автор: Yanis 1.9.2006, 11:47 |
Romikgy Так если ты знаешь какой файл неможешь удалить, то поищи (Ctl+F) кто его держит. |
Автор: Romikgy 1.9.2006, 11:56 | ||||||
Yanis, опять 25 ....
еще раз повторюсь , перехват этих ф-ций не дает: 1. найти его файл 2. найти к каким процессам он прицеплен 3. найти где в реестре он ся прописал !!!! юзая АВЗ я нашел его место положение на диске ! юзая
сделал дамп этой dll и определил что за зверь, буду пытатся снести его руками , хотя есть опасения что dll прописалась как чтото системное и может при простом удалении привести к краху системы!!!! (у меня был такой вирус уже , так прописался как дебаг процесс к эксплореру и после удаления его эксплорер перестал вообще запускатся , а такой вариант неприемлем, т.к. машина рабочая на стоит спец ПО , стопорить ее нежелательно) |
Автор: BUGOR 1.9.2006, 12:26 | ||
Ну всё по-порядку... Берём тот же LordPE(хотя я предпочитаю PETools, обе программы можно найти на cracklab.ru), открываем. PE Editor, там выбирай kernel32.dl Далее накидаем небольшое приложение: ShowMessage(IntToHex(dword(GetProcAddress(GetModuleHandle('kernel32.dll'), 'FindFirstFileA')),8)); Которое вернёт нам адресс перехватываемой FindFirstFileA в памяти. Т.к. база кернела есть константа, то благо во всех приложениях этот адресс будет одним. --------------------------- Project1 --------------------------- 77E7A10D --------------------------- OK --------------------------- В LordPE нажимай FLC, выбирай VA(virtual address), вводи туда 77E7A10D и жми do. LerdPE покажет внутрифайловый оффсет этой функции, а чуть ниже и первые байты. |
Автор: Romikgy 1.9.2006, 12:49 | ||
на любую закачку
Добавлено @ 12:51 во всех версиях виндов? |
Автор: dumb 1.9.2006, 12:57 |
вариант лечения: hiew32 c:\windows\system32\advapi32.dll enter, f8, f9 найти RegEnumValueW и перейти на начало этой функции. оставляем открытым, чтобы потом списать оригинальный стаб функции. ollydbg c:\windows\regedit.exe alt-f1: bpx RegEnumValueW f9(брякнется на первом вызове), f7(входим в функцию) там будет какой-нибудь хлам вроде jmp xx или push xxx,ret заменяем хлам на оришинальный код. далее спокойно работаем в регедите, вырезая места с упоминаниями злой dll. сомневаюсь, что она следит за снятием хука, так что все должно получиться. |
Автор: Yanis 1.9.2006, 13:06 | ||
Моя активность в теме вызвана тем, что у меня тоже была такого рода зараза. Причём файл невозможно было найти обычными способами, но Total Commander видел этот файл среди прочих в директории Windows\Sytem32. При помощи ProcessXp я находил кто держит этот файл и убивал эти процессы. Затем просто удалил этот файл... Сам теперь жалею... |
Автор: Romikgy 1.9.2006, 13:06 |
что это? |
Автор: dumb 1.9.2006, 13:10 |
http://ollydbg.de/ |
Автор: Romikgy 1.9.2006, 13:11 | ||
не видит что поделится , у мя есть дамп этой либы |
Автор: Romikgy 1.9.2006, 13:27 | ||
скачал говорит
а как распаковать? |
Автор: Yanis 1.9.2006, 13:38 |
Не не надо ![]() |
Автор: BUGOR 1.9.2006, 14:14 |
Romikgy, зачем тебе хью я не понимаю... я же написал как с помощью LordPE узнать оригинальные байты на EntryPoint функции... http://wasm.ru/baixado.php?mode=tool&id=44 |
Автор: Romikgy 1.9.2006, 15:28 | ||
Yanis, сильно хочешь я те позже достану саму dll ![]() Добавлено @ 15:40 BUGOR, ниче понять не могу вот то что дал
из нормально эксплорера, где здесь точка входа/адрес |
Автор: BUGOR 1.9.2006, 16:03 | ||
Запускаешь делфи вписываешь туда одну строку кода:
Вместо FindFirstFileA имя любой апи, ну ессно той, что перехватывается в данном случае. Вылазит сообщение с адресом этой функции. Запоминаем его. У меня вылезло вот что: --------------------------- Project1 --------------------------- 77E7A10D --------------------------- OK --------------------------- Открываем LordPE и жмём PE Editor, выбираем kernel32.dll, далее в появившемся окошке жмём кнопку "FLC", в поле VA вводим то, что нам выдал ShowMessage, нажимаем DO и внизу в окошечке лицезреем оригинальные байты на точке входа функции: http://img106.imageshack.us/img106/5263/scrqs5.jpg |
Автор: Romikgy 1.9.2006, 16:29 |
пнятно сиба |
Автор: Girder 1.9.2006, 22:06 | ||
|
Автор: RideX 3.9.2006, 21:13 | ||||||||
Посмотреть экспортируемую функцию любого загруженного модуля можно без лишних извратов и левых тулз, а только средствами Delphi, например, так:
Или через родной дизассемблер Delphi путём вызова интересующей ф-ции, например:
Поставив breakpoint и остановившись на нём, жмём Ctr+Alt+C, чтобы попасть в окно CPU встроенного отладчика:
Далее просто трассируем по F7, пока не попадем в системную библиотеку:
|
Автор: dumb 4.9.2006, 09:41 | ||
"без лишних извратов и левых тулз" ты увидишь уже похуканный код. "левые тулзы" же показывают оригинальный код. |
Автор: Romikgy 4.9.2006, 14:23 |
Все избавился , от этого зверя , с танцами и бубнами, и в безопасном режиме + коммандная строка, удалось залезть в реестр и все поправить ![]() Тема закрыта ![]() ![]() |
Автор: RideX 4.9.2006, 22:42 | ||||||
Ты ошибаешься, я увижу то, что захочу увидеть ![]()
Понятно что всё можно автоматизировать и усовершенствовать, это для наглядности, выведет информацию в таком виде:
|
Автор: Romikgy 4.9.2006, 23:00 |
RideX, а в чужом процессе можно ли как то поменять адресса вызовов ф-ций? |
Автор: RideX 4.9.2006, 23:28 |
Вызов одной API заменить на другую? В принципе можно изменить абсолютно всё, даже константы (пример кода недавно давал), только делать это нужно внимательно, так при подмене API функции не забывать передавать ей "новые", правильные параметры, помнить о типе возвращаемого значения, если оно используется, следить чтобы код "не поломался", т.е. чтобы, например, "старая", но нужная инструкция процессора не "разорвалась". |
Автор: Romikgy 5.9.2006, 00:10 |
это понятно , я имел ввиду, есть хукнутая ф-ция, как мне взяв ее реальный адресс из файла , и поменять на реальный , а не хукнутый? допустим в regedit |
Автор: dumb 5.9.2006, 00:44 | ||
RideX, - можно взять клещи или гвоздодер и выдернуть гвоздь. - изврат, левые тулзы! можно взять микроскоп и в лучшем виде рассмотреть гвоздь! - пардон, но... - вы ошибаетесь! возму вот микроскоп, скую мини-девайс для извлечения гвоздей. и вообще, я все могу.
время, потраченное на анализ такого рода ситуации с помощью подручных средств, отличается от времени, потраченного на разработку какого-либо своего средства, на порядки. а если сдампить захочу по ходу, подебажить, пофиксить? ![]() а сэмпл добротный. |
Автор: dumb 5.9.2006, 04:44 | ||
в данном случае отличаются не адреса(Romikgy - реальный программер! только почему тогда с одной "д"? ;)) а содержимое функций: в начало "правильной" функции вписывается переход на "подставную". т.е. чтобы убрать хук, достаточно заменить код перехода на считанные из файла оригинальные байтики. так как адресные пространства процессов изолированы, сие действо нужно совершать "изнутри" каждого процесса. проще всего, наверное, будет поставить глобальный хук(например WH_CBT) и реализовать код "восстановления" в dll нашего хука. к тому же получаем бонус в виде возможности довольно часто проверять наши восстановленные функции(лучше после CallNextHookEx, на случай если "зараза" тоже восстанавливается при вызове WH_CBT). кстати, если уж так залезли в эту тему, интересно - как именно реализована подгрузка у этой "заразы". просто есть подозрение, что в режиме командной строки регедит остался бы нетронутым... |
Автор: Romikgy 5.9.2006, 10:31 |
Я имел ввиду адреса прыжков на ф-ции |
Автор: dumb 5.9.2006, 11:45 | ||||
Romikgy, пример: было:
стало:
тут не нужно менять адрес перехода(jmp), надо сам переход заменять на то, что было. |
Автор: RideX 5.9.2006, 12:07 | ||||
Всё, сдаюсь! ![]()
Да, возможно, скорее всего ловит процесс через создание окна, хуком на HSHELL_WINDOWCREATED, и в реализации не сложно. dumb, не видел что ты только что уже написал ![]() |
Автор: Romikgy 5.9.2006, 13:10 | ||
это после хука такое? |
Автор: RideX 5.9.2006, 16:16 | ||||||
Да, именно, хотя возможен вариант с push/ret
Вот, к примеру, похуканый MessageBox может выглядеть так:
Как видишь первые шесть байт кода в памяти, отличаются от того что в файле, т.е. ,без дизассемблера понятно, что фактически в памяти имеем переход "куда-то там..." по адресу 00B136BCh
P.S. Вообще чтобы не перекомпилить каждый раз код, который я приводил, кинь на форму два TEdit, один для имени DLL, второй для имени ф-ции, конечно если ты уже не сделал TMemo/TStringList с целым списком функций для проверки ![]() |