Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
The Scorpion   (2004-11-05 12:46) [0]

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


 
Digitman ©   (2004-11-05 13:13) [1]


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


в "чужом" процессе невозможно вызвать API функцию, не выдумывай небылиц.


 
The Scorpion   (2004-11-05 13:18) [2]

Создаешь в чужом процессе поток(CreateRemoteThread).И этот поток вызываtт API функцию.Очень даже возможно.


 
kaZaNoVa ©   (2004-11-05 13:44) [3]

The Scorpion   (05.11.04 13:18) [2]
ага, но имхо это извращение :)


 
Игорь Шевченко ©   (2004-11-05 14:10) [4]

The Scorpion   (05.11.04 13:18) [2]

Телепаты в отпуске, код в студию.


 
The Scorpion   (2004-11-05 14:28) [5]

var  con:_context;
     h,id,newh,PH:thandle;
     p,pp:pointer;
     sm,sm2,k:dword;
     mas:array [1..50] of byte;
{$R *.res}
procedure f;
begin
// ЛЮБАЯ функция написанная здесь завершает процесс
while true do;
//Application.Initialize;
//Application.CreateForm(TForm1, Form1);
//Application.Run;
end;
procedure EndCod;
begin

end;

begin

h:=openprocess(PROCESS_all_access ,false,2256);
//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.


 
Digitman ©   (2004-11-05 16:02) [6]


> Создаешь в чужом процессе поток(CreateRemoteThread).И этот
> поток вызываtт API функцию


Код этого потока работает уже в своем процессе ! Родном для него ! Ибо его маш.инструкции перед началом их выполнения размещены тобой в адр.пространстве того самого "чужого" процесса.

касаемо приведенного тобой кода можно сказать, что это сущая галиматься, которая никогда работать не будет.


 
The Scorpion   (2004-11-05 16:13) [7]

К чему это:
"Код этого потока работает уже в своем процессе ! Родном для него ! Ибо его маш.инструкции перед началом их выполнения размещены тобой в адр.пространстве того самого "чужого" процесса." ?
Я это знаю.Из этого не следует ответ на мой вопрос.

"касаемо приведенного тобой кода можно сказать, что это сущая галиматься, которая никогда работать не будет."
Тем не менее мой код худо-бедно работает.Пророк из тебя плохой:)


 
Игорь Шевченко ©   (2004-11-05 16:25) [8]


> // ЛЮБАЯ функция написанная здесь завершает процесс


Разумеется. Ссылки импорта не настроены.


 
Digitman ©   (2004-11-05 16:29) [9]


> The Scorpion   (05.11.04 16:13) [7]


> Я это знаю.Из этого не следует ответ на мой вопрос.


ответа при такой постановке вопроса попросту не существует.


> Тем не менее мой код худо-бедно работает.Пророк из тебя
> пл


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

1. Декларация стартуемой тобой поточной ф-ции не соответствует прототипу поточных ф-ций в соответствии с требованиями Майкрософт.

2. Атрибут PAGE_READWRITE не дает EXECUTE-доступа к страницам

3. Позиционно-зависимый код тела "ЛЮБОЙ" поточной ф-ции рано или поздно приведет к искл.ситуации.


 
Digitman ©   (2004-11-05 16:32) [10]


> The Scorpion  


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


 
kaZaNoVa ©   (2004-11-05 16:35) [11]

Самое смешное то, что код
The Scorpion   (05.11.04 14:28) [5]
работает :)
правда работает тока "сам по себе"  ..


 
Digitman ©   (2004-11-05 16:39) [12]


> kaZaNoVa ©   (05.11.04 16:35) [11]


> работает тока "сам по себе"


как же он будет работать, если атрибуты доступа распределенных им страниц региона не содержат EXECUTE-атрибута ? на основании чего ты сделал такое умозаключение ?


 
The Scorpion   (2004-11-05 17:08) [13]

"Разумеется. Ссылки импорта не настроены."
Не могли бы вы подсказать как сие осуществить.


 
The Scorpion   (2004-11-05 17:11) [14]

"как же он будет работать, если атрибуты доступа распределенных им страниц региона не содержат EXECUTE-атрибута ? на основании чего ты сделал такое умозаключение ?"
Мой код создает поток с активным циклом ожидания(загрузка процессора=99.99%).


 
The Scorpion   (2004-11-05 17:13) [15]

"Самое смешное то, что код
The Scorpion   (05.11.04 14:28) [5]
работает :)
правда работает тока "сам по себе"  .."

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


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

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


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

The Scorpion   (05.11.04 17:08) [13]


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


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


 
Digitman ©   (2004-11-05 17:29) [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%).


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


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


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


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


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


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


 
Digitman ©   (2004-11-05 17:37) [20]


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


от тупости ты лопнешь, а не от смеха.
когда ты не хихикал бы и не демонстрировал дешевую упертость, у тебя хватило бы мозгов открыть справку хотя бы к ф-ции 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 );

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


 
kaZaNoVa ©   (2004-11-05 17:54) [21]

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 18:12) [22]


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


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


 
kaZaNoVa ©   (2004-11-05 18:20) [23]

Digitman ©   (05.11.04 17:29) [18]

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

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

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

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

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


 
kaZaNoVa ©   (2004-11-05 18:20) [24]

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


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

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

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

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

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


 
kaZaNoVa ©   (2004-11-05 19:09) [26]

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


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


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


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

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

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


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

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


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

The Scorpion   (06.11.04 00:01) [28]

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


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

The Scorpion   (05.11.04 18:46) [25]

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

The Scorpion   (06.11.04 00:01) [28]

SuspendThread+GetThreadContext


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

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


 
kaZaNoVa ©   (2004-11-06 17:33) [32]

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


 
kaZaNoVa ©   (2004-11-06 18:17) [33]

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


 
kaZaNoVa ©   (2004-11-06 18:18) [34]

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


 
kaZaNoVa ©   (2004-11-06 18:26) [35]

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.034 c
14-1101736818
AlexG
2004-11-29 17:00
2004.12.19
Злополучная фирма "БМикро"


1-1101865961
PEKAHT
2004-12-01 04:52
2004.12.19
Image мигает


1-1102307317
Ivvvan
2004-12-06 07:28
2004.12.19
Интеграция c Outlook Express


3-1100943105
Andrey V.
2004-11-20 12:31
2004.12.19
Не работает FB1.5


9-1092186341
Xerx
2004-08-11 05:05
2004.12.19
Как работает OpenGL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский