Сейчас на форуме: asfa, bartolomeo (+6 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Созданная мной dll выглядит странно в дебагере |
Посл.ответ | Сообщение |
|
Создано: 30 апреля 2012 19:47 · Личное сообщение · #1 Создал dll из кода, приведенного ниже. Все нормально скомпилилось. Но, когда открываю в дебагере, то то, что там открывается совсем не похоже на оригинальный код. Не то, чтобы мне ее нужно было дебажить, но интересно было бы понять, что происходит. VS оптимизировал код? Code:
Вот начало того, что получается в дебагере: Code:
![]() |
|
Создано: 30 апреля 2012 19:54 · Личное сообщение · #2 |
|
Создано: 30 апреля 2012 20:03 · Поправил: Dim77 · Личное сообщение · #3 Это был не весь код. Сейчас весь код выложу. Смотри ниже. Компелю сначала в Debug, потом в Release. Ошибок компеляции нет. Моей функции там и нет. В этом и непонятки... Code:
![]() |
![]() Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 30 апреля 2012 20:04 · Личное сообщение · #4 |
|
Создано: 30 апреля 2012 20:08 · Личное сообщение · #5 |
![]() Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 30 апреля 2012 20:10 · Личное сообщение · #6 |
|
Создано: 30 апреля 2012 20:19 · Поправил: Dim77 · Личное сообщение · #7 ELF_7719116 пишет: какой компилятор или VS 6/7/8? VS 2010 ELF_7719116 пишет: static char FileName[260]; хм, интересный момент. Я взял то, что мне декомпайлер подсунул. Похоже, что он должен быть поинтером. ELF_7719116 пишет: Очевидно Release и оптимизация по скорости стоит, вот он и выкинул Круто. Пойду искать, где эта оптимизация стоит... Dart Sergius пишет: т.к. на неё ваще нету ссылок из кода. Нету, ибо она предназначалась для инжектирования. ![]() |
![]() Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 30 апреля 2012 20:27 · Личное сообщение · #8 Вообще для начала неплохо привести в более менее нормальный вид. Эдак что-то типа: Code:
Оптимизация - ключ /O2. ![]() |
|
Создано: 30 апреля 2012 20:38 · Личное сообщение · #9 |
|
Создано: 30 апреля 2012 21:22 · Личное сообщение · #10 |
|
Создано: 01 мая 2012 00:55 · Личное сообщение · #11 Чуть-чуть подправил типы данных из примера ELF_7719116 и все компилиться. На оптимизацию еще не смотрел. Code:
Эта функция drive и dir похоже отдельно вычисляет. Тогда то, что мне нужно будет выглядеть наверное так: Code:
Ибо RootPathName - это директория, где находится ехе-шник и она-то мне и нужна. ;) Вопрос об инжектировании этой длл: если я функцию оставлю с таким именем (sub_51F36F) и подцеплю длл через реестр, ключ AppInit_Dlls, то я так скорее всего себе могу порушить систему, так ведь? Ибо длл будет всегда загружена и всегда всем видна, а функция с таким адресом может оказаться неуникальной... Или я ерунду пишу? ![]() |
|
Создано: 01 мая 2012 01:05 · Личное сообщение · #12 Уф, какой огород. А всего-то надо вызывать эту функу из DllMain, а иначе, как уже написал Dart Sergius: что компилер тупо не вставил твою функцию, т.к. на неё ваще нету ссылок из кода Ну, или в экспорт добавить. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 01 мая 2012 01:17 · Личное сообщение · #13 |
|
Создано: 01 мая 2012 19:03 · Личное сообщение · #14 |
|
Создано: 11 мая 2012 20:34 · Личное сообщение · #15 Инжектировал эту dll в процесс, все нормально должно было вставиться, т.к. этот же инжектор нормально конектится к процессу и инжектирует тест код. Но, похоже, что код для функции sub_51F36F не вызывается. Я думаю, что мой способ адресации этой функции неверен. В конечном итоге, я не знаю оригинального имени функции, а sub_51F36F получилось из ее адреса. Т.к. программа все время грузится в один и тот же сегмент памяти, то логично было бы подгрузить вызов моей функции по соответствующему адресу. Но как это сделать, я не знаю. Можно было бы привести примеры того как это было сделано другими? ![]() |
|
Создано: 12 мая 2012 06:34 · Поправил: DrGolova · Личное сообщение · #16 > В конечном итоге, я не знаю оригинального имени функции, а sub_51F36F получилось из ее адреса. Логично было бы сделать эту функцию экспортируемой, чтобы её хотя бы в отладчике видеть. Если это VisualC, то я бы тупо добавил в проект def файл типа такого "hooy.def" Code:
Или бы просто добавил перед реализацией функции __declspec(dllexport), но тогда имя в функции в таблице экспорта заманглится так или иначе Ну а эффективный адрес экспортируемой функции всегда можно узнать через GetProcAddress() ![]() |
|
Создано: 12 мая 2012 13:55 · Поправил: Dim77 · Личное сообщение · #17 я сделал через __declspec(dllexport). То, что я хочу сделать - это заменить вызов оригинальной функции по адресу 51F36F на вызов моей функции. Адрес откуда функция вызывается мне известен (из дебагера), но как туда прописать вызов своей функции (без правки ехешника) мне не очень понятно. Или единственный способ - узнать по какому адресу вставляется моя функция и перенаправить вызов на нее? Можно как-то без правки адреса вызова в ехе обойтись? P.S. Это в условиях, когда оригинальное имя функции неизвестно, а заменено дисассемблером на sub_51F36F ![]() |
|
Создано: 12 мая 2012 14:26 · Личное сообщение · #18 |
|
Создано: 12 мая 2012 14:52 · Личное сообщение · #19 |
|
Создано: 12 мая 2012 15:40 · Личное сообщение · #20 |
|
Создано: 12 мая 2012 19:25 · Личное сообщение · #21 |
|
Создано: 12 мая 2012 20:56 · Личное сообщение · #22 |
|
Создано: 12 мая 2012 23:32 · Поправил: Dim77 · Личное сообщение · #23 Dart Sergius пишет: а так в С есть замечательный &, который берёт адрес(реальный!!) Заработало через call sub_51F36F. Не знаю, в чем там дело было. Я в dllmain вызов этой функции прописал на всякий случай. Хотя она оттуда никогда и не должна вызываться. Теперь нужно прописать выделение памяти и т.д., то, что ты выше предложил. Dart Sergius пишет: А адрес функции, которую надо заменять, надо считать Ммм, а зачем? Ее адрес постоянный. Адреса в ехе у меня вообще не меняются. После того, как все заработало в дебагере осталось решить две проблемы - одна оригинальная, где нужно подгрузить свой код, неизменяя ехе-шника. Этим сейчас занимаюсь согласно советам выше. Вторая обнаружилась в процессе отладки. Почему-то запись переменной RootPathName в моей функции происходит не потому адресу, где она должна быть записана. У меня она записывается в 22FADC, а код ее ожидает в 22FC04. Т.е. все это естественно оффсет от EBP. Должно быть [EBP - 104], а оказывается она в [EBP - 23B]. Код на всякий случай ниже. Code:
![]() |
|
Создано: 15 мая 2012 14:28 · Личное сообщение · #24 >>> Вторая обнаружилась в процессе отладки. Почему-то запись переменной RootPathName в моей функции происходит не потому адресу, где она должна быть записана С этим почти разобрался. Второй параметр в sub_51F36F(const char *Str2, int a2), а именно а2 - это адрес структуры данных. Думаю, как лучше написать офсет от этого адреса, чтобы получить указатель на правильный адрес для RootPathName. ![]() |
|
Создано: 15 мая 2012 15:31 · Личное сообщение · #25 Дай исходную DLL, я напишу тебе, как она выглядела в исходнике. Можно через ЛС. P.S. Hex-Rays дерьмо. ![]() |
|
Создано: 15 мая 2012 19:09 · Поправил: Dim77 · Личное сообщение · #26 int пишет: Дай исходную DLL, я напишу тебе, как она выглядела в исходнике. Можно через ЛС. Это не dll - это ехе и довольно длинный. Я тебе на ЛС скинул ту функцию, которую я меняю. Суть в том, что эта функция в оригинале перебирает все буквы алфавита пока не найдет ту, к которой прикреплен CDROM на этом компе. Потом она эту букву запоминает и, дальше по коду (уже не в этой функции) это значение используется, чтобы открыть 2 файла на сидюке, если это проходит успешно, то программа счастлива, что сидюк на месте и не пишет, что он нужен в дальнейшем. Моя функция должна запомнить (по нужному адресу, что пока что не получилось) имя драйва с которого вызывался ехе. Для простоты, вместо того, чтобы запоминать весь путь до ехе, я решил запомнить только букву драйва. Чтобы мой код работал, директорию в которой находится ехе, нужно будет замэпить на любую букву. Заработало с помощью int. У меня изначально была ошибка с возвращаемым значением. Большое спасибо. Наверное, можно было бы просто убрать проверку того, открываются эти два файла или нет вместо того, чтобы заменять функцию проверки диска, но во-первых, эта функция вызывается из двух разных мест и имя драйва позже еще используется, во-вторых, хотелось использовать это как учебный пример, как вставить хук и свой код в ехе. Я планирую туда еще несколько функций впихнуть. P.S. Да и довольно понятно, что происходит, только опыта пока немного нехватает... ![]() |
|
Создано: 19 мая 2012 01:15 · Поправил: Dim77 · Личное сообщение · #27 Сейчас у меня есть 2 инжектора. Один нормально вставляет dll. Только это происходит после запуска процесса, что несколько неудобно. Второй способ запускает процесс сам, но работает он только на программах типа notepad или iexplorer. Т.е. для них он вставляет dll без проблем. Этот второй инжектор создан на базе DetourCreateProcessWithDll. При его запуске, он запускает программу и та вылетает с ошибкой: The application failed to initialize properly (0xc0000142). Clik on OK to terminate the application. Плюс ошибка SmartHeap вылезает см прикрепленный файл. Можно это как-то пофиксить? Эта проблема решена. Я использовал debug версию dll вместо релизной и это создавало конфликт при запуске. Теперь все заработало. Процесс запускается инжектором, что очень удобно. Поскольку dll инжектирована эта тема закрыта. ![]() ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Созданная мной dll выглядит странно в дебагере |
Эта тема закрыта. Ответы больше не принимаются. |