![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
перехват
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]А ты приведи код, как ты это делаешь - тогда может и можно что-то определенное сказать