> > > Открываю процесс, выделяю в нем память, пишу туда > код > > > потока, запускаю поток функцией > CreateRemoteThread. > > При > > > попытке вызвать из кода любую API функцию > приложение, > > в > > > которое я влезаю вылетает. Как получить адреса > API > > функций, > > > чтобы их вызывать? > > > > Технология описана в последнем издании Рихтера, > > действительно невозможно вызывать API функции в твоей > > ситуации, поскольку вызовы импортируемых функций при > > статическом связывании осуществляются через шлюзы > таблицы > > импорта. Однако этот метод можно использовать для > загрузки > > своей DLL в чужой процесс, для этого в > CreateRemoteThread > > нужно передать в качестве функции потока абсолютный > адрес > > LoadLibraryA(LoadLibraryW) полученный вызовом > > GetProcAddress, > Надеясь на то, что никто не создал библиотеку, вызвавшую > перемещение библиотеки с этой функцией? > Или есть абсолютная гарантия, что адрес LoadLibrary у всех > один? > > > в качестве параметра LoadLibrary нужно > > передать адрес строки с именем DLL в адресном > пространстве > > процесса-мишени. Выделить память для этой строки в > чужом > > адресном пространстве можно используя VirtuaAllocEx, > > записать туда имя DLL c помощью WriteProcessMemory. > Когда > > внедренная DLL будет загружена и вызвана DllMain c > > уведомлением DLL_PROCESS_ATTACH уже можешь делать > делать > > любые API вызовы. > > Могу предложить альтернативный метод создания потока в > чужом процессе (работает не во всех случаях, но зато на > всех виндах): Ставим хук на сообщение, посылаем сообщение, > в обработчике создаём поток, хук снимаем. Сам так делал.
Если можно, пожайлуста, поподробнее о последнем способе! А тоя под 2000 процесс скрыл, теперь надо под 98, а я точно не знаю какой метод выбрать. Так что если есть предложения буду очень благодарен!
Открываю процесс, выделяю в нем память, пишу туда код потока, запускаю поток функцией CreateRemoteThread. При попытке вызвать из кода любую API функцию приложение, в которое я влезаю вылетает. Как получить адреса API функций, чтобы их вызывать?
[Win32] Поток в чужом процессе25.10.01 13:38 Автор: SerpentFly <Vadim Smirnov> Статус: Member
> Открываю процесс, выделяю в нем память, пишу туда код > потока, запускаю поток функцией CreateRemoteThread. При > попытке вызвать из кода любую API функцию приложение, в > которое я влезаю вылетает. Как получить адреса API функций, > чтобы их вызывать?
Технология описана в последнем издании Рихтера, действительно невозможно вызывать API функции в твоей ситуации, поскольку вызовы импортируемых функций при статическом связывании осуществляются через шлюзы таблицы импорта. Однако этот метод можно использовать для загрузки своей DLL в чужой процесс, для этого в CreateRemoteThread нужно передать в качестве функции потока абсолютный адрес LoadLibraryA(LoadLibraryW) полученный вызовом GetProcAddress, в качестве параметра LoadLibrary нужно передать адрес строки с именем DLL в адресном пространстве процесса-мишени. Выделить память для этой строки в чужом адресном пространстве можно используя VirtuaAllocEx, записать туда имя DLL c помощью WriteProcessMemory. Когда внедренная DLL будет загружена и вызвана DllMain c уведомлением DLL_PROCESS_ATTACH уже можешь делать делать любые API вызовы.
И у меня вопрос27.10.01 03:37 Автор: Biasha <Бяша> Статус: Member
> > Открываю процесс, выделяю в нем память, пишу туда код > > потока, запускаю поток функцией CreateRemoteThread. > При > > попытке вызвать из кода любую API функцию приложение, > в > > которое я влезаю вылетает. Как получить адреса API > функций, > > чтобы их вызывать? > > Технология описана в последнем издании Рихтера, > действительно невозможно вызывать API функции в твоей > ситуации, поскольку вызовы импортируемых функций при > статическом связывании осуществляются через шлюзы таблицы > импорта. Однако этот метод можно использовать для загрузки > своей DLL в чужой процесс, для этого в CreateRemoteThread > нужно передать в качестве функции потока абсолютный адрес > LoadLibraryA(LoadLibraryW) полученный вызовом > GetProcAddress, Надеясь на то, что никто не создал библиотеку, вызвавшую перемещение библиотеки с этой функцией?
Или есть абсолютная гарантия, что адрес LoadLibrary у всех один?
> в качестве параметра LoadLibrary нужно > передать адрес строки с именем DLL в адресном пространстве > процесса-мишени. Выделить память для этой строки в чужом > адресном пространстве можно используя VirtuaAllocEx, > записать туда имя DLL c помощью WriteProcessMemory. Когда > внедренная DLL будет загружена и вызвана DllMain c > уведомлением DLL_PROCESS_ATTACH уже можешь делать делать > любые API вызовы.
Могу предложить альтернативный метод создания потока в чужом процессе (работает не во всех случаях, но зато на всех виндах): Ставим хук на сообщение, посылаем сообщение, в обработчике создаём поток, хук снимаем. Сам так делал.
[Win32] IMHO, offtopic!28.10.01 10:14 Автор: SerpentFly <Vadim Smirnov> Статус: Member
Практически по всем вопросам RTFM Рихтера, я уже притомился его цитировать. В дополнение могу только рекомендовать глянуть на библиотеку EliCZ'a, но она не особо удобочитаема. Суть сводиться к тому что действительно хорошего универсального метода нет, поэтому в каждом конкретном случае задачу нужно решать по своему...
> Практически по всем вопросам RTFM Рихтера, я уже притомился > его цитировать. В дополнение могу только рекомендовать > глянуть на библиотеку EliCZ'a, но она не особо > удобочитаема. Суть сводиться к тому что действительно > хорошего универсального метода нет, поэтому в каждом > конкретном случае задачу нужно решать по своему... А не подскажешь, есть ли способ скрыть процесс в 98-х, например, методом встраивания потока в чужой процесс, но так чтобы это делалось с помощью одного exe-файла, без всяких дополнительных длл. Спасибо!!!
[Win32] IMHO, offtopic!29.10.01 09:40 Автор: SerpentFly <Vadim Smirnov> Статус: Member
> А не подскажешь, есть ли способ скрыть процесс в 98-х, > например, методом встраивания потока в чужой процесс, но > так чтобы это делалось с помощью одного exe-файла, без > всяких дополнительных длл. Спасибо!!!
А то как в BO2k сделано не устраивает совсем (там патчат ToolHelp API)?
> > А не подскажешь, есть ли способ скрыть процесс в 98-х, > > например, методом встраивания потока в чужой процесс, > но > > так чтобы это делалось с помощью одного exe-файла, без > > всяких дополнительных длл. Спасибо!!! > > А то как в BO2k сделано не устраивает совсем (там патчат > ToolHelp API)?
Насколько я понял там прямо кернел.длл патчат, мне кажется антивирусы на такие штуки уже натасканы, мне нужно чтобы антивирус не видел.
[Win32] IMHO, offtopic!29.10.01 19:54 Автор: SerpentFly <Vadim Smirnov> Статус: Member
> Насколько я понял там прямо кернел.длл патчат, мне кажется > антивирусы на такие штуки уже натасканы, мне нужно чтобы > антивирус не видел.
В общем-то да, тогда кроме RegisterServiceProcess боюсь в твоем варианте ничего не придумаешь, хотя эту фишку я бы на месте антивирусов тоже должно быть просекал...
RegisterServiceProcess31.10.01 16:48 Автор: dron <Ivanov Andrey> Статус: Member
> > Насколько я понял там прямо кернел.длл патчат, мне > кажется > > антивирусы на такие штуки уже натасканы, мне нужно > чтобы > > антивирус не видел. > > В общем-то да, тогда кроме RegisterServiceProcess боюсь в > твоем варианте ничего не придумаешь, хотя эту фишку я бы на > месте антивирусов тоже должно быть просекал...
Чего-то я не могу найти упоминания о RegisterServiceProcess, единственное, что я выяснил, что это не API-функция , так как в MSDN ее нет, если не сложно -поподробнее об этом методе или хотя бы ссылочку где он описывается. Спасибо!
[Win32] RegisterServiceProcess31.10.01 18:17 Автор: SerpentFly <Vadim Smirnov> Статус: Member
> Чего-то я не могу найти упоминания о > RegisterServiceProcess, единственное, что я выяснил, что > это не API-функция , так как в MSDN ее нет, если не сложно > -поподробнее об этом методе или хотя бы ссылочку где он > описывается. Спасибо!
В общем-то API, только недокументированная, экпортируется kernel32.dll
Вызывать можно например так:
typedef DWORD (__stdcall *pRegFunction)(DWORD, DWORD);
#define RSP_SIMPLE_SERVICE 1
#define RSP_UNREGISTER_SERVICE 0
> В общем-то API, только недокументированная, экпортируется > kernel32.dll > > Вызывать можно например так: > typedef DWORD (__stdcall *pRegFunction)(DWORD, DWORD); > #define RSP_SIMPLE_SERVICE 1 > #define RSP_UNREGISTER_SERVICE 0 > > pRegFunction RegisterServiceProcess; > HMODULE hm = ::GetModuleHandle("KERNEL32.DLL"); > RegisterServiceProcess = (pRegFunction)::GetProcAddress(hm, > "RegisterServiceProcess"); > RegisterServiceProcess(::GetCurrentProcessId(), > RSP_SIMPLE_SERVICE); Блин, как все оказалось просто!! В итоге все работает, правда хорошим антивирусом еще не проверял,но, я думаю раз CreateRemoteProcess в win2000 не ловится, то и эта ловится не будет. Большое Спасибо!!!
И у меня вопрос тоже!27.10.01 18:35 Автор: dron Статус: Незарегистрированный пользователь
> > > Открываю процесс, выделяю в нем память, пишу туда > код > > > потока, запускаю поток функцией > CreateRemoteThread. > > При > > > попытке вызвать из кода любую API функцию > приложение, > > в > > > которое я влезаю вылетает. Как получить адреса > API > > функций, > > > чтобы их вызывать? > > > > Технология описана в последнем издании Рихтера, > > действительно невозможно вызывать API функции в твоей > > ситуации, поскольку вызовы импортируемых функций при > > статическом связывании осуществляются через шлюзы > таблицы > > импорта. Однако этот метод можно использовать для > загрузки > > своей DLL в чужой процесс, для этого в > CreateRemoteThread > > нужно передать в качестве функции потока абсолютный > адрес > > LoadLibraryA(LoadLibraryW) полученный вызовом > > GetProcAddress, > Надеясь на то, что никто не создал библиотеку, вызвавшую > перемещение библиотеки с этой функцией? > Или есть абсолютная гарантия, что адрес LoadLibrary у всех > один? > > > в качестве параметра LoadLibrary нужно > > передать адрес строки с именем DLL в адресном > пространстве > > процесса-мишени. Выделить память для этой строки в > чужом > > адресном пространстве можно используя VirtuaAllocEx, > > записать туда имя DLL c помощью WriteProcessMemory. > Когда > > внедренная DLL будет загружена и вызвана DllMain c > > уведомлением DLL_PROCESS_ATTACH уже можешь делать > делать > > любые API вызовы. > > Могу предложить альтернативный метод создания потока в > чужом процессе (работает не во всех случаях, но зато на > всех виндах): Ставим хук на сообщение, посылаем сообщение, > в обработчике создаём поток, хук снимаем. Сам так делал.
Если можно, пожайлуста, поподробнее о последнем способе! А тоя под 2000 процесс скрыл, теперь надо под 98, а я точно не знаю какой метод выбрать. Так что если есть предложения буду очень благодарен!
> Надеясь на то, что никто не создал библиотеку, вызвавшую > перемещение библиотеки с этой функцией? > Или есть абсолютная гарантия, что адрес LoadLibrary у всех > один?
LoadLibrary - kernel32.dll
имхо её некому смещать :)
получается что универсальных методов внедрения своего кода в чужой процесс нет ? (которые работают на всех виндах и со всеми процессами)
ответ + у меня тоже вопрос :)28.10.01 00:34 Автор: Biasha <Бяша> Статус: Member
> > Надеясь на то, что никто не создал библиотеку, > вызвавшую > > перемещение библиотеки с этой функцией? > > Или есть абсолютная гарантия, что адрес LoadLibrary у > всех > > один? > > LoadLibrary - kernel32.dll > имхо её некому смещать :) kernel32.dll загружается первым? Все системные загружаютя в первую очередь? Это где-то в официальном источнике написано?
> получается что универсальных методов внедрения своего кода > в чужой процесс нет ? (которые работают на всех виндах и со > всеми процессами) Мой метод не работает со всеми процессами, имеющими поток, обрабатывающий сообщения. (кажеться:)
ответ + у меня тоже вопрос :)28.10.01 01:23 Автор: ggg <ggg> Статус: Elderman
> щас попробую длл сделать с imagebase как у kernel32 и > поставить её в import table первой :) > о результатах позже сообщу :)
результаты :)
The system DLL kernel32.dll was relocated in memory. The application will not run properly. The relocation occurred because the DLL dllname.dll occupied an address range reserved for Windows system DLLs. The vendor supplying the DLL should be contacted for a new DLL.
Это в MessageBox'е? Ну и слава богу :)28.10.01 08:37 Автор: Biasha <Бяша> Статус: Member
> Открываю процесс, выделяю в нем память, пишу туда код > потока, запускаю поток функцией CreateRemoteThread. При > попытке вызвать из кода любую API функцию приложение, в > которое я влезаю вылетает. Как получить адреса API функций, > чтобы их вызывать?
вызов API функций у тебя происходит через import table
когда ты копируешь только код своей функции, то import table нету
ещё проблема - при загрузке код привязывается к абсолютным адресам - его нельзя просто так двигать в памяти
такие вещи нужно писать на ассемблере
тогда ты сам сможешь контроллировать что именно ты вызываешь