Главная страница
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]

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


 
Digitman ©   (2004-09-02 18:10) [41]


хакер_новичок  



> шоб прогу спрятать ?


а нахрена ?


> дай


на


пример перехвата  NTкуерсусинфо


см. выше

отличий (за исключением имени библиотеки и имени ф-ци) -  никаких


 
хакер_новичок   (2004-09-02 18:14) [42]

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


 
хакер_новичок   (2004-09-02 18:19) [43]

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


 
Digitman ©   (2004-09-02 18:21) [44]


> не так давно начал кадить


оч надеюсь, что не гадить

остальное - завтра


 
хакер_новичок   (2004-09-02 18:24) [45]

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


 
хакер_новичок   (2004-09-02 18:45) [46]

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


 
VMcL ©   (2004-09-02 19:24) [47]

>>хакер_новичок  (02.09.04 18:45) [46]

От кого скрыть?


 
хакер_новичок   (2004-09-02 21:30) [48]

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


 
DeadMeat ©   (2004-09-02 21:43) [49]

У той проги, "котооорая вылазит по нажатию 3 кнопак", есть несколько вкладок...
А хотя кто его знает, чего у тебя вылазит по нажатию 3 кнопак. У меня например ProcessExplorer, PrKiller, Winamp, Opera, TheBat...

---
...Death Is Only The Begining...


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

Удалено модератором
Примечание: С этим на хакерские сайты


 
kaZaNoVa   (2004-09-03 21:22) [51]

Digitman
тут я подумал .. и решил поупражняться в перехвате АПИ - функций.
и в целях "спортивного интереса" решил попробовать перехватить пресловутую NtQuerySystemInformation.
Сам по себе её перехват, благодаря Вашему коду, "тривиален", сразу получился !
Намного интереснее изменить буфер, который она возвращает ;)
сперва хорошего ничего не вышло, но после 5 часов "ковыряний" всё получилось !
- просто фантастика !
всё оказалось так просто .. :)))

P.S. сейчас хочу перехватить TerminateProcess ;)

P.P.S.
Уважаемый Digitman а что будет если одну и туже функцию будут перехватывать несколько програм ?? (я пока такую ситуацию смоделировать не смог)


 
kaZaNoVa   (2004-09-03 21:23) [52]

хакер_новичок
когда САМ дойдёш до подобного кода, поверь, тебе это будет уже не интересно, так, что бросай глупости ;)


 
Игорь Шевченко ©   (2004-09-05 10:54) [53]


> Намного интереснее изменить буфер, который она возвращает
>


На всякий перехватчик найдется антиперехватчик. Который попросту может отменить все усилия по перехвату.


> всё оказалось так просто .. :)))


Ну да, Рихтер об этом написал давно и подробно...


> а что будет если одну и туже функцию будут перехватывать
> несколько програм ??


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


 
SammIk ©   (2004-09-05 12:21) [54]

Вас судари не понять))
То всех гоните в шею, мол не дадим, не знаем, нельзя)))
А как вопрос чуть изменили, так на))
Класс, надо было давно выложить исходник.
_______
Плодите хакеров недоделок?)))
_______
Бедныи чувак, когда я в сое время хотел перехватить ф-ю
я сначала изучал PE, потом искал доки по инт ф-ям(NtQ****)
потом брал асм и седел эксперементировал.
PS: Мастера, мать вашу, не даете новичкам места для разгону.
Разве так интересно?


 
kaZaNoVa   (2004-09-05 16:57) [55]

[53] Игорь Шевченко ©   (05.09.04 10:54)

> На всякий перехватчик найдется антиперехватчик. Который
> попросту может отменить все усилия по перехвату.

с этим никто и не спорит ;)
тот же ProcessExplorer превосходно показывает "спрятанный" таким образом процесс ..
+ ещё 3-4 способа нахождения списка процессов .... ;)

Я тут написал Dll"ку - с функциями перехвата, которая ставит хук, и перехватывает во всех GUI - процессах NtQuerySystemInformation ;)
- использование - из своей программы вызвать её функцию "hide"  и всё :)
знаменитый TaskMenager не замечает нужный процесс ;)

- Предложение к Игорь Шевченко - предлагаю изменить ответ в FAQ на вопрос как скрыть программу из TaskMenager"а - и привести мою Dll"ку ;_)
// там же задача скрыть ТОЛЬКО от него ;)
// как старый добрый registerserviseprocess

- Вопрос ко всем, стоит ли это делать и можно ли опубликовывать такой код полностью ?
//- имхо информация должна быть доступной !

- у кого какие мнения ?

[54] SammIk ©   (05.09.04 12:21)
поддерживаю 100%

P.S. некоторые спекулируют на "секретности" подобного кода и продают его за WM - люди, это НЕ ЧЕСТНО - делать WM из недостатка информации у людей :)


 
SammIk ©   (2004-09-05 17:00) [56]

to [55]
Серьезно продают???
Во умора))
Да публикуите что хотите, кому какое дело?
Вот даже мастера, которые в течение года(или более) не раскрывали код.
А тут на тебе дали, событие!!


 
kaZaNoVa   (2004-09-05 17:27) [57]

[56] SammIk ©   (05.09.04 17:00)
да, по 5 $


 
SammIk ©   (2004-09-05 20:15) [58]

???
Исходники?
Надо было тоже продовать)


 
kaZaNoVa   (2004-09-05 21:05) [59]

Удалено модератором
Примечание: Offtopic


 
SammIk ©   (2004-09-05 21:06) [60]

Удалено модератором
Примечание: Offtopic


 
kaZaNoVa   (2004-09-05 21:08) [61]

Удалено модератором
Примечание: Offtopic


 
SammIk ©   (2004-09-05 21:09) [62]

Удалено модератором
Примечание: Offtopic


 
kaZaNoVa   (2004-09-05 21:11) [63]

Удалено модератором
Примечание: Offtopic


 
SammIk ©   (2004-09-05 21:13) [64]

Удалено модератором
Примечание: Offtopic


 
kaZaNoVa   (2004-09-05 21:15) [65]

Удалено модератором
Примечание: Offtopic


 
SammIk ©   (2004-09-05 21:16) [66]

Удалено модератором
Примечание: Offtopic


 
kaZaNoVa   (2004-09-05 21:17) [67]

Удалено модератором
Примечание: Offtopic


 
SammIk ©   (2004-09-05 21:19) [68]

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


 
kaZaNoVa   (2004-09-05 21:21) [69]

Удалено модератором
Примечание: Offtopic


 
SammIk ©   (2004-09-05 21:24) [70]

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


 
SammIk ©   (2004-09-05 21:25) [71]

Удалено модератором
Примечание: Offtopic


 
kaZaNoVa   (2004-09-05 21:27) [72]

Удалено модератором
Примечание: Offtopic


 
kaZaNoVa   (2004-09-05 21:28) [73]

Удалено модератором
Примечание: Offtopic


 
SammIk ©   (2004-09-05 21:29) [74]

Удалено модератором
Примечание: Offtopic


 
kaZaNoVa   (2004-09-05 21:31) [75]

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


 
kaZaNoVa   (2004-09-05 21:32) [76]

Удалено модератором
Примечание: Offtopic


 
SammIk ©   (2004-09-05 21:34) [77]

На самом деле правильно реализованныи перехватчик не так легко
обнаружить.


 
kaZaNoVa   (2004-09-05 21:40) [78]

но что не легко, то согласен ...
иногда даже очень сложно ....... :)))))
но как говорил Шевченко, можно ;)))))))
всё равно всё не перехватить, иначе это уже будет фактически другая операционная система (если перехватить все функции  ;)


 
Игорь Шевченко ©   (2004-09-05 21:42) [79]


> но как говорил Шевченко, можно


И продолжает говорить - есть много способов найти "спрятанный процесс" и перехваченные функции.

ЗЫ: для личной переписки есть почта и чат.


 
kaZaNoVa   (2004-09-05 21:45) [80]

[79] Игорь Шевченко ©   (05.09.04 21:42)
>для личной переписки есть почта и чат.
иногда, когда хорошее настроение, так хочется поговорить ... :))
- "не отходя никуда"
ок, Offtopic"а больше не будет :)


 
SammIk ©   (2004-09-05 21:46) [81]

to 79
Согласен, есть. И даже у меня есть исходник под w2k. Драиверок.
И со вторым утверждением согласен)


 
kaZaNoVa   (2004-09-05 21:46) [82]

[79] Игорь Шевченко ©   (05.09.04 21:42)

> ... и перехваченные функции.

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


 
SammIk ©   (2004-09-05 21:48) [83]

Можно наити адрес ф-ю минуя всякие там getprocadr


 
kaZaNoVa   (2004-09-05 21:50) [84]

[83]
а как ? - прочитать "вручную" PE - файл и искать там в таблице экспорта ?


 
SammIk ©   (2004-09-05 21:51) [85]

Ага


 
SammIk ©   (2004-09-05 21:54) [86]

Еще мона под отладчиком


 
kaZaNoVa   (2004-09-05 21:56) [87]

ну, .. это уже сложновато .. ;)
- тогда уж ваще можно считать всю библиотеку в память, дизассамблировать, найти нужную функцию и потом уже исполнять найденные асм- комманды ;) ужас ;(
- а есть какой-нить более простой способ ?


 
kaZaNoVa   (2004-09-05 21:57) [88]

[81] SammIk ©   (05.09.04 21:46)
что за драйверок ?
- на асме ?


 
SammIk ©   (2004-09-05 21:58) [89]

Да на оном.
А чего сложного-то?
Поизучал пе и вперед


 
kaZaNoVa   (2004-09-05 22:00) [90]

да .. точно, надо будет как-нить взяться ;))
пе изучить ;))
но всё-таки, там с асма на делфя можно перекинуть ?
// на крайняк ввиде асм-вставок


 
SammIk ©   (2004-09-05 22:02) [91]

Драивер?))))
Поздравляю ветка весит 75 кило без рисунков)


 
kaZaNoVa   (2004-09-05 22:04) [92]

[91] SammIk ©   (05.09.04 22:02)
спасибо ;)
но всё-таки, одни говорят можно драйвер на делфе, другие говорят нет ...
- а ты как думаешь ? - возможно ?


 
SammIk ©   (2004-09-05 22:06) [93]

Наверное можно, но что получится не знаю.
Поэтому нельзя)


 
Игорь Шевченко ©   (2004-09-05 22:13) [94]


> но всё-таки, одни говорят можно драйвер на делфе, другие
> говорят нет ...


Нельзя. В любой программе на Delphi присутствуют вызовы функций из библиотек Windows режима пользователя. Чего в драйвере неприемлемо.


 
kaZaNoVa   (2004-09-06 07:58) [95]

Игорь Шевченко , может стоит заменить ответ в FAQ ?
(см [55] kaZaNoVa   (05.09.04 16:57) )


 
Игорь Шевченко ©   (2004-09-06 10:18) [96]

kaZaNoVa   (06.09.04 07:58) [95]

А ты можешь привести пример, когда скрытие нужно использовать в мирных целях ?

Скрыть-то все равно нельзя.


 
SammIk ©   (2004-09-06 10:24) [97]


> Игорь Шевченко ©   (06.09.04 10:18) [96]

Ведь подмена нужна не только для скрытия.
Например подменои можно приукрасить все MessageBox"ы
или есче чего-нить придумать.
А скрытие это частныи случаи.
PS:Покажите мне манету у которои только одна сторона.........


 
Игорь Шевченко ©   (2004-09-06 11:58) [98]

SammIk ©   (06.09.04 10:24) [97]


> Например подменои можно приукрасить все MessageBox"ы
> или есче чего-нить придумать.


Так этот способ у Рихтера, в RSDN Magazine и еще во многих местах описан - никакой тайны нету


 
SammIk ©   (2004-09-06 14:12) [99]

Базару нет, лично мне этот вопрос в факе освещать не надо))
А ссылку на Рихтера(не хттп) дать в ваке мона.


 
xShadow ©   (2004-09-06 14:26) [100]

Базару нет, лично мне этот вопрос в факе освещать не надо))
А ссылку на Рихтера(не хттп) дать в ваке мона.

Да эта ссылочка была бы всем полезна!
Если она есть!


 
SammIk ©   (2004-09-06 14:28) [101]

Я имел ввиду ссылку накнигу, что мол такая есть.
А кому надо пусь покупают. Или ищют.
Также поздравляю с юбилеиным 100ым постом)


 
Игорь Шевченко ©   (2004-09-06 15:11) [102]


> Базару нет, лично мне этот вопрос в факе освещать не надо))
> А ссылку на Рихтера(не хттп) дать в ваке мона.
> Да эта ссылочка была бы всем полезна!
> Если она есть!


А Яндекс конечно у всех забанен прокси...

Кому надо - найдет.


 
kaZaNoVa   (2004-09-06 15:23) [103]

[96] Игорь Шевченко ©   (06.09.04 10:18)
дело не в том, чтобы скрыть, а в том, чтобы скрыть ТОЛЬКО ОТ TaskMаnаger"а !
- если честно, то думаю, не смогу ответить - имхо всё это "от лукавого" - скрывают таким образом только программы-приколы начинающие программисты ...

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

- а сейчас существует такая ситуация - начинающие программисты, которые вдруг захотели сделать что-то "нехорошее" и скрыть программу от диспетчера задач - не могут найти доступный код, (asm и c++ не считается, я говою только за делфи).. - что порождает порой "безысходность" или они начинают искать другие решения ..
- та же дллка обнаруживается примерно в 10 раз сложнее чем процесс ..

но так, как 95% пользователей пользуются ТОЛЬКО TaskMаnаger то вполне естественно желание скрыть _только_ от него и имхо нет в этом ничего плохого ..

[99] SammIk ©   (06.09.04 14:12)
учителю русского языка ясно дело не нужен букварь ...
все мы были новичками .....

P.S. Вы меня ([96]) всё таки уже почти полностью убедили, что помещение "настоящего кода скрытия от Диспетчера" принесёт больше вреда чем пользы ...
всё таки, может .. наверное, "новички - приколисты" не должны владеть подобным кодом .................
а "профи" - его сами напишут ;)))))

P.P.S. - Каково Ваше решение - измените ответ в FAQ ?


 
Игорь Шевченко ©   (2004-09-06 15:43) [104]


> скрывают таким образом только программы-приколы начинающие
> программисты ...


Вот и нефиг. Умный сам найдет, а давать лишний повод недоумкам на этом сайте никто не собирается.


> - а сейчас существует такая ситуация - начинающие программисты,
> которые вдруг захотели сделать что-то "нехорошее" и скрыть
> программу от диспетчера задач - не могут найти доступный
> код


Какая жалость. Я сейчас расплачусь.


 
kaZaNoVa   (2004-09-06 16:03) [105]

[104] Игорь Шевченко ©   (06.09.04 15:43)
ок, всё понятно ;)))))

> Умный сам найдет, а давать лишний повод недоумкам на этом
> сайте никто не собирается.

да .. круто ;)- вы правы ;)


> Какая жалость. Я сейчас расплачусь.

- а если без иронии - то так и есть ;)
- я сам полгода назад 2 месяца искал подобный код на делфе - так тогда и не нашёл, бросил .. //на си, асме - нашёл, а вот на делфе - НЕТ
;)))


 
xShadow ©   (2004-09-06 16:09) [106]

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


 
Digitman ©   (2004-09-06 16:17) [107]


> kaZaNoVa   (06.09.04 16:03) [105]


надо было не код искать, а инф-цию по сабжу ... для изучения, анализа и дальнейшего воплощения в СОБСТВЕННОМ алгоритме и его Делфи-коде

коль скоро ты пошел от обратного и таки поимел код, то будь уж любезен не сдирать его бездумно (в каких целях - уж не заикаюсь), а внимательно изучить его строчка за строчкой с целью понять от А до Я, что там и зачем, как и почему это работает и при каких условиях


 
kaZaNoVa   (2004-09-06 16:31) [108]

Digitman ,Огромное спасибо за супер - код!!!
респект ещё раз !

Digitman ©   (06.09.04 16:17) [107]
>надо было не код искать, а инф-цию по сабжу ... для изучения, анализа и >дальнейшего воплощения в СОБСТВЕННОМ алгоритме и его Делфи-коде
Вы правы, НО информации было много,  а главное- не было ЯДРА - алгоритма перехвата АПИ - функций- был на асме, Си, но я знаю тока делфя ... ;(
так что из-за этого и не смог ничего сделать ..
// ту задачу, где надо было скрыть я решил, как уже говорил, через длл, так что перехват тогда уже был и не нужен .....

>коль скоро ты пошел от обратного и таки поимел код, то будь уж любезен не >сдирать его бездумно (в каких целях - уж не заикаюсь), а внимательно >изучить его строчка за строчкой с целью понять от А до Я, что там и зачем, >как и почему это работает и при каких условиях
- почему сразу "поимел" :)
- этот код представляет ыантастическую ценность ;))
- а собственно модификацию буфера я сделал _полностью_ САМ ;)
- после дооолгих неудачных попыток ..
- Спасибо Игорю Шевченко, за его функции работы с NtQuerySystemInformation - просто супер, они и дали мне "ключ" к пониманию принципов работы этой функции ..

- а собственно, как работает код именно перехвата - я не совсем понял (особенно раздел про Peb) - но имхо он работает, причём правильно - а больше и ничего от него и не надо !


 
Digitman ©   (2004-09-06 16:41) [109]


> собственно, как работает код именно перехвата - я не совсем
> понял (особенно раздел про Peb)


ну так а для чего тебе был намек на книгу Коберниченко ?
она как раз и дает понимание сабжа в достаточном объеме !


 
kaZaNoVa   (2004-09-06 16:46) [110]

[109] Digitman ©   (06.09.04 16:41)

> книгу Коберниченко ?
> она как раз и дает понимание сабжа в достаточном объеме
>

спасибо, если найду, то обязательно возьму, почитаю ;)

но иногда так хочется "получить результат быстро" - спросив у более опытных коллег, Мастеров своего дела :))
а так, если все вопросы переадресовывать к книгам, будет очень большой
толк, но может уйти не одна неделя .....

зы - Коберниченко можно где-нить скачать ?


 
имя   (2004-09-06 16:53) [111]

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


 
kaZaNoVa   (2004-09-06 16:59) [112]

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


 
имя   (2004-09-06 16:59) [113]

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


 
имя   (2004-09-06 17:02) [114]

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


 
kaZaNoVa   (2004-09-09 09:36) [115]

а как перехватить вызовы из драйверов ?


 
Игорь Шевченко ©   (2004-09-09 10:26) [116]


> а как перехватить вызовы из драйверов ?


Поясни свою глубокую мысль, пожалуйста...


 
kaZaNoVa   (2004-09-09 23:01) [117]

[116] Игорь Шевченко ©   (09.09.04 10:26)
я точно не знаю, можно из драйвера вызывать АПИ, например DeleteFile
а если можно, то как перехватить тогда ?


 
Игорь Шевченко ©   (2004-09-10 10:11) [118]


> можно из драйвера вызывать АПИ, например DeleteFile


Нельзя.


 
kaZaNoVa   (2004-09-10 10:27) [119]

а что за "драйвер" тут недавно был на КОЛ ?


 
Игорь Шевченко ©   (2004-09-10 11:03) [120]

kaZaNoVa   (10.09.04 10:27) [119]


> а что за "драйвер" тут недавно был на КОЛ ?


На Delphi драйвер написать нельзя в силу того, что в любой программе на Delphi присутствуют вызовы функций из DLL пользовательского режима, которые недопустимы в драйвере. Хоть KOL, хоть еще что. Если кто-то найдет способ, как поменять RTL таким образом, чтобы не было обращений к тем самым DLL, тогда можно будет. Пока не поменяли - нельзя.


 
Burmistroff   (2004-09-10 18:20) [121]

По поводу скрытия процессов -- недавно презентацию/публикацию видел, где показывалось что в принципе можно скрыть процесс поменяв ссылки в EPROCESS/KPROCESS (не помню точно где) на следующие/предыдущие элементы связного списка. Насколько я представляю, тогда процесс действительно будет обнаружить не так просто, хотя он будет оставаться законным процессом... так вот :-/


 
kaZaNoVa   (2004-09-10 19:59) [122]

[121] Burmistroff   (10.09.04 18:20)
- что-то про такое не слышал ......
поясни ?


 
noname ©   (2004-09-12 07:35) [123]

Игорь, поменяй SysInit и System на свои. И ничего не будет импортироваться из DLL.
System.pas:

unit System;

interface

procedure _InitExe;
procedure _HandleFinally;
procedure _halt0;
function ZwTerminateProcess(hProc: LongWord; Code: LongWord): Integer; stdcall;
external "ntoskrnl.exe" name "ZwTerminateProcess";
function ZwTerminateProcess2(hProc: LongWord; Code: LongWord): Integer; stdcall;
external "ntdll.dll" name "ZwTerminateProcess";

type
TGUID = record
 D1: LongWord;
 D2: Word;
 D3: Word;
 D4: array [0..7] of Byte;
end;

implementation

procedure _InitExe;
asm
end;

procedure _HandleFinally;
asm
end;

procedure _halt0;
asm
push 0
push $FFFFFFFF
call ZwTerminateProcess2
end;

end.


А потом смени Subsystem в PE-заголовке.
DriverEntry = begin end.
Потом ссылки корректируешь на загрузку, выгрузку, etc.


 
VMcL ©   (2004-09-12 12:36) [124]

>>noname ©  (12.09.04 07:35) [123]

Зачем удалять гланды через задний проход, когда можно спокойно и удобно написать драйвер на MSVC++ или MASM?


 
Alekc   (2004-09-12 15:16) [125]

Не помню где, но видел исходники vxd на дельфи, с небольшой вставкой на асме... а что тогда vxd если не драйвер ?


 
kaZaNoVa   (2004-09-12 19:15) [126]

[123] noname ©   (12.09.04 07:35)
выложи где-нить откопмилированные DCU, если не сложно ...
- для 7 делфи ..
- имхо компилять system.pas сложно ...


 
Игорь Шевченко ©   (2004-09-13 10:34) [127]

Alekc   (12.09.04 15:16) [125]

Он не на Delphi, он на ассемблере. Эта статья уже обсуждалась давно и долго.

noname ©   (12.09.04 07:35) [123]

Охотно верю.

Кстати, каких возможностей я при этом лишаюсь ?


 
noname ©   (2004-09-13 12:44) [128]

kaZaNoVa   (12.09.04 19:15) [126]
Компиль батником:

G:\PROGRAMMING\Delphi7\Bin\dcc32 -q system sysinit -m -y -z -$D
IF EXIST SysInit.~pas DEL SysInit.~pas
if exist System.~pas del System.~pas

Игорь Шевченко ©   (13.09.04 10:34) [127]
Таких же, как и при программировании драйвера на C или асме.
То есть использовании только нативных функции(Subsystem=Native).


 
Burmistroff   (2004-09-13 20:29) [129]

>noname
Хм... забавный подход. А есть какие-либо работающие (пусть даже самые примитивные) исходники драйвера такого рода? Хотелось бы попробовать :) Если не сложно, буду признателен получить их на divineglitch@mail.ru :)
Относительно преимуществ, полагаю, что имелось ввиду отсутсвие описаний тех самых NativeAPI, различных структур и прочих вещей из DDK -- все-таки самому вручную их набивать немного лень, равно как и транслятор писать, если такого еще нет :)...


 
Игорь Шевченко ©   (2004-09-14 09:23) [130]


> Относительно преимуществ, полагаю, что имелось ввиду отсутсвие
> описаний тех самых NativeAPI, различных структур и прочих
> вещей из DDK


Их как раз есть - и в Jedi и у отдельных энтузиастов


 
Vlad Oshin ©   (2004-09-14 11:53) [131]

спасибо


 
noname ©   (2004-09-14 12:09) [132]

Я сейчас как раз пишу конвертер C-типов в Delphi.


 
Игорь Шевченко ©   (2004-09-14 12:48) [133]

noname ©   (14.09.04 12:09) [132]

В Jedi есть headconv.exe
Там же, заодно, куча всего отконвертированого.

http://www.delphi-jedi.org


 
noname ©   (2004-09-14 15:49) [134]

Видел. Но всё-таки интересно написать свой конвертер.


 
kaZaNoVa ©   (2004-09-16 19:59) [135]

noname ©   (13.09.04 12:44) [128]
а как из драйвера например прочитать файл ?
Read - не пойдёт ?


 
cerber1   (2004-09-17 23:08) [136]

Может не в тему, но у меня, на Д5,
RtlEnterCriticalSection
отсутсвует, есть только
EnterCriticalSection. Что делать?


 
kaZaNoVa ©   (2004-09-23 18:50) [137]

http://delphimaster.net/view/4-1095880863/
людям интересно )))))


 
noname ©   (2004-09-23 19:02) [138]

kaZaNoVa ©   (16.09.04 19:59) [135]
Используй NativeAPI, пред этом прочитав пару книжек.
cerber1: RtlEnterCriticalSection - нет объявленна ни в одном стандартном юните Делфи.
Сам объявляй. Ищи прототип функции.


 
kaZaNoVa ©   (2004-09-23 19:07) [139]

noname ©   (23.09.04 19:02) [138]
ок, буду понемногу книги читать .. :))
- какие порекомендуешь ?


 
cerber1   (2004-09-23 23:03) [140]

2 noname ©   (23.09.04 19:02) [138]

уже нашел...


 
Fakir_SUPER_Proframmer   (2004-10-03 20:29) [141]

ну, дык, где сам код перехвата нужной функции ???


 
n0name   (2004-10-04 10:12) [142]

Про NativeAPI:
Свен Шрайбер "Недокументированные возможности Windows 2000"
Гарри Неббет
Baker Jerry Lozano "The Windows 2000 Device Driver Book, A Guide for Programmers, Second Edition Art"
Oney, Walter "Programming the Microsoft Windows Driver Model"
Руссиновича с Соломоном, Пиетрека


 
kaZaNoVa ©   (2004-10-07 22:24) [143]

n0name   (04.10.04 10:12) [142]
а Архангельский рулит ?


 
kaZaNoVa ©   (2004-10-10 15:46) [144]

Fakir_SUPER_Proframmer   (03.10.04 20:29) [141]
а что тебе нужно ?
-код - в этой "бессмертной" ветке :))


 
kaZaNoVa ©   (2004-10-14 01:09) [145]

n0name   (04.10.04 10:12) [142]
;))


 
kaZaNoVa ©   (2004-10-14 01:10) [146]

у меня идея, может всю информацию этй ветки собрать и оформить ввиде статьи ???


 
Игорь Шевченко ©   (2004-10-14 10:48) [147]

kaZaNoVa ©   (14.10.04 01:10) [146]

На xakep.ru - там таких любят. И завязывай с offtopic"ом


 
kaZaNoVa ©   (2004-10-19 18:51) [148]

Удалено модератором
Примечание: Offtopic



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

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

Наверх




Память: 0.9 MB
Время: 0.031 c
3-1099389815
kgb
2004-11-02 13:03
2004.11.28
Как построить запрос


14-1100150947
novice_man
2004-11-11 08:29
2004.11.28
Destroy or Free


1-1100625546
Neiron
2004-11-16 20:19
2004.11.28
VB to Delphi


3-1098267203
GanibalLector
2004-10-20 14:13
2004.11.28
решение проблемы обрыва коннекта в IBX


9-1090983230
SwitchBlade
2004-07-28 06:53
2004.11.28
Как сделать так, чтобы башня танка была направлена на курсор