Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 1.09 MB
Время: 0.033 c
3-1098803484
clickmaker
2004-10-26 19:11
2004.11.28
MS SQL, LPC &amp; TCP/IP


6-1095776242
Лев Ландау
2004-09-21 18:17
2004.11.28
}|{ажда знаний ( IdHTTP or IdTCPClient )


14-1099934556
Drakon
2004-11-08 20:22
2004.11.28
EULA


1-1100452965
dolphin
2004-11-14 20:22
2004.11.28
список имен файлов и папок


6-1095362341
Лев Ландау
2004-09-16 23:19
2004.11.28
Как зателнетить асю?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский