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

Вниз

Проблемы при перехвате IDispatch::Invoke   Найти похожие ветки 

 
Ihor Osov'yak ©   (2004-07-01 00:26) [40]

будет окончательный.. Через несколько дней..


 
GuAV ©   (2004-07-01 00:40) [41]


> procedure SimpleHook2
> asm
> POP EAX
> MOV DWORD PTR [@@_return_addr],EAX
> ..
> CALL old__Entry
> db 0e9h  // JMP disp (4)
> @@_return_addr: dd 0  // адрес возврата
> end;

Не пойдет, в код писать в винде оказывается нельзя :(

2 Ihor Osov"yak ©
Да, я понимаю, но не хочется чтобы ветка в архив упала, так что поддерживаем-с. :)
модераторы могут удалить [39] (создание путых сообщений) :)


 
GuAV ©   (2004-07-01 16:18) [42]

Рабочий код - пример создания процедуры в памяти (по крайней мере у меня рабочий :)

procedure Something;
begin
 ShowMessage("s");
end;

procedure Something1;
begin
 ShowMessage("s1");
end;

procedure Something2;
begin
 ShowMessage("s2");
end;

procedure Something3;
begin
 ShowMessage("s3");
end;

procedure SimpleHook2; assembler;
asm
 JMP @Start
 @Something_Addr: DD Something
 @Something1_Addr: DD Something1
 @Start:
 PUSH EBX
 PUSH ECX
 PUSH EDX
 CALL dword ptr [@Something_Addr]
 POP EDX
 POP ECX
 POP EBX
 jmp dword ptr [@Something1_Addr]
end;

type
 PSimpleHook2=^TSimpleHook2;
 TSimpleHook2=packed record
   code1: array[1..2] of Byte;
   InvokeHook: Pointer;
   OldProc: Pointer;
   code2: array[1..5] of Byte;
   InvokeHook__addr: Pointer;
   code3: array[1..5] of Byte;
   OldProc__addr: Pointer;
 end;

procedure TForm1.Button1Click(Sender: TObject);
type TProc=procedure;
var Hook: PSimpleHook2;
begin
 New(Hook);
 Move((@SimpleHook2)^,Hook^,SizeOf(TSimpleHook2));
 Inc(Integer(Hook.InvokeHook__addr), Integer(Hook) - Integer(@SimpleHook2));
 Inc(Integer(Hook.OldProc__addr), Integer(Hook) - Integer(@SimpleHook2));

 TProc(Hook);
 Hook.InvokeHook:=@Something2;
 Hook.OldProc:=@Something3;
 TProc(Hook);

 Dispose(Hook);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 SimpleHook2;
end;


 
GuAV ©   (2004-07-01 16:56) [43]

...или даже так:
procedure Something2;
begin
 ShowMessage("s2");
end;

procedure Something3;
begin
 ShowMessage("s3");
end;

procedure SimpleHook2; assembler;
asm
 PUSH EBX
 PUSH ECX
 PUSH EDX
 CALL Something
 POP EDX
 POP ECX
 POP EBX
 jmp Something1
end;

type
 PSimpleHook2=^TSimpleHook2;
 TSimpleHook2=packed record
   code1: array[1..4] of Byte;
   InvokeHook: Pointer;
   code2: array[1..4] of Byte;
   OldProc: Pointer;
 end;

procedure TForm1.Button1Click(Sender: TObject);
type TProc=procedure;
var Hook: PSimpleHook2;
begin
 New(Hook);
 Move((@SimpleHook2)^,Hook^,SizeOf(TSimpleHook2));
 Hook.InvokeHook:=Pointer(Integer(@Something2)-Integer(@Hook.InvokeHook)-4);
 Hook.OldProc:=Pointer(Integer(@Something3)-Integer(@Hook.OldProc)-4);

 TProc(Hook);
 Dispose(Hook);
end;


 
GuAV ©   (2004-07-01 17:07) [44]

или даже так
procedure Something2;
begin
 ShowMessage("s2");
end;

procedure Something3;
begin
 ShowMessage("s3");
end;

procedure SimpleHook2; assembler;
asm
 PUSH EBX
 PUSH ECX
 PUSH EDX
 CALL Something
 POP EDX
 POP ECX
 POP EBX
 jmp Something1
end;

type
 PSimpleHook2=^TSimpleHook2;
 TSimpleHook2=packed record
   code1: array[1..4] of Byte;
   InvokeHook: Pointer;
   code2: array[1..4] of Byte;
   OldProc: Pointer;
 end;

procedure TForm1.Button1Click(Sender: TObject);
type TProc=procedure;
var Hook: PSimpleHook2;
begin
 New(Hook);
 Move((@SimpleHook2)^,Hook^,SizeOf(TSimpleHook2));
 Hook.InvokeHook:=Pointer(Integer(@Something2)-Integer(@Hook.InvokeHook)-4);
 Hook.OldProc:=Pointer(Integer(@Something3)-Integer(@Hook.OldProc)-4);

 TProc(Hook);
 Dispose(Hook);
end;


 
GuAV ©   (2004-07-06 23:21) [45]

<off>
Уезжаю завтра. Просьба прислать окончательный результат на мыло (векта имхо не доживет до моего приезда)


 
evvcom ©   (2004-07-07 00:11) [46]


> Не пойдет, в код писать в винде оказывается нельзя :(

В 9x вроде так пройдет, а в NT можно, если снять защиту через VirtualProtect(Ex). И если не получится прямая запись после этого, то через WriteProcessMemory я уж точно писал.


 
GuAV ©   (2004-07-07 00:58) [47]


> В 9x вроде так пройдет

У меня не пошло. Юзаю 98 - консерватизьм. записал, но выполнился старый код.
Это видел в паскале процедура кажется IntNo в unit dos...
имхо это кэш проца - я в этом еще не особо разобрался...



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

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

Наверх




Память: 0.54 MB
Время: 0.061 c
4-1088495082
pavel_guzhanov
2004-06-29 11:44
2004.08.15
Нажатие кнопки в другой программе


1-1091092138
Dmirty
2004-07-29 13:08
2004.08.15
Изменение ширины кнопок вместе с шириной строк в StringGrid-е


14-1091107443
rea
2004-07-29 17:24
2004.08.15
Trial


3-1090310320
Nikolai_S
2004-07-20 11:58
2004.08.15
Коннект к SQL Server через OLE DB


3-1090391272
SergP
2004-07-21 10:27
2004.08.15
Помогите с запросом (SELECT)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский