Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

Проблемы при перехвате 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 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.101 c
8-1085914054
ALex_T
2004-05-30 14:47
2004.08.15
Как избавиться от мерцания TImage при смене расположения?


4-1089098942
Mc'Simm
2004-07-06 11:29
2004.08.15
размонтирование USB


14-1091271525
Cheater
2004-07-31 14:58
2004.08.15
А чего слышно про суд над М. Джексоном?


3-1090215004
Dub
2004-07-19 09:30
2004.08.15
Типы полей в DBase


1-1091359482
dracula
2004-08-01 15:24
2004.08.15
работа со строками