Сейчас на форуме: Adler, asfa, bartolomeo (+8 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› RTTI ошибка при инжектировании своего кода. |
Посл.ответ | Сообщение |
|
Создано: 25 мая 2012 11:24 · Личное сообщение · #1 При инжектировании своего кода посредством новой dll возникает проблема c RTTI. Исполнение прерывается на определенном адресе, вылетает по RTTI exception. То же самое происходит, если запускать этот ехе в Олли дебагере, даже при отсутствии инжектированного кода. В VS 2010 все запускается нормально (exception все еще возникает, но правильно обрабатывается VS). Как это обойти, ибо в таком варианте программа с инжектированным кодом не работает. Перекомпиляция инжектированной dll с включенной RTTI не помогает. ![]() |
|
Создано: 25 мая 2012 12:01 · Личное сообщение · #2 |
|
Создано: 25 мая 2012 12:09 · Личное сообщение · #3 |
|
Создано: 25 мая 2012 13:19 · Личное сообщение · #4 |
|
Создано: 25 мая 2012 15:29 · Поправил: Dim77 · Личное сообщение · #5 Hexxx пишет: нет смысла. У него там exe файл кидается исключениями Так оно и есть. При инжекте возникает такое же поведение, как при просматривании этого ехе в дебагере. Т.е. исключения не обрабатываются. Hexxx пишет: Сначала надо отдельно выяснить чего исключения летят Как это сделать? Я знаю адреса по которым вылетают исключения, по крайней мере в одном случае ругается на RTTI: Access violation - no RTTI data. Вот адрес с которого программа соскакивает на exception: Code:
Вылетает при вызове sub_61C2EB с аргументами - имя директории и имя файла. Файл - TApp.dbf. Все это происходит при инициализации текста интерфейса. Подобные инициализации для других компонентов типа фонтов например проходят нормально. Короче говоря, exception возникает от того, что этот файл не может быть открыт. Это странно, ибо скомпилированная программа прекрасно его открывает. Почему он под Олли не может быть открыт - непонятно. Никаких специальных привилегий на этот файл, Everyone - Full access. Причем другие файлы программа открывает нормально. ![]() |
|
Создано: 25 мая 2012 22:50 · Личное сообщение · #6 |
|
Создано: 26 мая 2012 00:53 · Личное сообщение · #7 Нет, оригинальный бинарь не мой. У меня его исходников нет, отсюда необходимость в инжекте. Hexxx пишет: Соответственно в коде экзешника используется dynamic_cast, но в настройках компилятора отключено RTTI. Это не очень понятно. Т.е. про dynamic_cast мне известно, но ехе уже скомпилировано, так что о каких настройках идет речь? Настройках Олли в случае с дебагером - ибо даже дебаг под Олли оригинального экзешника вызывает это исключение? Не очень также понятно, как RTTI связан с тем, что исключение вызывается, когда програма не может открыть dbf файл. В dbf забиты ресурсы. В таком случае все мои файлы для инжекта тоже должны быть скомпилированы используя RTTI? У меня 3 файла для инжекта: ехе - очень простой, вызывающий DetourCreateProcessWithDll. Dll для инжекта. А также detoured.dll Первые два я перекомпилил с включенным RTTI - не помогло. Последний - нужно найти исходники и тоже скомпилить, я его подцепил в инете. ![]() |
|
Создано: 26 мая 2012 20:30 · Личное сообщение · #8 Dim77 пишет: Нет, оригинальный бинарь не мой Ну раз так, значит в программе изначально баг. Приложение само кидает исключение и само же его обрабатывает. VS знает что конкретно такие исключения нужно отдать программе на обработку. Olly видимо про это не знает поэтому останавливает работу приложения. Т.е. это вопрос к настройкам Ollydbg. Я без понятия как там это делается, потому что не пользуюсь. В IDA например есть настройки для исключений, можно указать какой код нужно обработать отладчику, а какой отдать приложению. Но это только по вопросу "почему в олли не работает". Про инжектирование нужны подробности как именно оно глючит. ----- Реверсивная инженерия - написание кода идентичного натуральному ![]() |
|
Создано: 27 мая 2012 01:05 · Поправил: Dim77 · Личное сообщение · #9 Hexxx пишет: Про инжектирование нужны подробности как именно оно глючит. Программа вылетает, при подсоединении дебагера видно, что вылет происходит по адресу: 61B028, т.е. при попытке выйти из очень длинной процедуры инициализации различных параметров программы. Ниже код последних шагов. Вылетает на Leave с ошибкой Unhandled Exception at address 0x0061B028: 0x00000005. Access Violation reading location 0x00000000. Регистры: EAX = 00383480 EBX = 00383034 ECX = 0038304D EDX = 00008000 ESI = 0022F844 EDI = 006F3534 EIP = 0061B028 ESP = 0022F838 EBP = 00000000 EFL = 00010246 Есть подозрение, что EBP должно содержать адрес вызывающей функции, но это значение почему-то оказывается равным 0. Как понять, что там на самом деле должно быть не очень ясно, разве что VS присоединиться к оригинальному процессу... Но, даже если это будет понятно, важнее понять, почему там этого адреса не оказывается, если вообще мое предположение верно. Code:
Полный код функции приаттачен. ![]() ![]() |
|
Создано: 27 мая 2012 01:33 · Личное сообщение · #10 |
|
Создано: 27 мая 2012 03:12 · Личное сообщение · #11 Dim77 пишет: Есть подозрение, что EBP должно содержать адрес вызывающей функции Dim77 пишет: .text:0061B028 leave Из EBP в ЕSP копирутся то значение которое было до вызова процедуры(выравнивается стек), Dim77 пишет: text:0061B01F pop ebp вот здесь и дёт ошибка,в стеке нарушина последовательность и в EBP ложится хрен знает что,но нето что нужно ![]() ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. ![]() |
|
Создано: 27 мая 2012 13:51 · Поправил: Dim77 · Личное сообщение · #12 reversecode пишет: выкладывай наверное екзе+хук что бы не гадать на ромашках Выложил: 1. 2. 3. ClockMan пишет: ,в стеке нарушина последовательность и в EBP ложится хрен знает что Как это происходит пока не вижу. На всякий случай код хука: Code:
![]() |
|
Создано: 27 мая 2012 14:11 · Личное сообщение · #13 ясное дело в оригинальном exe stdcall конвершинал а в вашей хученой cdecl вот стек и ломается ![]() |
|
Создано: 27 мая 2012 16:40 · Поправил: Dim77 · Личное сообщение · #14 reversecode пишет: в оригинальном exe stdcall конвершинал а в вашей хученой cdecl вот стек и ломается Заработало. Спасибо. Это было круто ![]() ![]() ЗЫ С исключениями в Олли еще предстоит разобраться ибо цель была добавить еще свой код к этому ехе. No CD - это была "проба пера"... ![]() |
|
Создано: 27 мая 2012 20:37 · Личное сообщение · #15 |
|
Создано: 04 июня 2012 01:38 · Поправил: Dim77 · Личное сообщение · #16 |
|
Создано: 04 июня 2012 03:13 · Поправил: -=AkaBOSS=- · Личное сообщение · #17 Dim77 ну попробуй кинуть эту длл в папку с программой и уже на неё дать права хотя странно это всё.. а может dllInit возвращает 0? поставь в ольке: Make first pause at -> System Breakpoint и флаг Break on new module (DLL) и попробуй дойти до точки входа в эту длл Dim77 пишет: Вылетает по исключению а код-то какой? ![]() ![]() |
|
Создано: 04 июня 2012 14:17 · Поправил: Dim77 · Личное сообщение · #18 -=AkaBOSS=- пишет: а код-то какой? При вылете попадает на обработку исключений: Code:
Вылетает на вызове EBX (см код ниже). В EBX в этот момент адрес: 0025004С. Другие dll, в том числе системные, нормально грузит. Этот код из модуля snxhk. Code:
-=AkaBOSS=- пишет: и попробуй дойти до точки входа в эту длл Хм, нужно попробовать, заметил, что после передачи исключения программе длл загружается, но исключения продолжают регулярно выскакивать. Какая-то фигня с использованием DirectX библиотек похоже... Заработало кое-как. Постоянно останавливается по exception, но если передать управление приложению, то через 3-5 циклов проходит дальше... Пока работает на этапе инициализации данных. Посмотрим, как будет дальше ибо по-моему программа не любит, когда ее ставят на паузу и потом снимают. При этом передача управления программе не происходит. Но пока это не особенно важно. Тему закрываю. ![]() |
![]() |
eXeL@B —› Вопросы новичков —› RTTI ошибка при инжектировании своего кода. |
Эта тема закрыта. Ответы больше не принимаются. |