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

Вниз

перехват   Найти похожие ветки 

 
Powerland ©   (2004-08-26 00:35) [0]

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


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

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


 
Powerland ©   (2004-08-26 01:04) [2]

вот так внедряем длл:
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;


 
Powerland ©   (2004-08-26 01:05) [3]

а так производим замену:
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:06) [4]

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


 
Digitman ©   (2004-08-26 08:25) [5]

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

p.s.

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


 
Powerland ©   (2004-08-26 09:37) [6]

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


 
Digitman ©   (2004-08-26 09:51) [7]


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


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


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


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


 
Powerland ©   (2004-08-26 10:16) [8]

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

да.

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


 
Digitman ©   (2004-08-26 10:23) [9]


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


так это же неверно !

передаваемым хэндлом д.б. хэндл того модуля, таблица импорта которого подвергается правке

например, GetModuleHandle(0)


 
Powerland ©   (2004-08-26 10:31) [10]

всё равно не работает. я раньше перехват делал другим способом. а сейчас нужно сделать именно так.


 
Digitman ©   (2004-08-26 10:43) [11]


> Powerland ©   (26.08.04 10:31) [10]


function SetProcAddress(hModule: THandle; lpProcName: PChar; pProcAddr: Pointer): Boolean;
var
 Peb: PPeb;
 hProcess, hImporter: THandle;
 pOptHdr: PImageOptionalHeader;
 pImpDir: PImageImportDescriptor;
 pExpDir: PImageExportDirectory;
 pIATEntry: PImageThunkData;
 pOldProcAddr: Pointer;
 pdwNamePtr, pdwEntryPoint: PDWord;
 pName: PChar;
 pwOrdinalPtr: PWord;
 i, nOrdinal, dwNewProcAddrRVA, dwProtect: DWord;
 pLdrData : PPEB_LDR_DATA;
 pLoadOrderList : PPLIST_ENTRY;
 pInLoadModuleEntry: PModuleEntry;
 pModuleNfo: PModuleInfo;
 pImpModuleNfo: PModuleInfo;
 sModuleName: String;
 dwDirSize: DWord;
begin
 Result := False;
 if (hModule = 0) or (lpProcName = nil) then Exit;
 peb := GetCurrentPEB;
 LockLoader(Peb);
 try
   pModuleNfo := FindModuleInfo(hModule);
   if not Assigned(pModuleNfo) then Exit;
   sModuleName := WideCharToString(pModuleNfo^.BaseDllName.Buffer);
   pOptHdr := PImageOptionalHeader(hModule + PImageDosHeader(hModule)._lfanew + SIZE_OF_NT_SIGNATURE + IMAGE_SIZEOF_FILE_HEADER);
   dwDirSize := pOptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
   if (pOptHdr^.NumberOfRvaAndSizes < 16) or (dwDirSize = 0) then Exit;
   pExpDir := PImageExportDirectory(hModule + pOptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
   pdwEntryPoint := nil;
   pwOrdinalPtr := PWord(hModule +  DWord(pExpDir^.AddressOfNameOrdinals));
  if HiWord(DWord(lpProcName)) = 0 then
     begin
       nOrdinal :=  LoWord(DWord(lpProcName)) - pExpDir^.Base;
       if (nOrdinal < pExpDir^.NumberOfFunctions) then
         pdwEntryPoint := PDWord(hModule + DWord(pExpDir^.AddressOfFunctions) + nOrdinal * SizeOf(PDWord));
     end
   else
     begin
       pdwNamePtr := PDWord(hModule + DWord(pExpDir^.AddressOfNames));
       for i := 0 to pExpDir^.NumberOfNames - 1 do
         begin
        pName := PChar(PDWord(hModule  + PDword(pdwNamePtr)^));
        if lstrcmp(pName,lpProcName) = 0 then
             begin
           nOrdinal := pwOrdinalPtr^;
               pdwEntryPoint := PDWord(hModule + DWord(pExpDir^.AddressOfFunctions) + nOrdinal * SizeOf(PDWord));
               Inc(nOrdinal, pExpDir^.Base);
           Break;
          end
           else
             begin
               Inc(pdwNamePtr);
            Inc(pwOrdinalPtr);
             end
         end;
     end;
   if not Assigned(pdwEntryPoint) then Exit;
   pOldProcAddr := Pointer(hModule + pdwEntryPoint^);
   if pOldProcAddr = pProcAddr then
     Result := True
   else
     try
       dwNewProcAddrRVA := DWord(pProcAddr) - hModule;
       hProcess := OpenProcess(PROCESS_VM_OPERATION, False, GetCurrentProcessId);
       Win32Check(hProcess <> 0);
       try
         Win32Check(VirtualProtectEx(hProcess, pExpDir, dwDirSize, PAGE_WRITECOPY, dwProtect));
         try
           pdwEntryPoint^ := dwNewProcAddrRVA;
         finally
           VirtualProtectEx(hProcess, pExpDir, dwDirSize, dwProtect, dwProtect);
         end;
         pName := PChar(sModuleName);
         pLdrData := Peb^.LdrData;
         pLoadOrderList := @pLdrData.InLoadOrderModuleList;
         pInLoadModuleEntry := PModuleEntry(pLoadOrderList^);
         while PPListEntry(pInLoadModuleEntry) <> pLoadOrderList do
           begin
             pImpModuleNfo := @pInLoadModuleEntry.ModuleInfoData;
             if pImpModuleNfo <> pModuleNfo then
               begin
                 hImporter := THandle(pImpModuleNfo^.DllBase);
                 pOptHdr := PImageOptionalHeader(hImporter + PImageDosHeader(hImporter)._lfanew + SIZE_OF_NT_SIGNATURE + IMAGE_SIZEOF_FILE_HEADER);
                 if pOptHdr^.NumberOfRvaAndSizes = 16 then
                   begin
                     dwDirSize := pOptHdr^.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size;
                     if dwDirSize > 0 then
                       begin
                         pImpDir := PImageImportDescriptor(hImporter + pOptHdr^.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
                         while Assigned(PChar(pImpDir^.RVAImportModuleName)) do
                           begin
                             if lstrcmpi(PChar(hImporter + pImpDir^.RVAImportModuleName), pName) = 0 then
                               begin
                                 pIATEntry := PImageThunkData(hImporter + DWord(pImpDir^.RVAImportAddressTable));
                                 while Assigned(pIATEntry^.Func) do
                                   begin
                                     if pIATEntry^.Func = pOldProcAddr then
                                       begin
                                         Win32Check(VirtualProtectEx(hProcess, pIATEntry, SizeOf(pIATEntry), PAGE_WRITECOPY, dwProtect));
                                         try
                                           pIATEntry^.Func := pProcAddr;
                                         finally
                                           VirtualProtectEx(hProcess, pIATEntry, SizeOf(pIATEntry), dwProtect, dwProtect);
                                         end;
                                         Break;
                                       end;
                                     Inc(pIATEntry);
                                   end;
                               end;
                             Inc(pImpDir);
                           end;
                       end;
                   end;
               end;
             pInLoadModuleEntry := PModuleEntry(pInLoadModuleEntry.InLoadOrderLinks.Flink);
           end;
       finally
         CloseHandle(hProcess);
       end;
       Result := True;
     except
     end;
 finally
   UnLockLoader(Peb);
 end;
end;


 
Powerland ©   (2004-08-26 10:49) [12]

спасибо. а можно узнать откуда этот код? хочется узнать больше относительно этой темы...


 
Digitman ©   (2004-08-26 10:49) [13]

function SetApiHook(hModule: THandle; ProcName: PChar; ProcAddr: Pointer): Pointer;
begin
 Result := GetProcAddress(hModule, ProcName);
 if Assigned(Result) and not SetProcAddress(hModule, ProcName, ProcAddr) then Result := nil;
end;

..
//установка

pOldMessageBoxA := SetApiHook(GetModuleHandle("USER32.DLL"), "MessageBoxA", @MyMessageBox);

//снятие

SetApiHook(GetModuleHandle("USER32.DLL"), "MessageBoxA", pOldMessageBoxA);


 
Powerland ©   (2004-08-26 10:52) [14]

> [12]


 
Digitman ©   (2004-08-26 10:52) [15]


> Powerland ©   (26.08.04 10:49) [12]
> откуда этот код? хочется узнать
> больше относительно этой темы...


код мой.
ориентирован только на НТ-совместимые системы


 
Powerland ©   (2004-08-26 11:01) [16]

ну а м.б. какие-то ссылки есть? может ещё чего полезного узнаю.


 
N_O ©   (2004-08-29 10:20) [17]

уважаемый Digitman. посмотрев вам код [11]  япопробовал его использовать. при компиляции было найдено много ошибок. неизвестные типы и функции.

[Error] Lib.dpr(30): Undeclared identifier: "PPeb"
[Error] Lib.dpr(41): Undeclared identifier: "PPEB_LDR_DATA"
[Error] Lib.dpr(42): Undeclared identifier: "PPLIST_ENTRY"
[Error] Lib.dpr(43): Undeclared identifier: "PModuleEntry"
[Error] Lib.dpr(44): Undeclared identifier: "PModuleInfo"
[Error] Lib.dpr(51): Undeclared identifier: "GetCurrentPEB"
[Error] Lib.dpr(52): Undeclared identifier: "LockLoader"
[Error] Lib.dpr(54): Undeclared identifier: "FindModuleInfo"
и много других ошибок. объясните незнающему человеку что это за типы и функции...


 
Digitman ©   (2004-08-29 11:56) [18]

TUNICODE_STRING = packed record
   Length: Word;
   MaximumLength: Word;
   Buffer: PWideChar;
 end;
 TNtUnicodeString = TUNICODE_STRING;
 PNtUnicodeString = ^TNtUnicodeString;

PLIST_ENTRY = ^TLIST_ENTRY;
TLIST_ENTRY = packed record
  Flink            : PLIST_ENTRY;
  Blink            : PLIST_ENTRY;
end;
PPLIST_ENTRY = ^PLIST_ENTRY;
TListEntry = TLIST_ENTRY;
PListEntry = ^TListEntry;
PPListEntry = PPLIST_ENTRY;

TModuleInfo = packed record
  DllBase          : Pointer;
  EntryPoint       : Pointer;
  SizeOfImage      : Cardinal;
  FullDllName      : TUNICODE_STRING;
  BaseDllName      : TUNICODE_STRING;
  Flags            : Cardinal;
  LoadCount        : Word;
  TlsIndex         : Word;
  HashLinks        : TLIST_ENTRY;
  SectionPointer   : Pointer;
  CheckSum         : Cardinal;
  TimeDateStamp    : Cardinal;
  LoadedImports    : Pointer;
  EntryPointActivationContext : Pointer;
end;
PModuleInfo = ^TModuleInfo;

TLDR_DATA_TABLE_ENTRY = packed record
  InLoadOrderLinks : TLIST_ENTRY;
  InMemoryOrderLinks : TLIST_ENTRY;
  InInitializationOrderLinks : TLIST_ENTRY;
  ModuleInfoData: TModuleInfo;
end;

PLDR_DATA_TABLE_ENTRY = ^TLDR_DATA_TABLE_ENTRY;
TModuleEntry = TLDR_DATA_TABLE_ENTRY;
PModuleEntry = ^TModuleEntry;

TPEB = packed record
{000}   InheritedAddressSpace : ByteBool;
{001}   ReadImageFileExecOptions : ByteBool;
{002}   BeingDebugged    : ByteBool;
{003}   SpareBool        : ByteBool;
{004}   Mutant           : Pointer;
{008}   ImageBaseAddress : Pointer;
{00C}   LdrData          : Pointer; //PPEB_LDR_DATA; { Modules list }
{010}   ProcessParameters : Pointer; //PRTL_USER_PROCESS_PARAMETERS; { _RTL_USER_PROCESS_PARAMETERS }
{014}   SubSystemData    : Pointer;
{018}   ProcessHeap      : Pointer;
{01C}   FastPebLock      : PRTLCriticalSection;
{020}   FastPebLockRoutine : Pointer;
{024}   FastPebUnlockRoutine : Pointer;
{028}   EnvironmentUpdateCount : Cardinal;
{02C}   KernelCallbackTable : Pointer;
{030}   SystemReserved   : Cardinal;
{034}   ExecuteOptions   : Cardinal; {Pos 0, 2 Bits, SpareBits  : Pos 2, 30 Bits }
{038}   FreeList         : Pointer; { _PEB_FREE_BLOCK }
{03C}   TlsExpansionCounter : Cardinal;
{040}   TlsBitmap        : Pointer;
{044}   TlsBitmapBits    : array[0..1] of Cardinal;
{04C}   ReadOnlySharedMemoryBase : Pointer;
{050}   ReadOnlySharedMemoryHeap : Pointer;
{054}   ReadOnlyStaticServerData : Pointer;
{058}   AnsiCodePageData : Pointer;
{05C}   OemCodePageData  : Pointer;
{060}   UnicodeCaseTableData : Pointer;
{064}   NumberOfProcessors : Cardinal;
{068}   NtGlobalFlag     : Cardinal;
{06C}   Reserved0        : DWord;
{070}   CriticalSectionTimeout : TLARGEINTEGER;
{078}   HeapSegmentReserve : Cardinal;
{07C}   HeapSegmentCommit : Cardinal;
{080}   HeapDeCommitTotalFreeThreshold : Cardinal;
{084}   HeapDeCommitFreeBlockThreshold : Cardinal;
{088}   NumberOfHeaps    : Cardinal;
{08C}   MaximumNumberOfHeaps : Cardinal;
{090}   ProcessHeaps     : Pointer;
{094}   GdiSharedHandleTable : Pointer;
{098}   ProcessStarterHelper : Pointer;
{09C}   GdiDCAttributeList : Cardinal;
{0A0}   LoaderLock       : PRTLCriticalSection;
{0A4}   OSMajorVersion   : Cardinal;
{0A8}   OSMinorVersion   : Cardinal;
{0AC}   OSBuildNumber    : Word;
{0AE}   OSCSDVersion     : Word;
{0B0}   OSPlatformId     : Cardinal;
{0B4}   ImageSubsystem   : Cardinal;
{0B8}   ImageSubsystemMajorVersion : Cardinal;
{0BC}   ImageSubsystemMinorVersion : Cardinal;
{0C0}   ImageProcessAffinityMask : Cardinal;
{0C4}   Reserved2        : array[0..34] of DWord;
{150}   Reserved3        : DWord;
{154}   Reserved4        : array[0..31] of DWord;
{1D4}   Win32WindowStation : THandle;
{1D8}   Reserved5        : DWord;
{1DC}   Reserved6        : DWord;
{1E0}   CSDVersion       : PWord;
{1E4}   Reserved7        : DWord;
{1E8}
 end;

PPEB = ^TPEB;

function GetCurrentPEB: PPEB;
asm
 mov   eax, fs:[TTeb.Peb]
end;

procedure LockLoader(PEB: PPEB);
begin
 RtlEnterCriticalSection(PEB.LoaderLock);
end;

procedure UnlockLoader(PEB: PPEB);
begin
 RtlLeaveCriticalSection(PEB.LoaderLock);
end;

function FindModuleInfo(hModule: THandle): PModuleInfo;
var
 Peb: PPeb;
 pLdrData : PPEB_LDR_DATA;
 pLoadOrderList : PPLIST_ENTRY;
 pInLoadModuleEntry: PModuleEntry;
begin
 Result := nil;
 if hModule = 0 then Exit;
 Peb := GetCurrentPeb;
 LockLoader(Peb);
 try
   pLdrData := Peb^.LdrData;
   pLoadOrderList := @pLdrData.InLoadOrderModuleList;
   pInLoadModuleEntry := PModuleEntry(pLoadOrderList^);
   while PPListEntry(pInLoadModuleEntry) <> pLoadOrderList do
     begin
       Result := @pInLoadModuleEntry.ModuleInfoData;
       if Result^.DllBase = Pointer(hModule) then
         Exit;
       pInLoadModuleEntry := PModuleEntry(pInLoadModuleEntry.InLoadOrderLinks.Flink);
     end;
   Result := nil;
 finally
   UnLockLoader(Peb);
 end;
end;

function GetModuleInfo(lpModule: PChar; out ModuleInfo: TModuleInfo): Boolean;
var
 peb: PPeb;
 hModule: THandle;
 pLdrData : PPEB_LDR_DATA;
 pLoadOrderList : PPLIST_ENTRY;
 pInLoadModuleEntry: PModuleEntry;
 pModuleNfo: PModuleInfo;
begin
 Result := False;
 if not Assigned(lpModule) then Exit;
 peb := GetCurrentPeb;
 LockLoader(Peb);
 try
   hModule := FindHInstance(lpModule);
   if hModule = 0 then Exit;
   if hModule <> THandle(lpModule) then
     hModule := GetModuleHandle(lpModule);
   if hModule = 0 then Exit;
   pLdrData := peb^.LdrData;
   pLoadOrderList := @pLdrData.InLoadOrderModuleList;
   pInLoadModuleEntry := PModuleEntry(pLoadOrderList^);
   while PPListEntry(pInLoadModuleEntry) <> pLoadOrderList do
     begin
       pModuleNfo := @pInLoadModuleEntry.ModuleInfoData;
       if pModuleNfo^.DllBase = Pointer(hModule) then
         begin
           if Assigned(@ModuleInfo) then
             ModuleInfo := pModuleNfo^;
           Result := True;
           Break;
         end;
       pInLoadModuleEntry := PModuleEntry(pInLoadModuleEntry.InLoadOrderLinks.Flink);
     end;
 finally
   UnLockLoader(Peb);
 end;
end;


 
kaZaNoVa   (2004-08-30 15:05) [19]

нехватает определения PPEB_LDR_DATA;
RtlEnterCriticalSection(PEB.LoaderLock);
компилятор ругается на
function GetCurrentPEB: PPEB;
asm
mov   eax, fs:[TTeb.Peb]
end;

Уважаемый  Digitman, пожалуйста, дайте _полный_ код модуля со всеми определениями, + что дополнительно прописывать в uses ;)
- мне это крайне важно !


 
Digitman ©   (2004-08-30 15:09) [20]

PClientId = ^TClientId;
 TClientId = record
   UniqueProcess: THandle; // Process ID
   UniqueThread: THandle;  // Thread ID
 end;
 CLIENT_ID = TClientId;

TPEB_LDR_DATA = packed record
  Length           : Cardinal;
  Initialized      : Byte;
  AlignmentBytes   : array[1..3] of Byte;
  SsHandle         : THandle;
  { ?????? ????????? TLDR_DATA_TABLE_ENTRY }
  InLoadOrderModuleList : PLIST_ENTRY;
  InMemoryOrderModuleList : PLIST_ENTRY;
  InInitializationOrderModuleList : PLIST_ENTRY;
  EntryInProgress  : Pointer;
end;
PPEB_LDR_DATA = ^TPEB_LDR_DATA;

 PTeb = ^TTeb;
 TTeb = packed record
   Tib               : TNtTib;
   Environment       : PWideChar;
   ClientId          : TClientId;
   RpcHandle         : THandle;
   ThreadLocalStorage: Pointer;  // PPointer
   Peb               : PPeb;
   LastErrorValue    : DWORD;
 end;
 _TEB = TTeb;

 PNtTib = ^TNtTib;
 _NT_TIB = record
   ExceptionList       : Pointer;  // ^_EXCEPTION_REGISTRATION_RECORD
   StackBase           : Pointer;
   StackLimit          : Pointer;
   SubSystemTib        : Pointer;
   case Integer of
     0: (FiberData     : Pointer);
     1: (Version       : ULONG;
 { end; }
   ArbitraryUserPointer: Pointer;
   Self                : PNtTib);
 end;
 TNtTib = _NT_TIB;


> дайте _полный_ код модуля со всеми определениями


разбежался !
там несколько тысяч строк, многие из которых не имеют отношения к сабжу ...

MSDN + Коберниченко в зубы - и вперед !! ... До полного просветления !!


 
kaZaNoVa   (2004-08-30 18:39) [21]

[20] Digitman ©   (30.08.04 15:09)
спасибо, сейчас попробую ;)

> разбежался !
> там несколько тысяч строк, многие из которых не имеют отношения
> к сабжу ...

Извините, я не хотел Вас оскорбить, НО, "неполное знание несовершенно" (как сказал классик (*не помню кто*)), если Вы даёте полностью рабочий код, то, пожалуйста, будьте добры его дать в том виде, чтобы он работал (с необходимыми обьявлениями типов и т.д.)
По поводу моей просьбы о полном коде модуля - я извиняюсь, я не знал, что он такой большой и что там много того, что не имеет отношения к рассматриваемой задаче, просто поймите, иногда так бывает обидно, когда вот так найдёшь код, который когдато был так нужен,  а он оказывается неполон, и , следовательно, не работает ... :(

про > Коберниченко
не слыхал, спасибо, поищу ...

P.S. Вы не первый раз давали это пример кода перехвата, и, каждый раз "кусочками", для понимания сложности и принципов перехвата этого может и достаточно, но для реальной работы с ним конечно же нет :)

P.P.S. я давно интересуюсь возможностими перехвата АПИ - функций, но пока у меня ничего "путного" не получалось, возможно из-за моей не очень большой квалификации . :(


 
kaZaNoVa   (2004-08-30 18:57) [22]

осталась проблема с PImageImportDescriptor,PImageThunkData и SIZE_OF_NT_SIGNATURE, будьте добры, помогите :)
please !

и что-нить "дополнительное" нужно в uses  ?


 
noname ©   (2004-08-30 20:11) [23]

Скачай HideModule:
http://dragonteam.nm.ru/Docs/F_HideModule.htm
Там в HideTypes я объявил (чуть-чуть по-другому) все необходимые мне типы. Также есть 2 Demo по перехвату API
1. Перехват модифицированнием первых байтов функции
2. Перехват изменением IAT


 
kaZaNoVa   (2004-08-30 23:47) [24]

[23] noname ©   (30.08.04 20:11)
ОГРОМНОЕ спасибо, СУПЕР модуль, как раз искал такой , ещё раз спасибо !


 
Digitman ©   (2004-08-31 09:14) [25]


> noname ©   (30.08.04 20:11) [23]


> 2. Перехват изменением IAT


еще раз повторюсь - изменения только одной IAT недостаточно, в частном случае это будет работать, в общем же случае - далеко не всегда

если процесс создает доп.тред , который получает адрес перехватываемой ф-ции динамически, т.е. по GetProcAddress(), с целью дальнейшего ее вызова, то адрес этот берется не из IAT, а из EAT, которая не подверглась соотв.изменению, и, следовательно, будет вызвана оригинальная ф-ция, а не та которая должна вызываться в рез-те перехвата ... отсюда и вывод - для таких случаев (а они оч даже нередки) необходимо кроме модификации IAT модифицировать еще и ЕAT


 
noname ©   (2004-08-31 09:37) [26]

А в чём проблема - правим в IAT адрес GetProcAddress.
Хотя я согласен, что правка EAT надёжнее =) Есть один способ загрузки не через LoadLib+GetProcAddr. То есть через PEB+EAT.


 
Digitman ©   (2004-08-31 13:06) [27]


> Хотя я согласен, что правка EAT надёжнее


не то слово

как раз это в вышеприведенном коде и реализовано - IAT + EAT


 
noname ©   (2004-08-31 13:57) [28]

Я заметил =)


 
kaZaNoVa   (2004-08-31 18:49) [29]

Digitman , осталась проблема с PImageImportDescriptor,PImageThunkData и SIZE_OF_NT_SIGNATURE, будьте добры, помогите :)
please !


 
Digitman ©   (2004-09-01 08:41) [30]

SIZE_OF_NT_SIGNATURE = SizeOf(DWord);

 IMAGE_MAX_SECTIONS                  = MAXWORD + 1; //Note that the Windows NT loader limits the Number of Sections to 96.
 IMAGE_MAX_IMPORT_MODULES            = MAXWORD + 1;
 IMAGE_MAX_IMPORT_MODULE_ENTRIES     = MAXWORD + 1;

type

 PImageImportByName = ^TImageImportByName;
 TImageImportByName = packed record
   Hint: Word;
   Name: packed array[0..0] of char;
 end;

 PImageThunkData = ^TImageThunkData;
 TImageThunkData = packed record
   case Byte of
     0: (ForwarderString: PByte);
     1: (Func:   PLongWord);
     2: (Ordinal: LongWord);
     3: (AddressOfData: PImageImportByName);
   end;

 PImportLookupTable = ^TImportLookupTable;
 TImportLookupTable = packed array[0..IMAGE_MAX_IMPORT_MODULE_ENTRIES - 1] of TImageThunkData;

 PImportAddressTable = ^TImportAddressTable;
 TImportAddressTable = packed array[0..IMAGE_MAX_IMPORT_MODULE_ENTRIES - 1] of TImageThunkData;

 PImageImportDescriptor = ^TImageImportDescriptor;
 TImageImportDescriptor = packed record
   RVAImportLookupTable: PImportLookupTable;
   TimeDateStamp: LongWord;
   FowarderChain: LongWord;
   RVAImportModuleName: LongWord;
   RVAImportAddressTable: PImportAddressTable;
 end;


 
kaZaNoVa   (2004-09-01 13:47) [31]

[30] Digitman ©   (01.09.04 08:41)
thanks, ;)


 
kaZaNoVa   (2004-09-02 14:32) [32]

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


 
Digitman ©   (2004-09-02 14:34) [33]


> kaZaNoVa   (02.09.04 14:32) [32]
> Digitman у меня получилось скомпилировать


> чем это может быть вызвано ?


да всем чем угодно
покажи как используешь ф-цию


 
kaZaNoVa   (2004-09-02 14:35) [34]

function MyMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
begin
result:=MessageBoxA(0, PChar("Call intercepted"#$A#$D"Original text is :"+lpText),
 "MessageBoxA intercepted", 0);
end;

begin
SetDebugPriv;
pOldMessageBoxA:= SetApiHook(GetModuleHandle("USER32.DLL"), "MessageBoxA", @MyMessageBoxA);
if pOldMessageBoxA<>nil then beep;
end.


 
Digitman ©   (2004-09-02 14:43) [35]


> kaZaNoVa   (02.09.04 14:35) [34]


дык ... еклмн! ... ты ж здесь влупил бесконечную рекурсию !

каждый вызов MessageBoxA приводит к вызову MyMessageBoxA, который , в свою очередь, вновь приводит к вызову MessageBoxA !

это из серии "У попа была собака .."(С)


 
Digitman ©   (2004-09-02 14:45) [36]

function MyMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
begin
result:=pOldMessageBoxA(0, PChar("Call intercepted"#$A#$D"Original text is :"+lpText),
"MessageBoxA intercepted", 0);
end;


 
kaZaNoVa   (2004-09-02 15:34) [37]

[35] Digitman ©   (02.09.04 14:43) Огромное спасибо !!!
всё получилось !
я правда немного "извратился" и сделал так:

function MyMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
begin
SetApiHook(GetModuleHandle("USER32.DLL"), "MessageBoxA", pOldMessageBoxA);
result:=MessageBoxA(0, PChar("Call intercepted"#$A#$D"Original text is :"+lpText),
 "MessageBoxA intercepted", 0);
pOldMessageBoxA:= SetApiHook(GetModuleHandle("USER32.DLL"), "MessageBoxA", @MyMessageBoxA);
end;

- я сам удивился, как сделал такую глупую ошибку с рекурсией .. совсем забыл, что функцию, которую вызываю, уже перехватил !
теперь понятно, откуда зависание и безумное потребление памяти !!!
ещё раз спасибо :)

p.s. интересно, почему все в примерах перехватывают messagebox  ??
я сперва хотел перехватить sleep() но показалось что слишком "смешная" функция .... :)))


 
Digitman ©   (2004-09-02 15:40) [38]


> kaZaNoVa   (02.09.04 15:34) [37]


работает ? ну так - ура ?! .. а куда оно денется !)


 
хакер_новичок   (2004-09-02 17:50) [39]

Удалено модератором


 
хакер_новичок   (2004-09-02 17:53) [40]

Удалено модератором



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

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

Наверх




Память: 0.62 MB
Время: 0.046 c
14-1100255146
Pentium133
2004-11-12 13:25
2004.11.28
DVD plaer


1-1100511356
Yorik
2004-11-15 12:35
2004.11.28
Как проверить только ли латинские символы в переменной?


6-1095277559
i-s-v
2004-09-15 23:45
2004.11.28
Аутентификация на SMTP сервере


1-1100198032
grigory
2004-11-11 21:33
2004.11.28
Спрятать приложение


14-1099994659
YurikGL
2004-11-09 13:04
2004.11.28
Индексация файлов