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

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

перехват


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

Powerland ©   (2004-08-26 00:35:00) 

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


Powerland   (2004-08-26 10:16:00) [141]

> после загрузки её в память

да.

> что такое в дан.случае Handle ?
хэндл, который получаем через GetCurrentProcess();


Digitman   (2004-08-26 09:51:00) [142]


> после загрузки её в память


т.е. в ходе инициализации ?


> InterceptDllCall( Handle,'user32.dll', 'MessageBoxA',@MyMessageBox,
> @MessageBoxA,p);


что такое в дан.случае Handle ?


Powerland   (2004-08-26 09:37:00) [143]

где-то в программе производим внедрение.
AttachDllToProcess(pID,'c:\hook.dll');
а далее уже в длл(после загрузки её в память) производим замену.
p - сюда будет помещён указатель на старую функцию(т.е. user32=>MessageBoxA).
InterceptDllCall(Handle,'user32.dll', 'MessageBoxA',@MyMessageBox, @MessageBoxA,p);


Digitman   (2004-08-26 08:25:00) [144]

покажи как, с какими параметрами и в каком месте текста ДЛЛ ты вызываешь ф-цию перехвата

p.s.

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


Powerland   (2004-08-26 01:06:00) [145]

причём если это производит внутри программы, т.е. SetProc внести в код программы из длл, то с в программе перехват работает успешно...


Powerland   (2004-08-26 01:05:00) [146]

а так производим замену:
function SetProc(hLocalModule: HModule; c_szDllName: Pchar; c_szApiName: PChar; pApiNew: Pointer; p_pApiOrg: PPointer; pApiToChange: Pointer): Boolean;
var
 pDosHeader: PImageDosHeader;
 pNtHeader: PImageNtHeaders;
 PImportDesc: PImageImportDescriptor;
 dwProtect: DWORD;
 dwNewProtect: DWORD;
 dwAddressToInterCept: DWORD;
 pThunk: PImageThunkData;
begin
 pDosHeader := PImageDosHeader(hLocalModule);
 Result := False;
 if (pApiToChange <> nil) then
   dwAddressToIntercept := DWORD(pApiToChange)
 else
   dwAddressToIntercept := Dword(GetProcAddress(GetModuleHandle(c_szDllName),c_szApiName));
 if IsBadReadPtr(Pointer(hLocalModule), sizeof(PImageNtHeaders)) then
   Exit;
 if pDosHeader.e_magic <> IMAGE_DOS_SIGNATURE then
   Exit;
 pNtHeader := PImageNtHeaders(MakePtr(DWord(pDOSHeader),DWord(pDOSHeader.e_lfanew)));
 if pNTHeader.signature <> IMAGE_NT_SIGNATURE then
   Exit;
 pImportDesc := PImageImportDescriptor(MakePtr(hLocalModule,pNtHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Virtual Address));
 if (PImportDesc = PImageImportDescriptor(pNtHeader)) then
   Exit;
 while (pImportDesc.Name > 0) do
 begin
   pThunk := PImageThunkData(MakePtr(DWord(hLocalModule),
     Dword(pImportDesc.FirstThunk)));
   while (pThunk.u1.Functionn <> nil) do
   begin
     if DWord(pThunk.u1.Functionn) = dwAddressToIntercept then
     begin
       if not IsBadWritePtr(Pointer(@pThunk.u1.Functionn), sizeof(DWORD)) then
       begin
         if (p_pApiOrg <> nil) then
           p_pApiOrg^ := Pointer(pThunk.u1.Functionn);
         pThunk.u1.Functionn := pApiNew;
         Result := True;
       end
       else
       begin
         if VirtualProtect(Pointer(@pThunk.u1.Functionn), sizeof(DWORD),PAGE_EXECUTE_READWRITE, @dwProtect) then
         begin
           if (p_pApiOrg <> nil) then
             p_pApiOrg^ := Pointer(pThunk.u1.Functionn);
           pThunk.u1.Functionn := PDWORD(pApiNew);
           Result := True;
           dwNewProtect := dwProtect;
           VirtualProtect(Pointer(@pThunk.u1.Functionn), sizeof(DWORD),dwNewProtect, @dwProtect);
         end;
       end;
     end;
     Inc(PThunk);
   end;
   Inc(pImportDEsc);
 end;
end;


Powerland   (2004-08-26 01:04:00) [147]

вот так внедряем длл:
procedure AttachDllToProcess(pID: integer; LibName: string);
var
 ThreadID: Cardinal;
 ThreadHndl: THandle;
 AllocBuffer: Pointer;
 BytesWritten: Cardinal;
 ProcAddr: Pointer;
 ExitCode: Cardinal;
 hProcess: integer;
begin
 hProcess:=OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE, false, pID);
 if (hProcess=0) then
   Exit;
 AllocBuffer:=VirtualAllocEx(hProcess, nil, length(LibName)+1, MEM_COMMIT, PAGE_READWRITE);
 if (AllocBuffer<>nil) then
   WriteProcessMemory(hProcess, AllocBuffer, PChar(LibName), length(LibName)+1, BytesWritten)
 else
   Exit;
 ProcAddr:=GetProcAddress(LoadLibrary(PChar('Kernel32.dll')), PChar('LoadLibraryA'));
 ThreadHndl:=CreateRemoteThread(hProcess, nil, 0, ProcAddr, AllocBuffer, 0, ThreadID);
 WaitForSingleObject(ThreadHndl, INFINITE);
 GetExitCodeThread(ThreadHndl, ExitCode);
 CloseHandle(ThreadHndl);
 VirtualFreeEx(hProcess, AllocBuffer, 0, MEM_RELEASE);
 CloseHandle(hProcess);
end;


Гаврила   (2004-08-26 00:57:00) [148]

А ты приведи код, как ты это делаешь - тогда может и можно что-то определенное сказать


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

Наверх

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