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

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

CreateRemoteThread???


Страницы:   1 2 3 4 5 6 7 8

volser ©   (2005-01-20 19:21:00) 

Мне нужно запустить поток в чужом процесе.

Как работать с функцией
CreateRemoteThread(hProcess,nil, 0,  @myProc, nil, 0,ThreadID)

myProc - доступна только в моем адресном пространстве. Как сделать так что бы она была доступна и в hProcess?


GuAV   (2005-01-21 17:51:00) [101]

фигня. например:

procedure Z1;
var S: string;
begin
 S := 'It won''t work';
end; // ставь Breakpoint сюда. это будет уже после "конца" процедуры определенноко как начало+SizeOfProc.

procedure TForm1.FormCreate(Sender: TObject);
begin
 Caption:=IntToHex(Integer(@Z1) + SizeOfProc(@Z1), 8);
 Z1;
end;


или вот
procedure Z2;
begin
 if Form1=nil then Exit;
 Form1.Caption := 'Boo';
end;


-SeM-   (2005-01-21 17:38:00) [102]

Ну и сами функции


function SizeOfCode(Code: pointer): longword;
var
 Opcode: word;
 Modrm: byte;
 Fixed, AddressOveride: boolean;
 Last, OperandOveride, Flags, Rm, Size, Extend: longword;
begin
 try
   Last := longword(Code);
   if Code <> nil then
   begin
     AddressOveride := False;
     Fixed := False;
     OperandOveride := 4;
     Extend := 0;
     repeat
       Opcode := byte(Code^);
       Code := pointer(longword(Code) + 1);
       if Opcode = $66 then
       begin
         OperandOveride := 2;
       end
       else if Opcode = $67 then
       begin
         AddressOveride := True;
       end
       else
       begin
         if not ((Opcode and $E7) = $26) then
         begin
           if not (Opcode in [$64..$65]) then
           begin
             Fixed := True;
           end;
         end;
       end;
     until Fixed;
     if Opcode = $0f then
     begin
       Opcode := byte(Code^);
       Flags := Opcodes2[Opcode];
       Opcode := Opcode + $0f00;
       Code := pointer(longword(Code) + 1);
     end
     else
     begin
       Flags := Opcodes1[Opcode];
     end;
     if ((Flags and $0038) <> 0) then
     begin
       Modrm := byte(Code^);
       Rm := Modrm and $7;
       Code := pointer(longword(Code) + 1);
       case (Modrm and $c0) of
         $40: Size := 1;
         $80:
           begin
             if AddressOveride then
             begin
               Size := 2;
             end
             else
               Size := 4;
             end;
         else
         begin
           Size := 0;
         end;
       end;
       if not (((Modrm and $c0) <> $c0) and AddressOveride) then
       begin
         if (Rm = 4) and ((Modrm and $c0) <> $c0) then
         begin
           Rm := byte(Code^) and $7;
         end;
         if ((Modrm and $c0 = 0) and (Rm = 5)) then
         begin
           Size := 4;
         end;
         Code := pointer(longword(Code) + Size);
       end;
       if ((Flags and $0038) = $0008) then
       begin
         case Opcode of
           $f6: Extend := 0;
           $f7: Extend := 1;
           $d8: Extend := 2;
           $d9: Extend := 3;
           $da: Extend := 4;
           $db: Extend := 5;
           $dc: Extend := 6;
           $dd: Extend := 7;
           $de: Extend := 8;
           $df: Extend := 9;
         end;
         if ((Modrm and $c0) <> $c0) then
         begin
           Flags := Opcodes3[Extend][(Modrm shr 3) and $7];
         end
         else
         begin
           Flags := Opcodes3[Extend][((Modrm shr 3) and $7) + 8];
         end;
       end;
     end;
     case (Flags and $0C00) of
       $0400: Code := pointer(longword(Code) + 1);
       $0800: Code := pointer(longword(Code) + 2);
       $0C00: Code := pointer(longword(Code) + OperandOveride);
       else
       begin
         case Opcode of
           $9a, $ea: Code := pointer(longword(Code) + OperandOveride + 2);
           $c8: Code := pointer(longword(Code) + 3);
           $a0..$a3:
             begin
               if AddressOveride then
               begin
                 Code := pointer(longword(Code) + 2)
               end
               else
               begin
                 Code := pointer(longword(Code) + 4);
               end;
             end;
         end;
       end;
     end;
   end;
   Result := longword(Code) - Last;
 except
   Result := 0;
 end;
end;

function SizeOfProc(Proc: pointer): longword;
var
 Length: longword;
begin
 Result := 0;
 repeat
   Length := SizeOfCode(Proc);
   Inc(Result, Length);
   if ((Length = 1) and (byte(Proc^) = $C3)) then Break;
   Proc := pointer(longword(Proc) + Length);
 until Length = 0;
end;


-SeM-   (2005-01-21 17:37:00) [103]

GuAV ©   (21.01.05 17:12) [49]


> Однако более надёжного и точного способа найти "размер процедуры"
> подсказать не могу.


Вот так например предлагает Aphex


const

 Opcodes1: array [0..255] of word =
 (
   (16913),(17124),(8209),(8420),(33793),(35906),(0),(0),(16913),(17124),(8209),(8420),(33793),(35906),(0),(0),(16913),
   (17124),(8209),(8420),(33793),(35906),(0),(0),(16913),(17124),(8209),(8420),(33793),(35906),(0),(0),(16913),
   (17124),(8209),(8420),(33793),(35906),(0),(32768),(16913),(17124),(8209),(8420),(33793),(35906),(0),(32768),(16913),
   (17124),(8209),(8420),(33793),(35906),(0),(32768),(529),(740),(17),(228),(1025),(3138),(0),(32768),(24645),
   (24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645), (69),
   (69),(69),(69),(69),(69),(69),(69),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(0),
   (32768),(228),(16922),(0),(0),(0),(0),(3072),(11492),(1024),(9444),(0),(0),(0),(0),(5120),
   (5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(1296),
   (3488),(1296),(1440),(529),(740),(41489),(41700),(16913),(17124),(8209),(8420),(17123),(8420),(227),(416),(0),
   (57414),(57414),(57414),(57414),(57414),(57414),(57414),(32768),(0),(0),(0),(0),(0),(0),(32768),(33025),
   (33090),(769),(834),(0),(0),(0),(0),(1025),(3138),(0),(0),(32768),(32768),(0),(0),(25604),
   (25604),(25604),(25604),(25604),(25604),(25604),(25604),(27717),(27717),(27717),(27717),(27717),(27717),(27717),(27717), (17680),
   (17824),(2048),(0),(8420),(8420),(17680),(19872),(0),(0),(2048),(0),(0),(1024),(0),(0),(16656),
   (16800),(16656),(16800),(33792),(33792),(0),(32768),(8),(8),(8),(8),(8),(8),(8),(8),(5120),
   (5120),(5120),(5120),(33793),(33858),(1537),(1602),(7168),(7168),(0),(5120),(32775),(32839),(519),(583),(0),
   (0),(0),(0),(0),(0),(8),(8),(0),(0),(0),(0),(0),(0),(16656),(416)
 );

 Opcodes2: array [0..255] of word =
 (
   (280),(288),(8420),(8420),(65535),(0),(0),(0),(0),(0),(65535),(65535),(65535),(272),(0),(1325),(63),
   (575),(63),(575),(63),(63),(63),(575),(272),(65535),(65535),(65535),(65535),(65535),(65535),(65535),(16419),
   (16419),(547),(547),(65535),(65535),(65535),(65535),(63),(575),(47),(575),(61),(61),(63),(63),(0),
   (32768),(32768),(32768),(0),(0),(65535),(65535),(65535),(65535),(65535),(65535),(65535),(65535),(65535),(65535),(8420),
   (8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(16935),
   (63),(63),(63),(63),(63),(63),(63),(63),(63),(63),(63),(63),(63),(63),(63),(237),
   (237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(101),(237),(1261),
   (1192),(1192),(1192),(237),(237),(237),(0),(65535),(65535),(65535),(65535),(65535),(65535),(613),(749),(7168),
   (7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(16656),
   (16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656), (0),
   (0),(32768),(740),(18404),(17380),(49681),(49892),(0),(0),(0),(17124),(18404),(17380),(32),(8420),(49681),
   (49892),(8420),(17124),(8420),(8932),(8532),(8476),(65535),(65535),(1440),(17124),(8420),(8420),(8532),(8476),(41489),
   (41700),(1087),(548),(1125),(9388),(1087),(33064),(24581),(24581),(24581),(24581),(24581),(24581),(24581),(24581),(65535 ),
   (237),(237),(237),(237),(237),(749),(8364),(237),(237),(237),(237),(237),(237),(237),(237),(237),
   (237),(237),(237),(237),(237),(63),(749),(237),(237),(237),(237),(237),(237),(237),(237),(65535),
   (237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(0)
 );

 Opcodes3: array [0..9] of array [0..15] of word =
 (
   ((1296),(65535),(16656),(16656),(33040),(33040),(33040),(33040),(1296),(65535),(16656),(16656),(33040),(33040),(33040),( 33040)),
   ((3488),(65535),(16800),(16800),(33184),(33184),(33184),(33184),(3488),(65535),(16800),(16800),(33184),(33184),(33184),( 33184)),
   ((288),(288),(288),(288),(288),(288),(288),(288),(54),(54),(48),(48),(54),(54),(54),(54)),
   ((288),(65535),(288),(288),(272),(280),(272),(280),(48),(48),(0),(48),(0),(0),(0),(0)),
   ((288),(288),(288),(288),(288),(288),(288),(288),(54),(54),(54),(54),(65535),(0),(65535),(65535)),
   ((288),(65535),(288),(288),(65535),(304),(65535),(304),(54),(54),(54),(54),(0),(54),(54),(0)),
   ((296),(296),(296),(296),(296),(296),(296),(296),(566),(566),(48),(48),(566),(566),(566),(566)),
   ((296),(65535),(296),(296),(272),(65535),(272),(280),(48),(48),(48),(48),(48),(48),(65535),(65535)),
   ((280),(280),(280),(280),(280),(280),(280),(280),(566),(566),(48),(566),(566),(566),(566),(566)),
   ((280),(65535),(280),(280),(304),(296),(304),(296),(48),(48),(48),(48),(0),(54),(54),(65535))
 );


GuAV   (2005-01-21 17:12:00) [104]

Игорь Шевченко ©   (21.01.05 16:35) [47]

Я и не говорю что факт. Сохранение порядка процедур - тоже фича компилятора.

Однако более надёжного и точного способа найти "размер процедуры" подсказать не могу.


Kerk   (2005-01-21 16:41:00) [105]

Игорь Шевченко ©   (21.01.05 16:35) [47]
дык пофиг :)
все равно это невлияет на вычисление размера процедуры :)


Игорь Шевченко   (2005-01-21 16:35:00) [106]

GuAV ©   (21.01.05 15:34) [46]

Так это фича конкретного компилятора...И не факт, что устоявшаяся.

С уважением,


GuAV   (2005-01-21 15:34:00) [107]

Игорь Шевченко ©   (21.01.05 15:19) [43]

Может некорректно выразился, я о том что процедуры dword-aligned, т.е. размер процедуры вычисленный таким образом получистя больше необходимого на 0..3 байт.


procedure P1;
begin
end;

procedure P2;
asm
end;

procedure P3;
asm
 NOP
 NOP
 NOP
end;

procedure P4;
begin
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Memo1.Lines.Add(Format('P2-P1 = %d',[Integer(@P2)-Integer(@P1)]));
 Memo1.Lines.Add(Format('P4-P3 = %d',[Integer(@P4)-Integer(@P3)]));
// 4 в обоих случаях
end;


Игорь Шевченко   (2005-01-21 15:28:00) [108]

Kerk ©   (21.01.05 15:22) [44]

А зачем его выравнивать?

С уважением,


Kerk   (2005-01-21 15:22:00) [109]

Игорь Шевченко ©   (21.01.05 15:19) [43]
А что за align такой ?


видимо имелся ввиду мусор для выравнивания адреса начала процедуры


Игорь Шевченко   (2005-01-21 15:19:00) [110]

GuAV ©   (20.01.05 22:45) [15]


> size of align.


А что за align такой ?

С уважением,


Kerk   (2005-01-21 15:07:00) [111]

GuAV ©   (21.01.05 14:06) [41]
(кстати, можно ли из ехе экспортировать ?)

можно конечно

> Но 8 кБ релока эксплорера - маловато для дельфовского
> приложения.

ну чего у вас за заморочки? ну зачем именно дельфовское приложение? я предлагаю мыслить шире и внедрять туда приложение на Visual Prolog! :)


GuAV   (2005-01-21 14:06:00) [112]

Игорь Шевченко ©   (21.01.05 11:42) [34]
Давить вообще-то надо за такой код. Пожизненно :)


Я знаю :) Я просто хотел быстро проверить работоспособность идеи.

У меня нет CreateRemoteThread (9х), а при загрузке ехе файла собой hExe = SysInit.hInstance (что вполне логично).

Так я сделал пример из двух ехе. Передавать указатель оказалось лень, так же как и определять  ImageBase второго ехе.
(кстати, можно ли из ехе экспортировать ?)

Kerk ©   (21.01.05 10:38) [32]
Идею в общем понял. Но 8 кБ релока эксплорера - маловато для дельфовского приложения.
Можно объёдинить идеи и уйти от асма, поместив в релок Explorera delphi-код (и структуру с адресом loadlibrary, createthread и  именем ехе) который уже с помощью loadlibrary загрузит остальной ехе и передаст ему управление через createthread.


kaZaNoVa   (2005-01-21 13:44:00) [113]

volser   (21.01.05 13:36) [38]

Var
PID: Cardinal;
//-----------------------
GetWindowThreadProcessId(FindWindow('Progman', nil), @PID);


Kerk   (2005-01-21 13:38:00) [114]

volser   (21.01.05 13:36) [38]

а самому варианты посмотреть? подумать?


volser   (2005-01-21 13:36:00) [115]

какой самый простой и надежный метод запустить функцию с длл в процессе експлорера?
[6] - является таковым?


kaZaNoVa   (2005-01-21 13:02:00) [116]

Piter ©   (21.01.05 12:32) [36]
спасибо что напомнил, ветка уже ушла в архив, выложил у себя
http://sys.h14.ru/potok.html


Piter   (2005-01-21 12:32:00) [117]

volser   (21.01.05 0:24) [25]
А можно это как то проверять: занят или нет?


а зачем? Ты правильно делаешь - выделяешь пространство в адресном пространстве другого процесса - это гарантированный способ.

Вообще, попроси kaZaNoVa выложить его собственную ветку по этому вопросу, там ему умные люди много чего умного насоветовали


Fay   (2005-01-21 11:53:00) [118]

2 kaZaNoVa ©   (21.01.05 00:12) [24]
>> новероятность такого очень мала
Законы Мерфи говорят об обратном


Игорь Шевченко   (2005-01-21 11:42:00) [119]


>  I:=4566872; // из project2 - TForm1.Button1Click
>  Dec(I, $00400000);
>  Inc(I, hExe);


Давить вообще-то надо за такой код. Пожизненно :)


Kerk   (2005-01-21 10:43:00) [120]

Забыл сказать. Запускаем, жмем кнопку "Пуск" и наслаждаемся. Просто влом было другую АПИ перехватывать..


Страницы:   1 2 3 4 5 6 7 8

Наверх

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