Здравствуйте, Flamer, Вы писали:
F>Я не особо силен в формате PE, поэтому просто сидел и пошагово трейсил функцию MemLoadLibrary. Косяк возникает только на строчке вызова точки входа dll. Такое ощущение, что адрес немножко не тот.
А если ее просто не вызывать?
F>З.Ы. Завтра начну войну с Билдером
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, Виталий, Вы писали:
CS>Не понял, а зачем эти пляски с бубном? CS>В чем смысл глубокий?
HtmLayout не прячу, чесс слово (Хотя работает, проверял)
Собственно говоря, я это для чего-то вроде защиты использую. Алгоритм следующий — длл с необходимым функционалом хитроумно шифруется и кладется в ресурсы. Когда требуется, расшифровывается, проверяется контрольная сумма и если все в порядке, то считаем эту область длл и спокойно с ней работаем. Очень удобно, да и реализуется за полчаса, причем никаких проблем с выполнением кода (это в преддверии SP2).
Здравствуйте, Flamer, Вы писали:
F>Здравствуйте, Виталий, Вы писали:
F>[]
F>Интересует, как насчет поддерживаемых OC? А именно: Win9x, Win2000, Win NT 4.x, WinXP. На всех будет работать?
Лично мной проверялось на WinXP и Win98SE. Чисто террористически, упс теоретически должно на всех. Единственное, что нужно уточнить — у меня нет поддержки "forward export", как-то без надобности было
. И то же решение — копание в undoc'ах.
Угу, совершенно так + не поддерживаю "forward export", ну да его добавить строк по 5 в MemGetProcAddress и MemFreeLibrary. Более того, перед написанием статья даже внимательно читалась Только с исходниками не очень разобрался (там некоторые переменные используются, которые нигде не декларированны) и посему изобретал вилосипед, основываясь на "Inside Windows 2000", кстати говоря этой статьи вполне достаточно.
Именно для написания программы достаточно использовать один из источников, приведенных мною в списке ссылок. Но вот для того, чтобы быть уверенным в том, что делаем, приходится их сравнивать. Они, как я уже писал, иногда противоречат друг другу.
А с переменными и впрямь вышел конфуз. То есть, все это легко восстановимо из приведенных в статье рассуждений, но факт остается фактом — пару деклараций я действительно забыл
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Здравствуйте, Flamer, Вы писали:
F>Здравствуйте, Виталий, Вы писали:
F>В С++ Builder 5.0 рушится на этом коде:
skip F>DLL самая простая, экспортирует только одну функцию, в которой выводится MessageBox. Где порылась собака? Или я чего не понял?
С первого взгляда должно работать . Не работает вообще никак или только при загрузке из ресурсов? Может дело в packing alignment, они кажись разные для VC и Билдера?
[]
В>С первого взгляда должно работать . Не работает вообще никак или только при загрузке из ресурсов?
Не работает и при использовании CreateFileMapping. Я из вашего примера взял.
В>Может дело в packing alignment, они кажись разные для VC и Билдера?
DLL тоже написана на Билдере, настройки проектов одинаковые... Вот сижу и огорчаюсь Идея класс, но как заставить ее работать под Билдером? Под VC буду юзать однозначно (думаю, там будет все ок). Any idea?
Здравствуйте, Flamer, Вы писали:
В>>С первого взгляда должно работать . Не работает вообще никак или только при загрузке из ресурсов?
F>Не работает и при использовании CreateFileMapping. Я из вашего примера взял.
В>>Может дело в packing alignment, они кажись разные для VC и Билдера?
F>DLL тоже написана на Билдере, настройки проектов одинаковые... Вот сижу и огорчаюсь Идея класс, но как заставить ее работать под Билдером? Под VC буду юзать однозначно (думаю, там будет все ок). Any idea?
Эт нужно поб билдером поотлаживать, чтоб что-нить умное сказать, а его-то у меня и нет.
[]
F>>DLL тоже написана на Билдере, настройки проектов одинаковые... Вот сижу и огорчаюсь В>Эт нужно поб билдером поотлаживать, чтоб что-нить умное сказать, а его-то у меня и нет.
Я не особо силен в формате PE, поэтому просто сидел и пошагово трейсил функцию MemLoadLibrary. Косяк возникает только на строчке вызова точки входа dll. Такое ощущение, что адрес немножко не тот.
Здравствуйте, Виталий, Вы писали:
В>Здравствуйте, Flamer, Вы писали:
F>>Я не особо силен в формате PE, поэтому просто сидел и пошагово трейсил функцию MemLoadLibrary. Косяк возникает только на строчке вызова точки входа dll. Такое ощущение, что адрес немножко не тот.
В>А если ее просто не вызывать?
Тогда MemGetProcAddress проходит успешно, но при попытке вызова функции — обломс в виде старого приятеля AV...
А с вышеупомянутой статьей сравнивали? В чем отличия?
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[3]: Нашел багу
От:
Аноним
Дата:
12.03.04 22:16
Оценка:
Здравствуйте, Flamer, Вы писали:
F>В С++ Builder 5.0 рушится на этом коде:
F>
F>DLLMAIN dllMain=(DLLMAIN)(ImageBase+pOptionalHeader->AddressOfEntryPoint);
F> if (!dllMain((HMODULE)ImageBase, DLL_PROCESS_ATTACH, NULL))
F>
А я теперь знаю почему код рушится И даже не из-за того что это билдер.
Поглядите на preferred address вашей dll -ки, наверняка она перемещена из-за конфликта с другой dll-кой и тут и возникает баг.
Лечится либо с помощью rebase (временное пожарное решение), а лучше попросить автора, чтобы исправил багу.
очень уж интересуют результаты вашей борьбы с Билдером. Если ли результаты ?
спасибо
F>Я не особо силен в формате PE, поэтому просто сидел и пошагово трейсил функцию MemLoadLibrary. Косяк возникает только на строчке вызова точки входа dll. Такое ощущение, что адрес немножко не тот.
F>З.Ы. Завтра начну войну с Билдером
И думается мне, что это происходит из-за неправильного HINSTANCE (см. tmp___1). На самом деле, отладить это всё достаточно сложно — GetLastError() выдаёт NULL, вместа кода ошибки (видимо, это связано с тем, что вызов системных функций происходит через JMP'ы).
Madshi:
A simple MessageBox (without SysUtils) with only Windows.pas in the uses clause worked for me. But I had to set the image base address of your project to something high (I've chosen $60000000) and the image base address of the test exe to $10000000. It didn't work with $400000 because that address was already in use (didn't spend the time to find out why).
Но я пока ImageBase'ы не менял. Попробую потом (ибо хрен знает как это сделать под masm32).
В общем, нужно как-то решить проблему. Пока не знаю как. Но факт остаётся фактом — с обычной загрузкой глобальный хук работает, а с такой загрузкой (через этот PE Loader) — не работает.
Здравствуйте, juicy_emad, Вы писали:
_>0x10000000 — это IBase DLL'ки; _>0x00400000 — это IBase exe'ка, который использует DLL'ку;
_>Вот сама DLL'ка: _>[file]http://files.rsdn.ru/61583/nthide.dll[/file]
Я вызвал GetModuleHandle в коде библиотеке:
invoke GetModuleHandle, NULL
И? Что же она вернула? 0x00400000! А не 0x10000000 как ожидалось!
Почему? Как пофиксить?
Т.е. моё предположение подтверждается — PE loader написан некорректно.
Здравствуйте, juicy_emad, Вы писали:
_>И? Что же она вернула? 0x00400000! А не 0x10000000 как ожидалось!
Результат верный
If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process (.exe file).
_>Почему? Как пофиксить?
Просто — никак. Теоретически, 3м параметром SetWindowsHookEx следует передать адрес загрузки dll. Далее, по нему из PEB будет получено имя dll — оно нужно для загрузки dll в адресные пространства других процессов. Но dll то нет...
_>Т.е. моё предположение подтверждается — PE loader написан некорректно.
В нём есть недоработки (то же добавление в списки загруженных модулей), но в данном случае проблема не в этом.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, juicy_emad, Вы писали:
_>Здравствуйте, Виталий!
_>Используя этот PE loader я наткнулся на проблемку. Не устанавливается глобальных хук (код из DLL'ки):
И не должен. Глобальный хук должен подгрузить или смапить твою DLL на адресное пространство других процессов, а самой-то DLL и нет.
Здравствуйте, vdimas, Вы писали: V>И не должен. Глобальный хук должен подгрузить или смапить твою DLL на адресное пространство других процессов, а самой-то DLL и нет.
Да, я так и понял. Просто, когда писал тот пост ещё не понимал как именно это должно происходит.
А вообще, мне нужно было пропатчить taskmgr.exe, чтобы скрыть свой процесс из его списка.
SetWindowsHookEx мне не подошло, ибо нужно именно наличие DLL'ки (а пихать DLL'ку в ресурсы своего exe'шника и потом дампить в файл — как-то не по-нормальному).
Я решил проблему через создание удалённого потока (CreateRemoteThread в сочетании с WriteProcessMemory) в процессе диспетчера задач и патчингом его таблицы импорта, прописал адрес функции ~NtQuerySystemInformarion на свой собственный.
В результате этого я наткнулся на проблемку: ведь, адреса API-функций, вызываемые в функции, которую я ставлю вместо NtQuerySystemInformarion привязаны к базе моего exe'шника, поэтому пришлось грузить необход. системные библиотеки и получать их адреса (LoadLibrary & ~GetAddressProc) и вручную, в бинарном прописанным в процесс диспетчера коде, менять адреса api-функций на полученные.
=)
Здравствуйте, juicy_emad, Вы писали:
_>В результате этого я наткнулся на проблемку: ведь, адреса API-функций, вызываемые в функции, которую я ставлю вместо NtQuerySystemInformarion привязаны к базе моего exe'шника, поэтому пришлось грузить необход. системные библиотеки и получать их адреса (LoadLibrary & ~GetAddressProc) и вручную, в бинарном прописанным в процесс диспетчера коде, менять адреса api-функций на полученные.
Адреса загрузки основных системных dll одинаковы во всех процессах (для экономии памяти)
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, gear nuke, Вы писали:
GN>Адреса загрузки основных системных dll одинаковы во всех процессах (для экономии памяти)
По идее, да. =) Но у меня почему-то, если я не перетру адрес, полученным через GetProcAddress, то приложение, в котором я перехватывал эту функцию, просто "вылетит".
Я бы мог опубликовать сорец, для выяснения обстоятельств, но он большой (~15 КБ) и я думаю, мало кому это будет интересно.
Здравствуйте, juicy_emad, Вы писали:
_>По идее, да. =) Но у меня почему-то, если я не перетру адрес, полученным через GetProcAddress, то приложение, в котором я перехватывал эту функцию, просто "вылетит".
Какое исключение, что в стеке вызовов? Возможно, дело не в GetProcAddress, а в LoadLibrary (dll нет в АП процесса). Тогда достаточно её замапить. Вообще, всё должно стать понятно, если посмотреть что там за адрес, или немного поотлаживать.
_>Я бы мог опубликовать сорец, для выяснения обстоятельств, но он большой (~15 КБ) и я думаю, мало кому это будет интересно.
А тебе что интересно? По-моему, у тебя просто некоторые пробелы, которые, судя по постам, ты с успехом сам и восполняешь.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, juicy_emad, Вы писали:
_>Здравствуйте, vdimas, Вы писали: V>>И не должен. Глобальный хук должен подгрузить или смапить твою DLL на адресное пространство других процессов, а самой-то DLL и нет.
_>Да, я так и понял. Просто, когда писал тот пост ещё не понимал как именно это должно происходит.
Самое прикольное, что по-идее, если DLL уже загружена в память, то при установке глобального хука надо лишь смаппить область уже загруженного кода на память другого процесса. Может быть, если корректно зарегистрировать загруженную DLL в списке загруженных модулей в этом загрузчике, то всё должно сработать.