Текущий архив: 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;
Память: 1.09 MB
Время: 0.042 c