Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов API функций в чужом процессе


Страницы:   1 2

The Scorpion ©   (2004-11-05 12:46:00) 

Объясните ,пожалуйста, почему при вызове API функций ,в чужом процессе ,этот процесс завершается .Как этого избежать?


kaZaNoVa   (2004-11-06 18:26:00) [1]

Удалено модератором
Примечание: Offtopic


kaZaNoVa   (2004-11-06 18:18:00) [2]

Удалено модератором
Примечание: Нельзя


kaZaNoVa   (2004-11-06 18:17:00) [3]

Удалено модератором
Примечание: Шел бы ты на хакерские сайты


kaZaNoVa   (2004-11-06 17:33:00) [4]

Wiz@rd   (06.11.04 16:11) [31]
супер, спасибо !


Wiz@rd   (2004-11-06 16:11:00) [5]

http://iamaphex.cjb.net- там вместе библиотекой afxCodeHook идёт пример Remote Execute - то что нужно!


n0name   (2004-11-06 16:08:00) [6]

The Scorpion   (05.11.04 18:46) [25]

В винде можно многое, но как ты собираешься создавайть поток, конечно функцией CreateThread, посмотри какие параметры она принимает(да хоть в MSDN). В их чисте есть аргумент стартуемого потока. Он один, и ты никак(документированно) не передашь ещё один или несколько параметров своему потоку, как правильно заметил Игорь читай Рихтера.

The Scorpion   (06.11.04 00:01) [28]

SuspendThread+GetThreadContext


Игорь Шевченко   (2004-11-06 00:29:00) [7]

The Scorpion   (06.11.04 00:01) [28]

Я еще раз настоятельно советую почитать Рихтера. Объяснять здесь все по пунктам у меня нет ни времени, ни трафика.


The Scorpion   (2004-11-06 00:01:00) [8]

Как получить указатель на стек ?и как получить значение IP?
Для чужого процесса.


Игорь Шевченко   (2004-11-05 20:16:00) [9]


> Т.е. ты хочешь сказать что поток МОЖЕТ БЫТЬ ТОЛЬКО функцией
> с возвращающем dword и аргументом pointer?!Смелое заявление
> ,я  могу опровергнуть его бесчисленное число раз.


Возвращать она может практически что угодно, а вот 4-х быйтовый аргумент должна принимать. И соответствовать соглашению о вызовах stdcall.

ЗЫ: Почему бы Рихтера не почитать, прежде чем спорить ?

Кстати, описываемая тобой функция будет работать только до момента возврата, далее следует закономерное AV из-за некорректного стека. А поскольку функция занимается бесконечным циклом, то возврата из нее не будет.


kaZaNoVa   (2004-11-05 19:09:00) [10]

ИМХО винда часто позволяет такое, о чём даже и не подумаешь, и иногда даже то,что не должно работать, работает :)))
- имхо ...


The Scorpion   (2004-11-05 18:46:00) [11]

"Сейчас лопну от смеха:((("
Объясняю для особо ударенных это был сарказм(a это ирония).

"от тупости ты лопнешь, а не от смеха.
когда ты не хихикал бы и не демонстрировал дешевую упертость, у тебя хватило бы мозгов открыть справку хотя бы к ф-ции CreateThread() и увидеть там следующее :"
Мозгов хватило.

"DWORD WINAPI ThreadFunc( LPVOID );
после чего сравнить со своей декларацией и поняв, что она ЯВНО отличается от ориг.док-ции, прекратить дурацкий спор и выполнить хотя бы ЭТИ рекуомендации .. не говоря уже об остальных, устраняющих порочие отмеченные грубые несуразности твоего кода."

Т.е. ты хочешь сказать что поток МОЖЕТ БЫТЬ ТОЛЬКО функцией с возвращающем dword и аргументом pointer?!Смелое заявление ,я  могу опровергнуть его бесчисленное число раз.


kaZaNoVa   (2004-11-05 18:20:00) [12]

Digitman ©   (05.11.04 18:12) [22]
возможно ..  но код же зацикливается, нить создаётся  ...


kaZaNoVa   (2004-11-05 18:20:00) [13]

Digitman ©   (05.11.04 17:29) [18]

>  далее - дело примитивной техники : готовишь свою ДЛЛ
> и грузишь ее в "чужом" АП вызовом CreateRemoteThread с
> указанием FixedAddress в кач-ве адреса поточной ф-ции

это конечно самый лучший выход ..

НО иногда нужно делать безDll - например организация обхода фаерволла, через внедрение в процесс, которому разрешён доступ в инет, при этом подгружать Dll недопустимо потому, что "контроль компонентов" фаерволла "завопит" - "изменились модули процесса" ..
- я правда это не реализовывал, но те, наработки, которые есть, дают возможность сделать такой вывод ...

//просьба не считать это "хакингом" - это всего лишь один из способов применения CreateRemoteThread, где "надо без Dll" ;)

//зы в А311 это УЖЕ Реализовано !!
- уже надо искать "противоядие"


Digitman   (2004-11-05 18:12:00) [14]


> kaZaNoVa ©   (05.11.04 17:54) [21]


о чудесах ты волен рассказывать все что угодно и сколь угодно долго, но страницы памяти, распределенные под исполняемый код, обязаны иметь атрибут EXECUTE.


kaZaNoVa   (2004-11-05 17:54:00) [15]

Digitman ©
я скопировал этот код, и "натравил" на Explorer -  в нём создалась нить, пожирающая 99% ресурсов проца - убил её Process Explorerom, всё стало нормально ..
поэтому, я думаю, как не смешно, но Работает !!!  (система 2003)
я делал так:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 con:_context;
    h,id,newh,PH,id2:thandle;
    p,pp:pointer;
    sm,sm2,k:dword;
    mas:array [1..50] of byte;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

procedure f;
Var t:integer;
begin
// ЛЮБАЯ функция написанная здесь завершает процесс
while true do t:=1;
//Application.Initialize;
//Application.CreateForm(TForm1, Form1);
//Application.Run;
end;
procedure EndCod;
begin

end;

begin
GetWindowThreadProcessID(FindWindow('Progman', nil),Id2);

h:=openprocess(PROCESS_all_access ,false,id2);
//SetThreadContext (getcurrentprocess,con);

sm:=dword(@endcod);
sm2:=dword(@f) ;
sm:=sm-sm2;
p:=VirtualAllocEx(h,nil,sm,MEM_RESERVE OR MEM_COMMIT  ,PAGE_READWRITE);

if WriteProcessMemory(h,p,@F,sm,k) then
newh:=CreateRemoteThread(h,nil,0,p,nil,CREATE_SUSPENDED,id);

ResumeThread(newh);

end;

end.


Digitman   (2004-11-05 17:37:00) [16]


> Сейчас лопну от смеха


от тупости ты лопнешь, а не от смеха.
когда ты не хихикал бы и не демонстрировал дешевую упертость, у тебя хватило бы мозгов открыть справку хотя бы к ф-ции CreateThread() и увидеть там следующее :

lpStartAddress

The starting address of the new thread. This is typically the address of a function declared with the WINAPI calling convention that accepts a single 32-bit pointer as an argument and returns a 32-bit exit code. Its prototype is:

DWORD WINAPI ThreadFunc( LPVOID );

после чего сравнить со своей декларацией и поняв, что она ЯВНО отличается от ориг.док-ции, прекратить дурацкий спор и выполнить хотя бы ЭТИ рекуомендации .. не говоря уже об остальных, устраняющих порочие отмеченные грубые несуразности твоего кода.


Digitman   (2004-11-05 17:31:00) [17]


> Это не ошибки ,а пожелания , причем твои.


это не мои "пожелания", а абсолютно реальные требования платформы, при реализации которых ты осуществишь то что тебе нужно


Digitman   (2004-11-05 17:29:00) [18]


> The Scorpion   (05.11.04 17:08) [13]
> "Ссылки импорта не настроены."
> Не могли бы вы подсказать как сие осуществить.


1. Определить базовый адрес загруженного kernel32-модуля
2. Получить адрес точек входа в имп. из него ф-ции LoadLibrary, GetProcAddress
3. Вызвать эти ф-ции для получения факт.адресов интересующих прочих WinAPI-функций
4. После успешного получения факт.адресов собственно и и вызывать эти АПИ-ф-ции.

Есть еще вариант - не занимать всей этой хреновиной, а положиться на вполне реальный по сей момент факт, что базовый адрес загрузки kernel32 всегда фиксирован для данной ОС и для данного ее сеанса, и вызывать удаленную поточную ф-цию, передавая ей адрес, равный полученному вызовом FixedAddress := GetProcAddress(hKernel32, 'LoadLibrary') в "своем" процессе ... далее - дело примитивной техники : готовишь свою ДЛЛ и грузишь ее в "чужом" АП вызовом CreateRemoteThread с указанием FixedAddress в кач-ве адреса поточной ф-ции


> Мой код создает поток с активным циклом ожидания(загрузка
> процессора=99.99%).


значит, реальный код выглядит иначе, нежели приведенный здесь.


> Сейчас лопну от смеха


тебе помощь нужна ? или клоунада ?


Игорь Шевченко   (2004-11-05 17:17:00) [19]

The Scorpion   (05.11.04 17:08) [13]


> Не могли бы вы подсказать как сие осуществить.


Почитать книгу Джеффри Рихтера "Создание эффективных WIN32-приложений", там все подробно написано, найти в электронном виде можно на http://www.podgoretsky.com


The Scorpion   (2004-11-05 17:16:00) [20]

"не гни пальцы.
в твоем коде даже невоор.глазом сразу видны как минимум 3 грубейшие ошибки."
Это не ошибки ,а пожелания , причем твои.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо