Сейчас на форуме: zombi-vadim, zds (+4 невидимых) |
eXeL@B —› Программирование —› Перехват API |
. 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 06 мая 2007 20:16 · Личное сообщение · #1 |
|
Создано: 06 мая 2007 20:25 · Личное сообщение · #2 |
|
Создано: 06 мая 2007 20:48 · Личное сообщение · #3 |
|
Создано: 09 мая 2007 05:33 · Личное сообщение · #4 |
|
Создано: 10 мая 2007 07:59 · Личное сообщение · #5 |
|
Создано: 10 мая 2007 19:13 · Личное сообщение · #6 |
|
Создано: 10 мая 2007 19:35 · Личное сообщение · #7 |
|
Создано: 26 июля 2012 13:23 · Поправил: g3r0n1m0 · Личное сообщение · #8 Из "Перехват API функций в Windows NT (часть 2)": В среде Borland C++ Builder некоторые приведенные приёмы неосуществимы (в связи с особенностями генерации кода компилятором). 1) с чем это связано; 2)изменилась ли ситуация в следующих версиях(Codegear или Embarcadero RAD Studio ). Я так понимаю здесь имелся в виду C++Builder 6 3)"особенностями генерации кода компилятором" - можно ли это исправить, например ассемблерными вставками. Просто привык сильно к этой среде |
|
Создано: 26 июля 2012 16:42 · Поправил: Maximus · Личное сообщение · #9 g3r0n1m0 все осуществимо. Я делаю все proxy dll в дельфе 5. Во вложении пример, заготовка для всех basic программ. 3738_26.07.2012_EXELAB.rU.tgz - 1.rar Там остается только сделать перехват любой API, какой вздумается. Для примера я перехватил RegQueryValueExA ----- StarForce и Themida ацтой! |
|
Создано: 24 июня 2013 19:57 · Поправил: volopas · Личное сообщение · #10 В Перехват API функций в Windows NT (часть 2) есть архив с примерами. Пример InjectDllEx.dpr работает , но если применять CreateProcessWithDllEx , то Блокнот не выходит из приостановленного состояния. После ResumeThread на точку входа в Блокнот попадает, но дальше CreateWindowExW возвращает 0 и завершается. Сразу после возврата CreateWindowExW попробовал перескочить на GetLastError . Выдало 7F. Что означает The specified procedure could not be found. Но все равно причина не ясна. В чем причина? |
|
Создано: 25 июня 2013 17:00 · Поправил: volopas · Личное сообщение · #11 Похоже, проблема в создании удаленных потоков и запуске их, пока главный поток стоит. Если процесс создается с флагом CREATE_SUSPENDED , то процесс не отображается в списке процессов , по крайней мере Ольга не видит его в окне Attach (Кстати , как приаттатчиться к такому процессу Ольгой? ), но как только создается удаленный поток, то процесс notepad.exe появляется. |
|
Создано: 25 июня 2013 17:08 · Личное сообщение · #12 |
|
Создано: 25 июня 2013 17:21 · Личное сообщение · #13 |
|
Создано: 25 июня 2013 17:49 · Личное сообщение · #14 |
|
Создано: 25 июня 2013 18:01 · Личное сообщение · #15 |
|
Создано: 25 июня 2013 18:12 · Личное сообщение · #16 |
|
Создано: 25 июня 2013 18:15 · Личное сообщение · #17 |
|
Создано: 25 июня 2013 18:57 · Личное сообщение · #18 |
|
Создано: 25 июня 2013 19:26 · Поправил: volopas · Личное сообщение · #19 Про отладчик - это всё костыли. Тогда уж проще написать отладчик или написать прогу , которая будет нажимать на кнопки в стороннем отладчике (напр. Ольге) и этот отладчик будет перехватывать API через родные приемы бряков. Я же хочу понять суть ошибки в применении CreateProcessWithDllEx и хочу добиться перехвата через инжекцию длл без костылей и отладчиков. Подскажите , в какую сторону копать. Почему если стартует неосновной поток, то потом ничего не работает? Если приаттатчится к процессу с отработавшими неосновными потоками, но остановленным основным (теперь он будетт виден в Ольге), то в окне Потоков в столбике Entry основной поток имеет 00000000. А если запускать блокнот в Ольге , то там стоит точка входа |
|
Создано: 25 июня 2013 20:18 · Личное сообщение · #20 |
|
Создано: 25 июня 2013 20:20 · Личное сообщение · #21 volopas пишет: Похоже, проблема в создании удаленных потоков и запуске их, пока главный поток стоит Проблема в том, что кто-то как нихрена не читал и не хотел делать, так и продолжает в том же духе. Кстати, как там старфорс - уже распаковался? ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 25 июня 2013 20:45 · Поправил: volopas · Личное сообщение · #22 >>а в чем проблема я не понимаю отладить свой код и посмотреть что и почему не воркает/падает? может что то не так делаешь? где твои сорцы? Все исходники в файле advApiHook.rar к второй части статьи: TestDll.dll вообще не компилировал , взял готовую InjectDllEx.dpr Переписал следующим образом: Code:
advApiHook.pas не менял: Code:
Все прекрасно работает в моем приложении и DLL отрабатывать (правда окна не видно, так как процесс приостановлен , но если делать инжект после старта Блокнота, то Messagebox вылетает аж бегом). Проблема в уже Блокноте, который не может выйти из SUSPENDED. Я отлаживал его , CreateWindowExW при создании окна класса Edit возвращает 0. А 0 возвращает потому что по адресу $ 00090010 стоит 0, а должно быть 00090010 60 00 00 40 . У вас адрес может быть другой . По-моему это основная куча процесса. Но что это означает, не понял. Методом тыка попробовал закомментировать все процедуры , использующие CreateRemoteThread и блокнот нормально начал работать (естественно, без инжекта) TЕсли вместо блокнота прописать путь к Пэйнту, то Пэйнт не закрывается , а все таки стартует. Но видно только основное окно , строку меню и полотно, ничего нарисовать нельзя. da44_25.06.2013_EXELAB.rU.tgz - advApiHook.rar |
|
Создано: 25 июня 2013 20:52 · Личное сообщение · #23 |
|
Создано: 25 июня 2013 21:04 · Поправил: SReg · Личное сообщение · #24 volopas компилишь я надеюсь не в юникодной дельфи? volopas пишет: Нет , да это вообще не проблема этих исходников. Хотите сказать, у вас работает? Наверняка же не работает. (Я имею в виду восстанавливается ли приложение из suspended-состояния? Сам инжект работает) я не пойму, какая стоит задача вообще? тупо заинжектить либу или что? |
|
Создано: 25 июня 2013 21:16 · Поправил: volopas · Личное сообщение · #25 >>volopas компилишь я надеюсь не в юникодной дельфи? Нет , да это вообще не проблема этих исходников. Хотите сказать, у вас работает? Наверняка же не работает. (Я имею в виду восстанавливается ли приложение из suspended-состояния? Сам инжект работает) В родном файле InjectDllEx.dpr: begin //Запускаем процесс ZeroMemory(@StartInfo, SizeOf(TStartupInfo)); StartInfo.cb := SizeOf(TStartupInfo); CreateProcess(nil, 'notepad.exe', nil, nil, False, 0, nil, nil, StartInfo, ProcInfo); //считываем Dll в память sFile := CreateFile('TestDll.dll', GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0); Size := GetFileSize(sFile, nil); GetMem(Buff, Size); ReadFile(sFile, Buff^, Size, BytesReaded, nil); CloseHandle(sFile); Sleep(2000); InjectDllEx(ProcInfo.hProcess, Buff); FreeMem(Buff); end. Для чего здесь Sleep(2000); ? Явно и у автора самого не работает. Поэтому он решил исключить пример с использованием CreateProcessWithDllEx, и ограничелся инжектом в уже действующий процесс. Но такой инжект бесполезен, так как целевой процес будет с момента старта беспрепятственно использовать неперехваченные процедуры. |
|
Создано: 26 июня 2013 00:10 · Личное сообщение · #26 volopas Открою вам правду и истену. Задача должна решаться на основе требований и механизмов, они должны быть изначально чётко определены. Соответственно решенье должно удовлетворять эти требования. Допиливать фундаментально кривое гавно не годится. Вам нужно загрузить из памяти модуль - не нужен экзешник, он от длл отличается всего лишь одним битом в хидере и релоками(обычно их нет, ибо ядро мапит). Так вот и используйте уже существующие лодеры(лучше вы написать не способны на данный момент), билдите с /dll(фиксапы). Ежели это конечно не зарипанный целиком модуль.. Инжект - бесчисленное количество метод есть. А дедлоки у вас походу на кс нтлдр, вполне вероятно. Низя окна и треды создавать из дллмэйн. Она защищена критической секцией. Обойти есно можно, но вы вначале разберитесь с простейшими вещами. Самое элементарное решенье - создаём процесс остановленным, загружаем в контекст ссыль на стаб(в rEax вродь, не помню точно). Либо ставим апк в очередь треду. Стандартные методы. А дельфя это уёбищная среда, не удивительно что у вас чота отваливается - она слишком много говна по дефолту линкует. |
|
Создано: 26 июня 2013 07:41 · Поправил: volopas · Личное сообщение · #27 >>Задача должна решаться на основе требований и механизмов, они должны быть изначально чётко определены. Задача состоит в перехвате функции ReadFile в целевом приложении, которое практически сразу после запуска использует функцию ReadFile . Лоадер тоже пытается успеть: сначала ReadProcessMemory и если байты есть, то замениь их через WriteProcessMemory , если байтов нет, то sleep(100). А где гарантия, что во время проверки ReadProcessMemory или sleep(100), целевой процесс не успеет обратиться к функции. Метод четко определен: использовать CreateProcessWithDllEx |
|
Создано: 26 июня 2013 07:57 · Личное сообщение · #28 volopas Пока стартап тред не покинул нтлдр, есть не много мест, откуда экспорт из кернел может вызываться. По дефолту это либо еп кернел, либо еп статически прилинкованных либ. Тут очевидно как сказали отладочный порт само то, при мапе файловой секции достовляется на порт нотифи. В этот момент и можно пропатчить. В любом другом случае придётся с нэйтивом работать. NtReadFile вам же не годится ? Ну а в цикле вращаться ожидая когда промапится кернел - мусье знает толк в извратах |
|
Создано: 26 июня 2013 09:58 · Личное сообщение · #29 Dr0p Да что вы с ним возитесь - это ж гроза старфорса свиновод. Уже больше года старфорс анпакает, и всё никак функции перехватывать не научился. Даже блог есть ----- Stuck to the plan, always think that we would stand up, never ran. | Сообщение посчитали полезным: Dart Sergius, plutos |
|
Создано: 26 июня 2013 12:40 · Личное сообщение · #30 volopas пишет: Задача состоит в перехвате функции ReadFile в целевом приложении, которое практически сразу после запуска использует функцию ReadFile Создай процесс остановленным, выдели в нем память, поменяй контекст регистра Eip на эту область и запиши туда шеллкод(рипни со стронга), который и вызовет LoadLibrary. |
. 1 . 2 . 3 . >> |
eXeL@B —› Программирование —› Перехват API |